El programa del grup 1 té present la posició del potenciòmetre per escollir entre dos modes de funcionament. En un dels modes, quan es prem el polsador mostra una seqüència als nou LED i després presenta el número que ha triat aleatòriament. En l'altre mode, la seqüencia dura més i va acompanyada d'una melodia. La melodia triada és una part de la canço "La Cucaracha".
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 MostraMida ; Mostra de la mida n1 ; Variable que es guarda el número aleatori n2 ; Variable per quan el número aleatori sigui '10000000','01000000' o '00000000' V1 ; Variable per la seqüència lluminosa V3 ; Variable per la seqüència lluminosa V5 ; Variable per la seqüència lluminosa V7 ; Variable per la seqüència lluminosa V9 ; Variable per la seqüència lluminosa Retard1 ; Variable per retardar Retard2 ; Variable per retardar ValPR2 ; Aquí hi guardarem el valor de PR2 ValCCPR1L ; Aquí hi guardarem el valor de CCPR1L ValDC1B ; Aquí hi guardarem el valor de DC1B ValCCP1CON ; Aquí hi guardarem el valor de CCP1CON Llargada endc
org 0 Inici ; comentaris OK movlw b'11111111' movwf Retard1 movwf Retard2 call RetM call RetM ; Retards necessaris perquè sinó no espera al Bucle4 fins ; que apretem el polsador 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 bsf STATUS,RP0 ; Tria el banc 1 clrf TRISC ; Posa tots els bits del port C com a sortida clrf TRISB ; Posa tots els bits del port B com a sortida bcf STATUS,RP0 ; Tria el banc 0 movlw b'01000000' ; posa el numero binari '01000000' a l'acumulador movwf V7 ; i ho posa a la variable V7 movlw b'10010000' ; posa el numero binari '10010000' a l'acumulador movwf V1 ; i ho posa a la variable V1 movlw b'01010000' ; posa el numero binari '01010000' a l'acumulador movwf V9 ; i ho posa a la variable V9 movlw b'10000000' ; posa el numero binari '10000000' a l'acumulador movwf V3 ; i ho posa a la variable V3 movlw b'00100000' ; posa el numero binari '00100000' a l'acumulador movwf V5 ; i ho posa a la variable V5 movwf n1 ; a la variable n1 movwf n2 ; i a la variable n2 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 movlw b'00010000' ; Posa el conversor a 1/8 de la freqüència movwf ADCON1 ; Copia W a la configuració del conversor A/D bcf STATUS,RP0 bsf STATUS,RP1 ; Tria el banc 2 movlw 0xFF ; Posa l'acumulador a FFh (tot uns) movwf ANSEL ; Configura AN0-AN7 com entrades analògiques 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 Bucle4 ; Bucle que s'utilitza quan encara no ha sortit cap número clrf PORTC ; posa tots els bits del PORTC a 0 clrf PORTB ; posa tots els bits del PORTB a 0 rrf n1,f ; Fa rodar els bits de la variable n1 cap a la dreta, ; el bit de la dreta passa al bit de l'arrossegament ; i el de l'arrossegament passa al bit de l'esquerra btfsc PORTA,3 ; si el polsador no està pitjat fa la següent, ; sino es salta una instrucció goto Bucle4 goto Bucle ; torna a Bucle4 fins que no es pitja el polsador. ; Quan es pitja va a Seq Bucle ; Bucle que decideix si la seqüencia es farà amb música o sense. 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 swapf ADRESH,w ; Permuta els nibbles dels bits superiors btfsc ADRESH,7 goto Seq1 ; si el Bit 7 està activat fa la seqüencia amb música. ; Si no ho està la fa sense música goto Seq2 numero1 ; Bucle que ensenya el número 1 als LED grocs rrf n1,f ; Fa rodar els bits de la variable n1 cap a la dreta, ; el bit de la dreta passa al bit de l'arrossegament ; i el de l'arrossegament passa al bit de l'esquerra clrf PORTC ; posa tots els bits del PORTC a 0 movlw b'00100000' ; posa el numero binari '00100000' a l'acumulador movwf PORTB ; i ho posa al port B btfsc PORTA,3 ; si el polsador no està pitjat fa la següent, ; sino es salta una instrucció goto numero1 goto Bucle ; torna a numero1 fins que no es pitja el polsador. ; Quan es pitja va a Seq numero2 ; Bucle que ensenya el número 2 als LED grocs rrf n1,f ; Fa rodar els bits de la variable n1 cap a la dreta, ; el bit de la dreta passa al bit de l'arrossegament ; i el de l'arrossegament passa al bit de l'esquerra clrf PORTC ; posa tots els bits del PORTC a 0 movlw b'00010000' ; posa el numero binari '00010000' a l'acumulador movwf PORTB ; i ho posa al port B btfsc PORTA,3 ; si el polsador no està pitjat fa la següent, ; sino es salta una instrucció goto numero2 goto Bucle ; torna a numero2 fins que no es pitja el polsador. ; Quan es pitja va a Seq numero3 ; Bucle que ensenya el número 3 als LED grocs rrf n1,f ; Fa rodar els bits de la variable n1 cap a la dreta, ; el bit de la dreta passa al bit de l'arrossegament ; i el de l'arrossegament passa al bit de l'esquerra clrf PORTC ; posa tots els bits del PORTC a 0 movlw b'00110000' ; posa el numero binari '00110000' a l'acumulador movwf PORTB ; i ho posa al port B btfsc PORTA,3 ; si el polsador no està pitjat fa la següent, ; sino es salta una instrucció goto numero3 goto Bucle ; torna a numero3 fins que no es pitja el polsador. ; Quan es pitja va a Seq numero4 ; Bucle que ensenya el número4 als LED grocs rrf n1,f ; Fa rodar els bits de la variable n1 cap a la dreta, ; el bit de la dreta passa al bit de l'arrossegament ; i el de l'arrossegament passa al bit de l'esquerra clrf PORTC ; posa tots els bits del PORTC a 0 movlw b'00010000' ; posa el numero binari '00010000' a l'acumulador movwf PORTB ; i ho posa al port B nop ; El posem perquè tots els LED tinguin la mateixa intensitat nop ; El posem perquè tots els LED tinguin la mateixa intensitat nop ; El posem perquè tots els LED tinguin la mateixa intensitat nop ; El posem perquè tots els LED tinguin la mateixa intensitat movlw b'11000000' ; posa el número binari '11000000' a l'acumulador movwf PORTB ; i ho posa al port B btfsc PORTA,3 ; si el polsador no està pitjat fa la següent, ; sino es salta una instrucció goto numero4 goto Bucle ; torna a numero4 fins que no es pitja el polsador. ; Quan es pitja va a Seq numero5 ; Bucle que ensenya el número5 als LED grocs rrf n1,f ; Fa rodar els bits de la variable n1 cap a la dreta, ; el bit de la dreta passa al bit de l'arrossegament ; i el de l'arrossegament passa al bit de l'esquerra clrf PORTC ; posa tots els bits del PORTC a 0 movlw b'00110000' ; posa el numero binari '00110000' a l'acumulador movwf PORTB ; i ho posa al port B nop ; El posem perquè tots els LED tinguin la mateixa intensitat nop ; El posem perquè tots els LED tinguin la mateixa intensitat nop ; El posem perquè tots els LED tinguin la mateixa intensitat nop ; El posem perquè tots els LED tinguin la mateixa intensitat movlw b'11000000' ; posa el numero binari '11000000' a l'acumulador movwf PORTB ; i ho posa al port B btfsc PORTA,3 ; si el polsador no està pitjat fa la següent, ; sino es salta una instrucció goto numero5 goto Bucle ; torna a numero5 fins que no es pitja el polsador. ; Quan es pitja va a Seq numero6 ; Bucle que ensenya el número6 als LED grocs rrf n1,f ; Fa rodar els bits de la variable n1 cap a la dreta, ; el bit de la dreta passa al bit de l'arrossegament ; i el de l'arrossegament passa al bit de l'esquerra clrf PORTC ; posa tots els bits del PORTC a 0 movlw b'00010000' ; posa el numero binari '00010000' a l'acumulador movwf PORTB ; i ho posa al port B nop ; El posem perquè tots els LED tinguin la mateixa intensitat nop ; El posem perquè tots els LED tinguin la mateixa intensitat nop ; El posem perquè tots els LED tinguin la mateixa intensitat nop ; El posem perquè tots els LED tinguin la mateixa intensitat nop ; El posem perquè tots els LED tinguin la mateixa intensitat movlw b'11000000' ; posa el numero binari '11000000' a l'acumulador movwf PORTC ; ho posa al port C movwf PORTB ; i també al port B btfsc PORTA,3 ; si el polsador no està pitjat fa la següent, ; sino es salta una instrucció goto numero6 goto Bucle ; torna a numero6 fins que no es pitja el polsador. ; Quan es pitja va a Seq Bucle2 ; Bucle que ens envia al número corresponent. ; Si hi ha activats els bits 6,7 o d'arrossegament va al Bucle3. clrf PORTB ; posa tots els bits del PORTB a 0 btfsc n1,0 ; si el bit 0 de la variable n1 està activat s'encen el número 1 goto numero1 btfsc n1,1 ; si el bit 1 de la variable n1 està activat s'encen el número 2 goto numero2 btfsc n1,2 ; si el bit 2 de la variable n1 està activat s'encen el número 3 goto numero3 btfsc n1,3 ; si el bit 3 de la variable n1 està activat s'encen el número 4 goto numero4 btfsc n1,4 ; si el bit 4 de la variable n1 està activat s'encen el número 5 goto numero5 btfsc n1,5 ; si el bit 5 de la variable n1 està activat s'encen el número 6 goto numero6 goto Bucle3 ; va a Bucle3 Bucle3 ; Bucle en cas que la variable n1 tingui els bits 6,7 ; o d'arrossegament activats. rrf n2,f ; Fa rodar els bits de la variable n2 cap a la dreta, ; el bit de la dreta passa al bit de l'arrossegament ; i el de l'arrossegament passa al bit de l'esquerra btfsc n2,0 ; si el bit 0 de la variable n2 està activat s'encen el número 1 goto numero1 btfsc n2,1 ; si el bit 1 de la variable n2 està activat s'encen el número 2 goto numero2 btfsc n2,2 ; si el bit 2 de la variable n2 està activat s'encen el número 3 goto numero3 btfsc n2,3 ; si el bit 3 de la variable n2 està activat s'encen el número 4 goto numero4 btfsc n2,4 ; si el bit 4 de la variable n2 està activat s'encen el número 5 goto numero5 btfsc n2,5 ; si el bit 5 de la variable n2 està activat s'encen el número 6 goto numero6 goto Bucle3 ; va a Bucle3 Seq1 ; Seqüència amb la melodia de 'la cucaracha'. ; Toca el principi i el final de la cançó. clrf PORTB clrf PORTC movf V1,w ; posa el valor de la variable V1 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB movlw .238 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .109 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00000001' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada clrf PORTB ; posa tots els bits del PORTB a 0 movf V9,w ; posa el valor de la variable V9 a l'acumulador movwf PORTC ; posa el valor de l'acumulador al PORTC movlw .238 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .109 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00000001' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada clrf PORTC ; posa tots els bits del PORTC a 0 movf V3,w ; posa el valor de la variable V3 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB movlw .238 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .109 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00000001' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada movf V5,w ; posa el valor de la variable V5 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB movlw .178 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .89 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00000011' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada movf V7,w ; posa el valor de la variable V7 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB movlw .141 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .71 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .0 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00000001' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada clrf PORTB ; posa tots els bits del PORTB a 0 movf V1,w ; posa el valor de la variable V1 a l'acumulador movwf PORTC ; posa el valor de l'acumulador al PORTC movlw .238 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .109 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00000001' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada clrf PORTC ; posa tots els bits del PORTC a 0 movf V9,w ; posa el valor de la variable V9 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB movlw .238 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .109 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movf V5,w ; posa el valor de la variable V5 a l'acumulador movlw b'00000001' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada movwf PORTB ; posa el valor de l'acumulador al PORTB movf V1,w ; posa el valor de la variable V1 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB movlw .238 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .109 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00000001' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada clrf PORTB ; posa tots els bits del PORTB a 0 movf V9,w ; posa el valor de la variable V9 a l'acumulador movwf PORTC ; posa el valor de l'acumulador al PORTC movlw .178 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .89 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00000011' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada clrf PORTC ; posa tots els bits del PORTC a 0 movf V3,w ; posa el valor de la variable V3 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB movlw .141 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .71 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .0 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00001111' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada movf V5,w ; posa el valor de la variable V5 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB movlw .178 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .89 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00000011' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada movf V7,w ; posa el valor de la variable V7 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB movlw .178 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .89 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00000001' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada clrf PORTB ; posa tots els bits del PORTB a 0 movf V1,w ; posa el valor de la variable V1 a l'acumulador movwf PORTC ; posa el valor de l'acumulador al PORTC movlw .189 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .95 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .0 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00000001' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada clrf PORTC ; posa tots els bits del PORTC a 0 movf V9,w ; posa el valor de la variable V9 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB movlw .189 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .95 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .0 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00000001' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada movf V5,w ; posa el valor de la variable V5 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB movlw .212 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .106 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00000001' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada movf V1,w ; posa el valor de la variable V1 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB movlw .212 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .106 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00000001' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada clrf PORTB ; posa tots els bits del PORTB a 0 movf V9,w ; posa el valor de la variable V9 a l'acumulador movwf PORTC ; posa el valor de l'acumulador al PORTC movlw .238 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .109 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00001111' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada clrf PORTC ; posa tots els bits del PORTC a 0 movf V3,w ; posa el valor de la variable V3 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB movlw .118 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .59 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00000001' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada movf V5,w ; posa el valor de la variable V5 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB movlw .133 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .67 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .0 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00000001' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada movf V7,w ; posa el valor de la variable V7 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB movlw .141 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .71 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .0 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00000001' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada clrf PORTB ; posa tots els bits del PORTB a 0 movf V1,w ; posa el valor de la variable V1 a l'acumulador movwf PORTC ; posa el valor de l'acumulador al PORTC movlw .158 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .79 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00000001' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada clrf PORTC ; posa tots els bits del PORTC a 0 movf V9,w ; posa el valor de la variable V9 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB movlw .178 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .89 ; Valor que correspon a un cicle del 50 % movwf ValCCPR1L ; Valor de CCPR1L movlw .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B movlw b'00001111' ; configurar la llargada de la nota movwf Llargada call nota ; toca la nota configurada movf V5,w ; posa el valor de la variable V5 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB goto Bucle2 ; Va al Bucle2 Seq2 ; Fa la seqüència sense música i més curta. ; Pot servir si ens cansem de la música o si hi ha molta tensió. clrf PORTC clrf PORTB movf V1,w ; posa el valor de la variable V1 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB call RetM ; crida el Retard clrf PORTB ; posa tots els bits del PORTB a 0 movf V9,w ; posa el valor de la variable V9 a l'acumulador movwf PORTC ; posa el valor de l'acumulador al PORTC call RetM ; crida el Retard clrf PORTC ; posa tots els bits del PORTC a 0 movf V3,w ; posa el valor de la variable V3 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB call RetM ; crida el Retard movf V5,w ; posa el valor de la variable V5 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB call RetM ; crida el Retard movf V7,w ; posa el valor de la variable V7 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB call RetM ; crida el Retard clrf PORTB ; posa tots els bits del PORTB a 0 movf V1,w ; posa el valor de la variable V1 a l'acumulador movwf PORTC ; posa el valor de l'acumulador al PORTC call RetM ; crida el Retard clrf PORTC ; posa tots els bits del PORTC a 0 movf V9,w ; posa el valor de la variable V9 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB call RetM ; crida el Retard movf V5,w ; posa el valor de la variable V5 a l'acumulador movwf PORTB ; posa el valor de l'acumulador al PORTB call RetM ; crida el Retard goto Bucle2 ; Va al Bucle2
nota ; Toca la nota configurada movlw b'00100000' ; Definim el tempo movwf Retard1 movwf Retard2 movf ValPR2,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 ValDC1B,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 ValCCPR1L,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 btfss PIR1,TMR2IF ; Espera l'activació del bit d'interrupció del Timer 2 goto $-1 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 btfsc Llargada,0 ; si el bit 0 de la variable n1 està activat s'encen el número 1 call RetM ; Espera btfsc Llargada,1 ; si el bit 1 de la variable n1 està activat s'encen el número 2 call RetM ; Espera btfsc Llargada,2 ; si el bit 2 de la variable n1 està activat s'encen el número 3 call RetM ; Espera btfsc Llargada,3 ; si el bit 3 de la variable n1 està activat s'encen el número 4 call RetM ; Espera bsf STATUS,RP0 ; Tria el banc 1 bsf TRISC,5 ; Posem RC5 (sortida del PWM) com a entrada ; Fem silenci bcf STATUS,RP0 ; Tria el banc 0 call RetM ; Espera return RetM ; Funció de retard decfsz Retard1,f goto RetM decfsz Retard2,f goto RetM return end

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