El programa del grup 5 fa sonar una melodia mentre es mostra una seqüència de LED. Quan es prem el polsador, fa una melodia més curta i mostra el nombre aleatori. Aquest nombre roman visible fins que es prem el polsador que torna a activar la seqüència de LED i la melodia. El potenciòmetre permet variar la velocitat de la seqüència de LED i la melodia que l'acompanya.
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 Port Port0 Retard1 Retard2 Visualit ; Una variable per al comptador que canvia els LED 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 endc
org 0 Inici 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 TRISB ; Posa tots els bits del port C com a sortida clrf TRISC ; Limpia el TRISB movlw b'10000000' ; Configuració de Timer0 ; Com a temporitzador basat en rellotge ; 111 - Factor d'escala de 256 ; I resistències de pull-up desactivades (valor per defecte) movwf OPTION_REG ; Ho guarda al registre de configuració del Timer0 bcf STATUS,RP0 ; Tria el banc 0 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 clrf PORTC ; Desactiva les sortides del port C 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'0000001' ; 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 call Limpiar call Retard call Retard 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 movlw b'00001000' ; Activa el bit 3 movwf Visualit ; Ho copia sobre la variable Visualit Bucleinicio call Limpiar call Retard btfsc PORTA,3 ; Mira si està activada l'entrada A3 goto $-1 ; repetim la línia fins que es deixi el polsador goto Serpiente ; Repetim-ho... Serpiente call Retard call Bit1 call Lanegra call Potenciometre btfss PORTA,3 ; Mira si està activada l'entrada A3 goto Yoigo call Bit4 call Micor call Potenciometre btfss PORTA,3 ; Mira si està activada l'entrada A3 goto Yoigo call Bit7 call Facor call Potenciometre btfss PORTA,3 ; Mira si està activada l'entrada A3 goto Yoigo call Bit8 call Solnegra call Potenciometre btfss PORTA,3 ; Mira si està activada l'entrada A3 goto Yoigo call Bit5 call Facor call Potenciometre btfss PORTA,3 ; Mira si està activada l'entrada A3 goto Yoigo call Bit2 call Micor call Potenciometre btfss PORTA,3 ; Mira si està activada l'entrada A3 goto Yoigo call Bit3 call Renegra call Potenciometre btfss PORTA,3 ; Mira si està activada l'entrada A3 goto Yoigo call Bit6 call Recor call Potenciometre btfss PORTA,3 ; Mira si està activada l'entrada A3 goto Yoigo call Bit9 call Facor call Potenciometre btfss PORTA,3 ; Mira si està activada l'entrada A3 goto Yoigo call Bit1 call Lanegra call Potenciometre btfss PORTA,3 ; Mira si està activada l'entrada A3 goto Yoigo call Bit4 call Solcor call Potenciometre btfss PORTA,3 ; Mira si està activada l'entrada A3 goto Yoigo call Bit7 call Facor call Potenciometre btfss PORTA,3 ; Mira si està activada l'entrada A3 goto Yoigo call Bit8 call Minegra call Potenciometre btfss PORTA,3 ; Mira si està activada l'entrada A3 goto Yoigo call Bit5 call Micor call Potenciometre btfss PORTA,3 ; Mira si està activada l'entrada A3 goto Yoigo call Bit2 call Facor call Potenciometre btfss PORTA,3 ; Mira si està activada l'entrada A3 goto Yoigo call Bit3 call Solnegra call Potenciometre btfss PORTA,3 ; Mira si està activada l'entrada A3 goto Yoigo call Bit6 call Lanegra call Potenciometre btfss PORTA,3 ; Mira si està activada l'entrada A3 goto Yoigo call Bit9 call Fanegra call Potenciometre btfss PORTA,3 ; Mira si està activada l'entrada A3 goto Yoigo goto Serpiente
Potenciometre nop ; espera un microsegon nop ; espera un microsegon nop ; espera un microsegon nop ; espera un microsegon nop ; espera un microsegon, en total 5 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 0 movf ADRESH,w ; Copia els bits superiors a l'acumulador addlw 1 ; Li suma 1 i tenim la durada variable del cicle movwf Retard2 ; Ho copia a la variable Retard2 return Retard decfsz Retard1,f ; Decrementa la variable 1 ; si dona zero, no es fa la instrucció següent goto Retard ; Salta, excepte si el resultat ha estat zero decfsz Retard2,f ; Decrementa la variable 2 goto Retard ; Salta, excepte si el resultat ha estat zero return Bit1 movlw b'1000000' ; Copia Port a l'acumulador movwf PORTB ; I ho guarda al PORTB return Bit4 movlw b'10010000' ; Copia Port a l'acumulador movwf PORTC ; I ho guarda al PORTB return Bit7 movlw b'01010000' ; Copia Port a l'acumulador movwf PORTB ; I ho guarda al PORTB return Bit8 movlw b'10000000' ; Copia Port a l'acumulador movwf PORTC ; I ho guarda al PORTB return Bit5 movlw b'00100000' ; Copia Port a l'acumulador movwf PORTB ; I ho guarda al PORTB return Bit2 movlw b'01000000' ; Copia Port a l'acumulador movwf PORTC ; I ho guarda al PORTB return Bit3 movlw b'10010000' ; Copia Port a l'acumulador movwf PORTB ; I ho guarda al PORTB return Bit6 movlw b'01010000' ; Copia Port a l'acumulador movwf PORTC ; I ho guarda al PORTB return Bit9 movlw b'10000000' ; Copia Port a l'acumulador movwf PORTB ; I ho guarda al PORTB return Limpiar movlw b'00000000' movwf PORTB movlw b'00000000' movwf PORTC movlw b'00000000' movwf PORTA return Lanegra movlw .141 ; Valor que correspon aproximadament a la3 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 call TocaNota2 ; Toca la nota configurada return Minegra movlw .189 ; Valor que correspon aproximadament a mi3 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 call TocaNota2 ; Toca la nota configurada return Micor movlw .189 ; Valor que correspon aproximadament a mi3 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 call TocaNota1 ; Toca la nota configurada return Fanegra movlw .178 ; Valor que correspon aproximadament a fa3 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 call TocaNota2 ; Toca la nota configurada return Facor movlw .178 ; Valor que correspon aproximadament a fa3 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 call TocaNota1 ; Toca la nota configurada return Solnegra movlw .158 ; Valor que correspon aproximadament a sol3 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 call TocaNota2 ; Toca la nota configurada return Solcor movlw .158 ; Valor que correspon aproximadament a sol3 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 call TocaNota1 ; Toca la nota configurada return Renegra movlw .212 ; Valor que correspon aproximadament a re3 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 call TocaNota2 ; Toca la nota configurada return Recor movlw .212 ; Valor que correspon aproximadament a re3 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 call TocaNota1 ; Toca la nota configurada return TocaNota1 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 call Retard ; Espera 0,2 s 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 Limpiar return TocaNota2 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 call Retard ; Espera 0,2 s call Retard ; Espera 0,2 s 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 Limpiar return TocaNota3 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 call Retard ; Espera 0,2 s call Retard ; Espera 0,2 s call Retard ; Espera 0,2 s call Retard ; Espera 0,2 s 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 Limpiar return Yoigo call Retard movlw .238 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .119 ; 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 call TocaNota2 ; Toca la nota configurada call Retard ; Espera 0,2 s movlw .189 ; Valor que correspon aproximadament a mi3 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 call TocaNota2 ; Toca la nota configurada movlw .212 ; Valor que correspon aproximadament a re3 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 call TocaNota3 ; Toca la nota configurada call Retard ; Espera 0,2 s call Retard ; Espera 0,2 s call Retard ; Espera 0,2 s call Retard ; Espera 0,2 s call Retard ; Espera 0,2 s movlw .238 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .119 ; 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 call TocaNota2 ; Toca la nota configurada call Retard ; Espera 0,2 s movlw .189 ; Valor que correspon aproximadament a mi3 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 call TocaNota2 ; Toca la nota configurada movlw .238 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .119 ; 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 call TocaNota3 ; Toca la nota configurada goto Aleatorio Aleatorio call Retard movf TMR0,w ; Copia el Timer0 a l'acumulador andlw b'00000111' ; Posa a zero els quatre bits inferiors btfsc STATUS,Z goto Aleatorio movwf Visualit xorlw b'00000111' btfsc STATUS,Z goto Aleatorio Comparar movf Visualit,w xorlw b'00000001' btfsc STATUS,Z goto numero1 movf Visualit,w xorlw b'00000010' btfsc STATUS,Z goto numero2 movf Visualit,w xorlw b'00000011' btfsc STATUS,Z goto numero3 movf Visualit,w xorlw b'00000100' btfsc STATUS,Z goto numero4 movf Visualit,w xorlw b'00000101' btfsc STATUS,Z goto numero5 movf Visualit,w xorlw b'00000110' btfsc STATUS,Z goto numero6 numero1 call Bit5 btfsc PORTA,3 ; Mira si està activada l'entrada A3 goto $-1 ; repetim la línia fins que es deixi el polsador goto Bucleinicio ; Repetim-ho... numero2 movlw b'11000000' ; Copia Port a l'acumulador movwf PORTB ; I ho guarda al PORTB btfsc PORTA,3 ; Mira si està activada l'entrada A3 goto $-1 ; repetim la línia fins que es deixi el polsador goto Bucleinicio ; Repetim-ho... numero3 movlw b'11100000' ; Copia Port a l'acumulador movwf PORTB ; I ho guarda al PORTB btfsc PORTA,3 ; Mira si està activada l'entrada A3 goto $-1 ; repetim la línia fins que es deixi el polsador goto Bucleinicio ; Repetim-ho... numero4 movlw b'11000000' ; Copia Port a l'acumulador movwf PORTB ; I ho guarda al PORTB movlw b'00010000' ; Copia Port a l'acumulador movwf PORTB ; I ho guarda al PORTB btfsc PORTA,3 ; Mira si està activada l'entrada A3 goto numero4 ; repetim la línia fins que es deixi el polsador goto Bucleinicio ; Repetim-ho... numero5 movlw b'11100000' ; Copia Port a l'acumulador movwf PORTB ; I ho guarda al PORTB movlw b'00010000' ; Copia Port a l'acumulador movwf PORTB ; I ho guarda al PORTB btfsc PORTA,3 ; Mira si està activada l'entrada A3 goto numero5 ; repetim la línia fins que es deixi el polsador goto Bucleinicio ; Repetim-ho... numero6 movlw b'11000000' ; Copia Port1 a l'acumulador movwf PORTB ; I ho guarda al PORTB movlw b'00010000' ; Copia Port2 a l'acumulador movwf PORTC ; I ho guarda al PORTB movlw b'00010000' ; Copia Port a l'acumulador movwf PORTB ; I ho guarda al PORTB movlw b'00000000' ; Copia Port2 a l'acumulador movwf PORTC ; I ho guarda al PORTB btfsc PORTA,3 ; Mira si està activada l'entrada A3 goto numero6 ; repetim la línia fins que es deixi el polsador goto Bucleinicio ; Repetim-ho... end

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