Quan es prem el polsador, el programa del grup 4 fa una seqüència de LED mentre sona una melodia. Quan acaba la seqüència de LED, toca uns tons addicionals amb els LED apagats i, finalment, mostra el número aleatori. El sistema incorpora dues melodies diferents i amb el potenciòmetre es pot triar quina de les dues ha de sonar.
El programa d'aquest grup és el següent:
#include <p16F690.inc> __config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
cblock 0x20 Visualit ; Una variable on guardem el que mostraran els LED Polsador Numero PortbB PortcC m ;retard per al bucle amb intermitencia n g l Retard1 ; Variables de retard Retard2 Intermitent1 ; variables d'intermitencia Intermitent2 Retard4 Retard3 FreqNota ; Aquí hi guardarem el valor de PR2 LongCicle ; Aquí hi guardarem el valor de CCPR1L Bitspes ; Aquí hi guardarem el valor de DC1B ValCCP1CON ; Aquí hi guardarem el valor de CCP1CON Durada endc
org 0 Inici bcf PORTC,0 bcf PORTC,1 bcf PORTC,2 bcf PORTC,3 bsf STATUS,RP0 ; Tria el banc 1 movlw b'00100000' ; Desactivem brunzidor movwf TRISC ; Posa tots els bits del port C com a sortida bcf STATUS,RP0 ; Tria el banc 0 btfsc PORTA,3 ; Mira si està desactivada l'entrada A3 goto $-1 Bucle Inicii bsf STATUS,RP0 ; Tria el banc 1 movlw 0xFF ; Posa l'acumulador a FFh (tot uns) movwf TRISA ; Posa tots els bits del port A com a entrada clrf TRISC ; Posa tots els bits del port C com a sortida movlw b'00010000' movwf ADCON1 ; Posa el conversor a 1/8 de la freqüència bcf STATUS,RP0 bsf STATUS,RP1 ; Tria el banc 2 movlw b'00000001' movwf ANSEL ; Posa AN0 com entrada analògica bcf STATUS,RP0 bcf STATUS,RP1 ; Tria el banc 0 movlw b'00000001' ; activa el conversor A/D connectat a AN0 movwf ADCON0 ; amb el resultat justificat per l'esquerra Num call tornemasis Num2 decf Numero,f movf Numero,w xorlw b'00000000' btfsc STATUS,Z call tornemasis btfss PORTA,3 ; Mira si està desactivada l'entrada A3 goto Num2 Comparacions bsf ADCON0,GO ; Inicia la conversió btfsc ADCON0,GO ; Quan el bit sigui 0 la conversió haurà acabat goto $-1 ; repetim la línia fins que deixi de ser 1 movf ADRESH,w ; Copia els bits superiors a l'acumulador subwf .5,w ; W = variable - W btfsc STATUS,C ; C = 1 si variable >= W goto Animacio1 ; variable > W subwf .15,w ; W = variable - W btfss STATUS,C ; C = 1 si variable >= W goto Animacio2 ; variable > W goto Animacio3 Inicianimacio Animacio1 movlw .50 movwf l bsf STATUS,RP0 ; Tria el banc 1 clrf TRISB clrf TRISC bcf STATUS,RP0 ; Tria el banc 0 movlw b'00000000' movwf PORTB movwf PORTC call RetM movlw b'01000000' movwf PORTB ; primera animació activada call Sol movlw .2 movwf Durada call Iniciso ; Toca la nota configurada call Temps bcf T2CON,TMR2ON call Blanca movlw b'01000000' movwf PORTC ; s'activa la segona animacio call Iniciso call Temps bcf T2CON,TMR2ON call Negra call Fa movlw b'01000000' movwf Intermitent1 ; Intermitent1='01000000' movlw b'10010000' movwf Intermitent2 ; Intermitent2='10010000' movlw .6 movwf g call TocaNota call AnimaciointermitentB bcf T2CON,TMR2ON call Corxera call Sol movlw b'00000000' movwf PORTC movlw b'01000000' movwf Intermitent1 movlw b'01010000' movwf Intermitent2 ; Intermitent2='10010000' movlw .6 movwf g call TocaNota call AnimaciointermitentC bcf T2CON,TMR2ON call Blanca call Blanca call Sol movlw .9 ; negra movwf g movlw b'10010000' movwf Intermitent1 movlw b'10000000' movwf Intermitent2 call TocaNota call AnimaciointermitentB bcf T2CON,TMR2ON call Negra call Fa movlw .6 ; per a que passin 0.4 movwf g movlw b'01010000' movwf Intermitent1 movlw b'10000000' movwf Intermitent2 call TocaNota call AnimaciointermitentC bcf T2CON,TMR2ON call Corxera call Sol movlw .9 ; per a que passin 0.4 movwf g movlw b'10000000' movwf Intermitent1 movlw b'01010000' movwf Intermitent2 call TocaNota call AnimaciointermitentB bcf T2CON,TMR2ON call Blanca call Blanca call Sol movlw .9 ; per a que passin 0.4 movwf g movlw b'10000000' movwf Intermitent1 movlw b'10010000' movwf Intermitent2 call TocaNota call AnimaciointermitentC bcf T2CON,TMR2ON call Negra call Fa movlw .9 ; per a que passin 0.4 movwf g movlw b'01010000' movwf Intermitent1 movlw b'01000000' movwf Intermitent2 call TocaNota call AnimaciointermitentB bcf T2CON,TMR2ON call Negra movlw b'00000000' movwf PORTC movwf PORTB call Mibemoll movlw .3 movwf Durada call TocaNota call Temps bcf T2CON,TMR2ON goto Mostrem Animacio2 movlw .50 movwf l bsf STATUS,RP0 ; Tria el banc 1 clrf TRISB clrf TRISC bcf STATUS,RP0 ; Tria el banc 0 movlw b'00000000' movwf PORTB movwf PORTC call RetM call Do movlw .2 movwf Durada call Iniciso call Temps bcf T2CON,TMR2ON movlw b'01000000' movwf PORTB ; primera animació activada call Re movlw .2 movwf Durada call Iniciso ; Toca la nota configurada call Temps bcf T2CON,TMR2ON movlw b'01000000' movwf PORTC ; s'activa la segona animacio call Mi movlw .3 movwf Durada call Iniciso call Temps bcf T2CON,TMR2ON call Re movlw b'01000000' movwf Intermitent1 ; Intermitent1='01000000' movlw b'10010000' movwf Intermitent2 ; Intermitent2='10010000' movlw .3 movwf g call TocaNota call AnimaciointermitentB bcf T2CON,TMR2ON call Mi movlw .6 movwf Durada movlw b'00000000' movwf PORTC movlw b'01000000' movwf Intermitent1 movlw b'01010000' movwf Intermitent2 ; Intermitent2='10010000' movlw .3 movwf g call TocaNota call AnimaciointermitentC bcf T2CON,TMR2ON call Fa movlw .6 ; negra movwf g movlw b'10010000' movwf Intermitent1 movlw b'10000000' movwf Intermitent2 call TocaNota call AnimaciointermitentB bcf T2CON,TMR2ON call Mi movlw .6 movwf Durada movlw .3 ; per a que passin 0.4 movwf g movlw b'01010000' movwf Intermitent1 movlw b'10000000' movwf Intermitent2 call TocaNota call AnimaciointermitentC bcf T2CON,TMR2ON call Fa movlw .6 movwf Durada movlw .3 ; per a que passin 0.4 movwf g movlw b'10000000' movwf Intermitent1 movlw b'01010000' movwf Intermitent2 call TocaNota call AnimaciointermitentB bcf T2CON,TMR2ON call Sol movlw .6 movwf Durada movlw .6 ; per a que passin 0.4 movwf g movlw b'10000000' movwf Intermitent1 movlw b'10010000' movwf Intermitent2 call TocaNota call AnimaciointermitentC bcf T2CON,TMR2ON call Sol movlw .3 ; per a que passin 0.4 movwf g movlw b'01010000' movwf Intermitent1 movlw b'01000000' movwf Intermitent2 call TocaNota call AnimaciointermitentB bcf T2CON,TMR2ON movlw b'10010000' movwf PORTC movlw .2 movwf Durada call Sol call TocaNota call Temps bcf T2CON,TMR2ON movlw b'01000000' movwf PORTB call La call TocaNota call Temps bcf T2CON,TMR2ON movlw b'00000000' movwf PORTC call TocaNota call Temps bcf T2CON,TMR2ON movlw b'00000000' movwf PORTB movlw .5 movwf Durada call Re call TocaNota call Temps bcf T2CON,TMR2ON goto Mostrem Animacio3 movlw .50 movwf l bsf STATUS,RP0 ; Tria el banc 1 clrf TRISB clrf TRISC bcf STATUS,RP0 ; Tria el banc 0 movlw b'00000000' movwf PORTB movwf PORTC call RetM movlw b'01000000' movwf PORTB ; primera animació activada call La movlw .2 movwf Durada call Iniciso ; Toca la nota configurada call Temps bcf T2CON,TMR2ON call Negra movlw b'01000000' movwf PORTC ; s'activa la segona animacio call Iniciso call Temps bcf T2CON,TMR2ON call Negra movlw b'01000000' movwf Intermitent1 ; Intermitent1='01000000' movlw b'10010000' movwf Intermitent2 ; Intermitent2='10010000' movlw .12 movwf g call TocaNota call AnimaciointermitentB bcf T2CON,TMR2ON call Negra movlw b'00000000' movwf PORTC movlw b'01000000' movwf Intermitent1 movlw b'01010000' movwf Intermitent2 ; Intermitent2='10010000' movlw .9 movwf g call TocaNota call AnimaciointermitentC bcf T2CON,TMR2ON call Corxera call Si movlw .3 ;negra movwf g movlw b'10010000' movwf Intermitent1 movlw b'10000000' movwf Intermitent2 call TocaNota call AnimaciointermitentB bcf T2CON,TMR2ON call Negra call Mi movlw .9 ; per a que passin 0.4 movwf g movlw b'01010000' movwf Intermitent1 movlw b'10000000' movwf Intermitent2 call TocaNota call AnimaciointermitentC bcf T2CON,TMR2ON call Corxera movlw .3 ; per a que passin 0.4 movwf g movlw b'10000000' movwf Intermitent1 movlw b'01010000' movwf Intermitent2 call TocaNota call AnimaciointermitentB bcf T2CON,TMR2ON call Negra movlw .9 ; per a que passin 0.4 movwf g movlw b'10000000' movwf Intermitent1 movlw b'10010000' movwf Intermitent2 call TocaNota call AnimaciointermitentC bcf T2CON,TMR2ON call Corxera movlw .3 ; per a que passin 0.4 movwf g movlw b'01010000' movwf Intermitent1 movlw b'01000000' movwf Intermitent2 call TocaNota call AnimaciointermitentB bcf T2CON,TMR2ON call Negra movlw b'00000000' movwf PORTC movwf PORTB movlw .3 movwf Durada call TocaNota call Temps bcf T2CON,TMR2ON Mostrem call RetM movlw .1 movwf Durada call Do call Iniciso call Temps call Mi call TocaNota call Temps call Sol call TocaNota call Temps call Doo call TocaNota call Temps call Do call TocaNota call Temps bcf T2CON,TMR2ON Bucle2 bsf STATUS,RP0 ; Tria el banc 1 clrf TRISB clrf TRISC bcf STATUS,RP0 ; Tria el banc 0 movlw b'00000000' movwf PORTB movwf PORTC ; NUM 1 movf Numero,w xorlw .1 btfsc STATUS,Z goto Valor1 ; NUM2 movf Numero,w xorlw .2 btfsc STATUS,Z goto Valor2 ; NUM3 movf Numero,w xorlw .3 btfsc STATUS,Z goto Valor3 ; NUM4 movf Numero,w xorlw .4 btfsc STATUS,Z goto Valor4 ; NUM5 movf Numero,w xorlw .5 btfsc STATUS,Z goto Valor5 ; NUM6 movf Numero,w xorlw .6 btfsc STATUS,Z goto Valor6 Valor1 bcf PORTC,5 movlw b'00100000' movwf PORTB btfsc PORTA,3 ; Mira si està desactivada l'entrada A3 goto $-1 goto Num2 Valor2 bcf PORTC,5 movlw b'11000000' movwf PORTB btfsc PORTA,3 ; Mira si està desactivada l'entrada A3 goto $-1 goto Num2 Valor3 bcf PORTC,5 movlw b'11100000' movwf PORTB btfsc PORTA,3 ; Mira si està desactivada l'entrada A3 goto $-1 goto Num2 Valor4 bcf PORTC,5 bsf STATUS,RP0 ; Tria el banc 1 clrf TRISB bcf STATUS,RP0 ; Tria el banc 0 Bucle4 movlw b'11000000' call RetB movlw b'00010000' movwf PORTB call RetB movlw b'00000000' movwf PORTB movwf PORTC btfsc PORTA,3 ; Mira si està desactivada l'entrada A3 goto Bucle4 goto Num2 Valor5 bcf PORTC,5 bsf STATUS,RP0 ; Tria el banc 1 clrf TRISB bcf STATUS,RP0 ; Tria el banc 0 Bucle5 movlw b'11100000' movwf PORTB call RetB movlw b'00010000' movwf PORTB call RetB movlw b'00000000' movwf PORTB movwf PORTC btfsc PORTA,3 ; Mira si està desactivada l'entrada A3 goto Bucle5 goto Num2 Valor6 bcf PORTC,5 bsf STATUS,RP0 ; Tria el banc 1 clrf TRISB clrf TRISC bcf STATUS,RP0 ; Tria el banc 0 movlw b'00000000' movwf PORTC Bucle6 movlw b'01000000' movwf PORTB nop movlw b'10010000' movwf PORTB movwf PORTC nop movlw b'01010000' movwf PORTC movwf PORTB nop movlw b'10000000' movwf PORTB nop movlw b'00000000' movwf PORTB movwf PORTC btfsc PORTA,3 ; Mira si està desactivada l'entrada A3 goto Bucle6 goto Num2
AnimaciointermitentB ; Animació intermitent en el PORTB movf Intermitent1,w movwf PORTB call Retus movf Intermitent2,w movwf PORTB call Retus decfsz l,f goto AnimaciointermitentB movlw .50 movwf l decfsz g,f goto AnimaciointermitentB return AnimaciointermitentC ; Animació intermitent en el PORTC movf Intermitent1,w movwf PORTC call Retus movf Intermitent2,w movwf PORTC call Retus decfsz l,f goto AnimaciointermitentC movlw .50 movwf l decfsz g,f goto AnimaciointermitentC return tornemasis ;funció que retorna la variable Numero a 6 cada vegada que arriba a 0 movlw .6 movwf Numero return Iniciso bsf STATUS,RP0 ; Tria el banc 1 movlw b'00100000' ; Definim com volem les E/S del port C movwf TRISC ; RC5 (sortida del PWM) com a entrada bcf STATUS,RP0 ; Tria el banc 0 movlw b'00001100' ; Configura el PWM, bits P1M (bits 7-6) a 00 mode senzill ; DC1B = 00 (bits 5-4) els dos bits de menys pes són 0 ; CCP1M = 11xx en mode senzill els bit 0 i 1 no afecten movwf ValCCP1CON ; Ho guarda per fer-ho servir més tard movwf CCP1CON ; Ho posa com a configuració del PWM movlw b'00000011' ; Configura el Timer 2 ; bits T2KCPS (bits 1-0) a 11 prescalat de 16 ; bit 2 (TMR2ON) a 0, Timer aturat ; Postscaler TOUTPS (bits 6-3) no afecten al PWM movwf T2CON ; Ho posa com a configuració del Timer 2 TocaNota movf FreqNota,w ; Valor de PR2 per a la nota desitjada bsf STATUS,RP0 ; Tria el banc 1 bsf TRISC,5 ; Posem RC5 (sortida del PWM) com a entrada movwf PR2 ; Ho posem com a comparació al Timer 2 bcf STATUS,RP0 ; Tria el banc 0 movf ValCCP1CON,w ; Agafa la configuració de CCP1CON andlw b'11001111' ; Posa els bits que corresponen a DC1B a zero per precaució movwf ValCCP1CON ; I ho torna a guardar swapf Bitspes,w ; Agafa el valor que ha d'anar a DC1B ; I el guarda, permutat, a W ; Els dos bits han de quedar a les posicions 4-5 andlw b'00110000' ; Posa els altres sis bits a zero per precaució iorwf ValCCP1CON,w ; I ho afegeix a CCP1CON movwf CCP1CON ; Ho posa com a configuració del PWM movf LongCicle,w ; Valor de CCPR1L movwf CCPR1L ; Registre que ens dona l'amplada de tON bcf PIR1,TMR2IF ; Desactiva el bit d'interrupció del Timer 2 bsf T2CON,TMR2ON ; Activa el Timer 2 ; No convé engegar el PWM fins que el Timer 2 no ha fet un cicle bsf STATUS,RP0 ; Tria el banc 1 bcf TRISC,5 ; Posem RC5 (sortida del PWM) com a sortida bcf STATUS,RP0 ; Tria el banc 0 bsf STATUS,RP0 ; Tria el banc 1 bcf STATUS,RP0 ; Tria el banc 0 return RetM ; Funció de retard de 0,2 s decfsz Retard1,f goto RetM decfsz Retard2,f goto RetM return RetB ; Retard de 5ms movlw .7 movwf n B1 decfsz m,f goto B1 decfsz n,f goto B1 return Retus ; Funció de retard de 3 us movwf Retard1 Bucleus decfsz Retard1,f goto Bucleus return RetA ; Funció de retard de 10 ms movwf Retard2 Buclems decfsz Retard1,f goto Buclems decfsz Retard2,f goto Buclems return Temps movlw high TempsVal ; Carrega la part alta de l'adreça movwf PCLATH ; Ho posa a la part alta de PC movlw low TempsVal ; Carrega la part baixa de l'adreça addwf Durada,w movwf PCL ; Modifica el valor de PCL TempsVal goto Semicorxera goto Corxera goto Negra goto Blanca goto Corxeraimitja goto BlancaNegra Do movlw .238 movwf FreqNota movlw .119 movwf LongCicle movlw .2 movwf Bitspes return Re movlw .212 movwf FreqNota movlw .106 movwf LongCicle movlw .2 movwf Bitspes return Mi movlw .189 movwf FreqNota movlw .95 movwf LongCicle movlw .0 movwf Bitspes return Fa movlw .178 movwf FreqNota movlw .89 movwf LongCicle movlw .2 movwf Bitspes return Sol movlw .158 movwf FreqNota movlw .79 movwf LongCicle movlw .2 movwf Bitspes return La movlw .141 movwf FreqNota movlw .71 movwf LongCicle movlw .0 movwf Bitspes return Si movlw .126 movwf FreqNota movlw .63 movwf LongCicle movlw .2 movwf Bitspes return Doo movlw .118 movwf FreqNota movlw .59 movwf LongCicle movlw .2 movwf Bitspes return Mibemoll movlw .200 movwf FreqNota movlw .100 movwf LongCicle movlw .2 movwf Bitspes return Semicorxera call RetB return Corxera call RetA return Negra call RetA call RetA return Blanca call RetA call RetA call RetA call RetA return Corxeraimitja call RetA call RetB return BlancaNegra call RetA call RetA call RetA call RetA call RetA call RetA return end

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.