Aquest grup va plantejar quatre nivells de joc:
| Nivell | Colors | Colors repetits | Tirades | Indicació de quins colors són encertats |
| 1 | 4 | No | Sense límit | Sí |
| 2 | 7 | No | Sense límit | Sí |
| 3 | 4 | Sí | 10 | No |
| 4 | 7 | Sí | 10 | No |
Els LED vermells indiquen al jugador en quina tirada està. Els LED grocs informen dels encerts segons el següent criteri:
| Led | Significat |
| Encès | Hi ha un color encertat i en la posició correcta |
| Intermitent | Hi ha un color encertat però no en la posició correcta |
| Apagat | Hi ha un color no encertat |
El programa é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 Rand:2 ; Dos bytes on guardarem el valor aleatori Auxrand:2 ; Variable auxiliar per a Random Retard1 ; Variables de retard Retard2 Retard3 Polsador check1 check2 check3 check4 check2k check1_prima check2_prima check3_prima check4_prima Port Tra tira Compta Compta_tirada 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 Sort:2 Contador:4 Comprova1:4 Comprova2:4 Comprova3:4 Comprova4:4 Sortida:2 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 B com a sortida clrf TRISC ; Posa tots els bits del port C com a sortida movlw b'10000000' ; Configuració de Timer0 ; Com a temporitzador basat en rellotge ; 000 - Factor d'escala de 2 ; I resistències de pull-up desactivades (valor per defecte) movwf OPTION_REG ; Ho guarda 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 .10 call Rets movlw b'00000001' ; activa el conversor A/D connectat a AN0 movwf ADCON0 ; amb el resultat justificat per l'esquerra clrf PORTC movlw b'11111111' movwf Sortida movlw b'11111111' movwf Sortida+1 call EnviaR16 Potenciometre_LED 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 1 LED1 ; Comparació LED1 movlw .255 ; Límit superior de Potenciòmetre subwf ADRESH,w ; W = ADRESH - W btfsc STATUS,C ; C = 1 si ADRESH >= W goto LED2 ; ADRESH >= W movlw .192 ; Límit inferior de Potenciòmetre subwf ADRESH,w ; W = ADRESH - W btfss STATUS,C ; C = 1 si ADRESH >= W goto LED2 ; ADRESH < W movlw b'00001111' ; Encén els 4 LED vermells movwf PORTC goto LED5 LED2 ; Comparació LED2 movlw .191 ; Límit superior de Potenciòmetre subwf ADRESH,w ; W = ADRESH - W btfsc STATUS,C ; C = 1 si ADRESH >= W goto LED3 ; ADRESH >= W movlw .128 ; Límit inferior de Potenciòmetre subwf ADRESH,w ; W = ADRESH - W btfss STATUS,C ; C = 1 si ADRESH >= W goto LED3 ; ADRESH < W movlw b'00000111' ; Encén 3 LED vermells movwf PORTC goto LED5 LED3 ; Comparació LED3 movlw .127 ; Límit superior de Potenciòmetre subwf ADRESH,w ; W = ADRESH - W btfsc STATUS,C ; C = 1 si ADRESH >= W goto LED4 ; ADRESH >= W movlw .64 ; Límit inferior de Potenciòmetre subwf ADRESH,w ; W = ADRESH - W btfss STATUS,C ; C = 1 si ADRESH >= W goto LED4 ; ADRESH < W movlw b'00000011' ; Encén 2 LED vermells movwf PORTC goto LED5 LED4 movlw b'00000001' ; Encén 1 LED vermell movwf PORTC goto LED5 LED5 btfsc PORTA,3 ; Comprova si premem el polsador de la placa petita. Si l'hem premut, comença la partida goto Potenciometre_LED ; si no, torna a fer el bucle de comprovació del Potenciòmetre clrf Port ; Posa a zero tots els bits de la variable Port movf Port,w movwf PORTB ; I ho envia al port B movlw .10 ; Retard de 2 s call Rets clrf Sort ; Inicialitzem amb 0 totes aquestes variables clrf Sort+1 clrf Contador clrf Contador+1 clrf Contador+2 clrf Contador+3 clrf tira clrf Tra clrf Compta_tirada clrf check3 clrf check1_prima clrf check2_prima clrf check3_prima clrf check4_prima movlw b'00001001' ; activa el conversor A/D connectat a AN2 movwf ADCON0 ; amb el resultat justificat per l'esquerra nop ; espera un microsegon nop ; espera un microsegon nop ; espera un microsegon nop ; espera un microsegon nop ; espera un microsegon, en total 5 movf TMR0,w ; Agafa el valor de TMR0 movwf Rand+1 ; I el posa com a byte més significatiu de la llavor swapf TMR0,w ; Agafa el valor permutat de TMR0 movwf Rand ; I el posa com a byte menys significatiu de la llavor goto Bucle Bucle call Random ; Genera un valor aleatori Bucle2 bcf Rand,0 ; Apaguem els bits corresponents als LED monocroms bcf Rand,1 bcf Rand,2 bcf Rand,3 movlw b'00000000' movwf Sortida movlw b'00000000' movwf Sortida+1 call EnviaR16 movlw .2 call Rets call CHECK ; Cridem una funció per comptar quants colors de cada hi ha goto Inici_joc ; Amb les variables checkX_prima definides, comencem el joc Random clrf Auxrand ; Posa a zero les variables auxiliars clrf Auxrand+1 ; Posa a zero les variables auxiliars ; Rand+1: 15 14 13 12 11 10 9 8 ; Rand: 7 6 5 4 3 2 1 0 rlf Rand+1,w ; Roda a l'esquerra i deixa el resultat a W ; Rand+1: 15 14 13 12 11 10 9 8 ; W: 14 13 12 11 10 9 8 X xorwf Rand+1,w ; Fa un xor amb l'original i deixa el resultat a W movwf Auxrand+1 ; El bit de l'esquerra serà la xor del 14 i el 15 ; swapf Rand+1,f ; Permuta els nibbles ; Rand+1: 11 10 9 8 15 14 13 12 ; Rand: 7 6 5 4 3 2 1 0 swapf Rand,w ; Guarda els nibbles permutats a W movwf Auxrand ; Auxrand: 3 2 1 0 7 6 5 4 bcf STATUS,C ; Entrarem un zero rlf Auxrand,f ; Hem rodat a l'esquerra, ara el bit 3 és a C btfsc STATUS,C ; Si C és zero no fem res bsf Auxrand,0 ; Si C és 1, activem el bit de la dreta ; Auxrand: 2 1 0 7 6 5 4 3 ; Rand+1: 11 10 9 8 15 14 13 12 ; Rand: 7 6 5 4 3 2 1 0 movf Auxrand,w ; Copia Auxrand a W xorwf Rand+1,w ; El bit de la dreta de W serà la xor de 3 i 12 swapf Rand+1,f ; Ho torna a deixar com estava ; Rand+1: 15 14 13 12 11 10 9 8 ; Rand: 7 6 5 4 3 2 1 0 andlw b'00000001' ; Posa w a zero excepte el bit de la dreta rlf Auxrand+1,f ; Agafem el bit de l'esquerra i el posem a C ; Aquest bit era la xor del 14 i el 15 rlf Rand,f ; Rodem Rand a l'esquerra entrant el bit que volem per la dreta xorwf Rand,f ; Li fem una xor amb W que afecta només al bit de la dreta rlf Rand+1,f ; Rodem Rand+1 a l'esquerra entrant el bit que ha sortit de Rand movf Rand,w ; Comprovem si el resultat del valor aleatori conté algun LED apagat andlw b'01110000' xorlw b'00000000' btfsc STATUS,Z goto Random movf Rand,w andlw b'10000000' xorlw b'00000000' btfsc STATUS,Z goto comprov ; Crida per a comprovar els 2 bits corresponents que queden en Rand+1 continua_comprovacio movf Rand+1,w andlw b'00011100' xorlw b'00000000' btfsc STATUS,Z goto Random movf Rand+1,w andlw b'11100000' xorlw b'00000000' btfsc STATUS,Z goto Random ; En cas que no hi hagi cap LED apagat, podem continuar movf PORTC,w ; Comprovem si ens trobem en el 2n o 4t nivell xorlw b'00000011' ; On es podrien fer servir els 7 colors programats btfsc STATUS,Z ; En cas contrari, (Ens trobem en el 1r o el 3r) goto Bucle2 ; Passem a un "filtre" per comprovar que no hi hagi a la combinació movf PORTC,w ; Colors que no siguin els 4 escollits per a aquests nivells xorlw b'00001111' btfsc STATUS,Z goto Bucle2 No_Colors ; Comprovem que NOMÉS hi siguin presents a la combinació ; Vermell, Verd, Blau i Groc ; 1r LED movf Rand,w ; Comprovem el Magenta andlw b'01110000' ; Si hi és, tornem a fer una combinació xorlw b'01010000' btfsc STATUS,Z goto Random movf Rand,w ; Comprovem el Cian andlw b'01110000' xorlw b'01100000' btfsc STATUS,Z goto Random movf Rand,w andlw b'01110000' ; Comprovem el Blanc xorlw b'01110000' btfsc STATUS,Z goto Random ; 2n LED movf Rand,w ; En estar repartit entre Rand i Rand+1, el LED2 és més complex andlw b'10000000' ; Comprovem primer el bit corresponent al primer dels LED tricolors xorlw b'10000000' ; i en funció del valor, anem a un bloc o a un altre btfsc STATUS,Z goto comprov1 continua_comprovacio1 movf Rand,w andlw b'10000000' xorlw b'00000000' btfsc STATUS,Z goto comprov2 continua_comprovacio2 movf Rand,w andlw b'10000000' xorlw b'10000000' btfsc STATUS,Z goto comprov3 continua_comprovacio3 ; 3r LED movf Rand+1,w andlw b'00011100' xorlw b'00010100' ; Magenta btfsc STATUS,Z goto Random movf Rand+1,w andlw b'00011100' xorlw b'00011000' ; Cian btfsc STATUS,Z goto Random movf Rand+1,w andlw b'00011100' xorlw b'00011100' ; Blanc btfsc STATUS,Z goto Random ; 4t LED movf Rand+1,w andlw b'11100000' xorlw b'10100000' ; Magenta btfsc STATUS,Z goto Random movf Rand+1,w andlw b'11100000' xorlw b'11000000' ; Cian btfsc STATUS,Z goto Random movf Rand+1,w andlw b'11100000' xorlw b'11100000' ; Blanc btfsc STATUS,Z goto Random goto Bucle2 comprov ; Continuació de la comprovació que el LED2 sigui apagat movf Rand+1,w andlw b'00000011' xorlw b'00000000' btfsc STATUS,Z goto Random goto continua_comprovacio comprov1 movf Rand+1,w ; I aquí tenim la comprovació dels dos bits corresponent andlw b'00000011' ; al 2n i al 3r LED dels tricolors. xorlw b'00000010' ; Magenta btfsc STATUS,Z goto Random goto continua_comprovacio1 comprov2 movf Rand+1,w andlw b'00000011' xorlw b'00000011' ; Cian btfsc STATUS,Z goto Random goto continua_comprovacio2 comprov3 movf Rand+1,w andlw b'00000011' xorlw b'00000011' ; Blanc btfsc STATUS,Z goto Random goto continua_comprovacio3 Inici_joc call Llegir_joc ; Llegeix els polsadors i incrementa el comptador de pulsacions progressivament movf Polsador,w xorlw b'00000000' btfsc STATUS,Z goto Encendre0 movf Polsador,w ; Agafa el polsador actiu xorlw b'00000001' btfsc STATUS,Z goto Encendre1 movf Polsador,w ; Agafa el polsador actiu xorlw b'00000010' btfsc STATUS,Z goto Encendre2 movf Polsador,w ; Agafa el polsador actiu xorlw b'00000100' btfsc STATUS,Z goto Encendre3 movf Polsador,w ; Agafa el polsador actiu xorlw b'00001000' btfsc STATUS,Z goto Encendre4 movf Polsador,w ; Agafa el polsador actiu xorlw b'00010000' btfsc STATUS,Z goto COMPROVACIO Encendre0 ; Mentre no s'apreti cap botó, continua mostrant els colors movf Sort,w ; que hi ha a la variable Sort i Sort+1 movwf Sortida movf Sort+1,w movwf Sortida+1 call EnviaR16 goto Inici_joc Encendre1 movf Contador,w ; Si és el primer cop que es prem el botó 1, encèn Vermell xorlw .1 btfsc STATUS,Z goto Vermell movf Contador,w ; Si és el segon, encèn Verd xorlw .2 btfsc STATUS,Z goto Verd movf Contador,w ; Si és el tercer, enèn Blau xorlw .3 btfsc STATUS,Z goto Blau movf Contador,w ; Ara Groc xorlw .4 btfsc STATUS,Z goto Groc movf Contador,w ; Ara Magenta xorlw .5 btfsc STATUS,Z goto Magenta movf Contador,w ; Cian xorlw .6 btfsc STATUS,Z goto Cian movf Contador,w ; Blanc xorlw .7 btfsc STATUS,Z goto Blanc Encendre2 movf Contador+1,w ; Procediment anàleg al del polsador 1, però ara amb el segon polsador xorlw .1 ; i encenent els LED corresponents a fer el color en el segon LED btfsc STATUS,Z goto Vermell2 movf Contador+1,w xorlw .2 btfsc STATUS,Z goto Verd2 movf Contador+1,w xorlw .3 btfsc STATUS,Z goto Blau2 movf Contador+1,w xorlw .4 btfsc STATUS,Z goto Groc2 movf Contador+1,w xorlw .5 btfsc STATUS,Z goto Magenta2 movf Contador+1,w xorlw .6 btfsc STATUS,Z goto Cian2 movf Contador+1,w xorlw .7 btfsc STATUS,Z goto Blanc2 Encendre3 movf Contador+2,w ; Igual que abans però amb el tercer polsador xorlw .1 btfsc STATUS,Z goto Vermell3 movf Contador+2,w xorlw .2 btfsc STATUS,Z goto Verd3 movf Contador+2,w xorlw .3 btfsc STATUS,Z goto Blau3 movf Contador+2,w xorlw .4 btfsc STATUS,Z goto Groc3 movf Contador+2,w xorlw .5 btfsc STATUS,Z goto Magenta3 movf Contador+2,w xorlw .6 btfsc STATUS,Z goto Cian3 movf Contador+2,w xorlw .7 btfsc STATUS,Z goto Blanc3 Encendre4 movf Contador+3,w ; I per últim amb el 4t Polsador xorlw .1 btfsc STATUS,Z goto Vermell4 movf Contador+3,w xorlw .2 btfsc STATUS,Z goto Verd4 movf Contador+3,w xorlw .3 btfsc STATUS,Z goto Blau4 movf Contador+3,w xorlw .4 btfsc STATUS,Z goto Groc4 movf Contador+3,w xorlw .5 btfsc STATUS,Z goto Magenta4 movf Contador+3,w xorlw .6 btfsc STATUS,Z goto Cian4 movf Contador+3,w xorlw .7 btfsc STATUS,Z goto Blanc4 Vermell ; Encèn el color Vermell al primer LED tricolor bcf Sort,4 ; Apaguem els 3 LED corresponents al primer LED gran bcf Sort,5 bcf Sort,6 movlw b'00010000' ; Configurem el color vermell xorwf Sort,f ; i el movem al seu lloc corresponent a la variable Sort movf Sort,w ; Fem servir xorlw per no esborrar els possibles valors que hi haguès a la resta de LED movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00000000' ; Bits 8 a 15 a zero xorwf Sort+1,f ; I els comparem per deixar-los tal i com estaven movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps de 0.4 segons call Rets ; Espera 0.4 s movlw b'00000001' ; Posa el color vermell als 3 LED de la dreta de la variable comprova1 movwf Comprova1 ; Perquè després sigui més senzilla la comprovació per donar les pistes goto Inici_joc ; I tornem cap a dalt Verd ; Fem anàlogament amb la resta de colors fins a arribar al Groc movlw b'00110000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00000000' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps de 0.4 segons call Rets ; Espera 0.4 s movlw b'00000010' movwf Comprova1 goto Inici_joc Blau movlw b'01100000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00000000' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps de 0.4 segons call Rets movlw b'00000100' movwf Comprova1 goto Inici_joc Groc movlw b'01110000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00000000' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000011' movwf Comprova1 ; Comprovem ara si som als nivells 1r o 3r (On podem fer servir només 4 colors) movf PORTC,w ; en cas afirmatiu, netegem el contador i, per tant, si premessim un altre cop xorlw b'00000001' ; el mateix botó, tornariem a començar pel Vermell btfsc STATUS,Z clrf Contador movf PORTC,w xorlw b'00000111' btfsc STATUS,Z clrf Contador goto Inici_joc ; En cas contrari, s'obviarien aquestes instruccions i continuariem amb els últims 3 colors Magenta movlw b'01100000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00000000' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000101' movwf Comprova1 goto Inici_joc Cian movlw b'00110000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00000000' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000110' movwf Comprova1 goto Inici_joc Blanc movlw b'00010000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00000000' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000111' movwf Comprova1 clrf Contador goto Inici_joc Vermell2 ; Encenem el color vermell en el LED2 (tricolor) bcf Sort,7 ; Apaguem els LED corresponents als 3 del LED2 bcf Sort+1,0 bcf Sort+1,1 movlw b'10000000' ; Movem el color vermell i el comparem amb la variable sort amb xorwf xorwf Sort,f ; Per posar-hi el color sense modificar el que hi hagi a la resta movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00000000' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000001' movwf Comprova2 goto Inici_joc Verd2 ; Un altre cop, fem el mateix amb tots els colors fins al groc movlw b'10000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00000001' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000010' movwf Comprova2 goto Inici_joc Blau2 movlw b'00000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00000011' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000100' movwf Comprova2 goto Inici_joc Groc2 movlw b'10000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00000011' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000011' movwf Comprova2 ; Comprovem aquí que, igual que abans, no ens trobem en els nivells 1 o 3 movf PORTC,w ; Per decidir si es neteja el contador associat al segon polsador xorlw b'00000001' btfsc STATUS,Z clrf Contador+1 movf PORTC,w xorlw b'00000111' btfsc STATUS,Z clrf Contador+1 goto Inici_joc Magenta2 movlw b'00000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00000011' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000101' movwf Comprova2 goto Inici_joc Cian2 movlw b'10000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00000001' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000110' movwf Comprova2 goto Inici_joc Blanc2 movlw b'10000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00000000' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000111' movwf Comprova2 clrf Contador+1 goto Inici_joc Vermell3 ; Procediment anàleg per encendre el color Vermell al 3r LED (tricolor) bcf Sort+1,2 bcf Sort+1,3 bcf Sort+1,4 movlw b'00000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00000100' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000001' movwf Comprova3 goto Inici_joc Verd3 movlw b'00000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00001100' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000010' movwf Comprova3 goto Inici_joc Blau3 movlw b'00000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00011000' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000100' movwf Comprova3 goto Inici_joc Groc3 movlw b'00000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00011100' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000011' movwf Comprova3 ; Tornem a comprovar si ens trobem al nivell adequat per prendre les mesures necessàries movf PORTC,w xorlw b'00000001' btfsc STATUS,Z clrf Contador+2 movf PORTC,w xorlw b'00000111' btfsc STATUS,Z clrf Contador+2 goto Inici_joc Magenta3 movlw b'00000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00011000' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000101' movwf Comprova3 goto Inici_joc Cian3 movlw b'00000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00001100' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000110' movwf Comprova3 goto Inici_joc Blanc3 movlw b'00000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00000100' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000111' movwf Comprova3 clrf Contador+2 goto Inici_joc Vermell4 ; El mateix que abans però amb el color Vermell per al 4t LED bcf Sort+1,5 bcf Sort+1,6 bcf Sort+1,7 movlw b'00000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00100000' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000001' movwf Comprova4 goto Inici_joc Verd4 movlw b'00000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'01100000' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000010' movwf Comprova4 goto Inici_joc Blau4 movlw b'00000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'11000000' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000100' movwf Comprova4 goto Inici_joc Groc4 movlw b'00000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'11100000' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000011' movwf Comprova4 ; Comprovem si hi som al 1r o al 3r nivell movf PORTC,w xorlw b'00000001' btfsc STATUS,Z clrf Contador+3 movf PORTC,w xorlw b'00000111' btfsc STATUS,Z clrf Contador+3 goto Inici_joc Magenta4 movlw b'00000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'11000000' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000101' movwf Comprova4 goto Inici_joc Cian4 movlw b'00000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'01100000' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000110' movwf Comprova4 goto Inici_joc Blanc4 movlw b'00000000' xorwf Sort,f movf Sort,w movwf Sortida ; Ho prepara per enviar-ho al registre movlw b'00100000' ; Bits 8 a 15 a zero xorwf Sort+1,f movf Sort+1,w movwf Sortida+1 ; Ho prepara per enviar-ho al registre call EnviaR16 ; Ho envia al registre movlw .2 ; Temps d'un segon call Rets ; Espera 1 s movlw b'00000111' movwf Comprova4 clrf Contador+3 goto Inici_joc COMPROVACIO ; Comprovem si estem als 2 primers nivells o als 2 últims ; Per saber si les pistes dels monocroms han de coincidir amb els LED tricolors movf PORTC,w ; o les hem de desordenar xorlw b'00000001' btfsc STATUS,Z goto COMPROVACIO_nivells_1_2 movf PORTC,w xorlw b'00000011' btfsc STATUS,Z goto COMPROVACIO_nivells_1_2 movf PORTC,w xorlw b'00000111' btfsc STATUS,Z goto COMPROVACIO_nivells_3_4 movf PORTC,w xorlw b'00001111' btfsc STATUS,Z goto COMPROVACIO_nivells_3_4 COMPROVACIO_nivells_1_2 ; Comprovem cada LED i encenem el LED monocrom corresponent movf check1,w ; Si el primer LED és el mateix que el de la combinació xorwf Comprova1,w btfsc STATUS,Z call C1 ; Encén el primer LED monocrom movf check2,w ; Comprovem ara si el segon LED és coincident amb la combinació xorwf Comprova2,w btfsc STATUS,Z call C2 ; Fem una serie de passos movf check3,w ; Igual per al 3r LED xorwf Comprova3,w btfsc STATUS,Z call C3 movf check4,w ; I per al 4t xorwf Comprova4,w btfsc STATUS,Z call C4 goto CONTI CONTI ; Comprovem si ja hem encés tots els LED grocs i sino, passem als bucles d'intermitència movf Sort,w andlw b'00001111' xorlw b'00001111' btfsc STATUS,Z goto Print ; S'ha acabat el joc btfss Sort,0 goto Intermitent1 goto Intermitent2 Intermitent1 ; Comprovem si el primer LED és igual a algun dels colors de la combinació correcta movf Comprova1,w ; Si és igual al 2n xorwf check2,w btfsc STATUS,Z goto Inter1_1 movf Comprova1,w ; Al 3r xorwf check3,w btfsc STATUS,Z goto Inter1_2 movf Comprova1,w ; O al 4t xorwf check4,w btfsc STATUS,Z goto Inter1_3 goto Intermitent2 Inter1_1 movf check2_prima,w ; Comprovem si encara queden vermells (per exemple) per comprovar xorlw b'00000000' btfss STATUS,Z bsf tira,0 ; En cas que sí, fiquem un 1 a la variable tira, al lloc corresponent movf check2_prima,w ; De manera que en el bucle anirem comparant Tira i Sortida amb xorlw xorlw b'00000000' ; i així, el bit que acabem d'activar, en compararlo, va canviant el valor btfss STATUS,Z ; anterior que hi havia a Sort decf check2_prima,f ; i decrementem la variable corresponent al color que acabem de "gastar" goto Intermitent2 Inter1_2 movf check3_prima,w ; Fem el mateix amb els altres 2 casos. xorlw b'00000000' btfss STATUS,Z bsf tira,0 movf check3_prima,w xorlw b'00000000' btfss STATUS,Z decf check3_prima,f goto Intermitent2 Inter1_3 movf check4_prima,w xorlw b'00000000' btfss STATUS,Z bsf tira,0 movf check4_prima,w xorlw b'00000000' btfss STATUS,Z decf check4_prima,f goto Intermitent2 Intermitent2 btfsc Sort,1 ; Comprovem que el 2n LED monocrom no estigui ences goto Intermitent3 ; En cas que ho estigui, saltem tot aquest bloc movf Comprova2,w ; Comparem si el segon LED és igual: xorwf check1,w ; al 1r btfsc STATUS,Z goto Inter2_1 movf Comprova2,w ; al 3r xorwf check3,w btfsc STATUS,Z goto Inter2_2 movf Comprova2,w ; al 4t xorwf check4,w btfsc STATUS,Z goto Inter2_3 goto Intermitent3 Inter2_1 ; Fem el mateix que hem fet amb el primer però ara movf check1_prima,w ; encendrem el bit 1 de la variable tira xorlw b'00000000' ; per a fer la intermitencia btfss STATUS,Z ; sempre i quan checkX_prima sigui diferent de 0 bsf tira,1 movf check1_prima,w xorlw b'00000000' btfss STATUS,Z decf check1_prima,f goto Intermitent3 Inter2_2 movf check3_prima,w xorlw b'00000000' btfss STATUS,Z bsf tira,1 movf check3_prima,w xorlw b'00000000' btfss STATUS,Z decf check3_prima,f goto Intermitent3 Inter2_3 movf check4_prima,w xorlw b'00000000' btfss STATUS,Z bsf tira,1 movf check4_prima,w xorlw b'00000000' btfss STATUS,Z decf check4_prima,f goto Intermitent3 Intermitent3 ; Comprovem ara si el 3r LED groc és encés btfsc Sort,2 goto Intermitent4 movf Comprova3,w ; I comprovem si el 3er color introduit és igual: xorwf check1,w ; al 1r btfsc STATUS,Z goto Inter3_1 movf Comprova3,w ; al 2n xorwf check2,w btfsc STATUS,Z goto Inter3_2 movf Comprova3,w ; al 4t xorwf check4,w btfsc STATUS,Z goto Inter3_3 goto Intermitent4 ; Procediment anàleg a Inter2_1 i posteriors Inter3_1 movf check1_prima,w xorlw b'00000000' btfss STATUS,Z bsf tira,2 movf check1_prima,w xorlw b'00000000' btfss STATUS,Z decf check1_prima,f goto Intermitent4 Inter3_2 movf check2_prima,w xorlw b'00000000' btfss STATUS,Z bsf tira,2 movf check2_prima,w xorlw b'00000000' btfss STATUS,Z decf check2_prima,f goto Intermitent4 Inter3_3 movf check4_prima,w xorlw b'00000000' btfss STATUS,Z bsf tira,2 movf check4_prima,w xorlw b'00000000' btfss STATUS,Z decf check4_prima,f goto Intermitent4 Intermitent4 ; Per últim comprovem si el 4t LED groc és encés btfsc Sort,3 goto COMPR movf Comprova4,w ; si no, mirem si el 4rt color introduit és igual: xorwf check1,w ; al 1r btfsc STATUS,Z goto Inter4_1 movf Comprova4,w ; al 2n xorwf check2,w btfsc STATUS,Z goto Inter4_2 movf Comprova4,w ; al 3r xorwf check3,w btfsc STATUS,Z goto Inter4_3 goto COMPR Inter4_1 ; Procediment anàleg a Inter2_1 i posteriors movf check1_prima,w xorlw b'00000000' btfss STATUS,Z bsf tira,3 movf check1_prima,w xorlw b'00000000' btfss STATUS,Z decf check1_prima,f goto COMPR Inter4_2 movf check2_prima,w xorlw b'00000000' btfss STATUS,Z bsf tira,3 movf check2_prima,w xorlw b'00000000' btfss STATUS,Z decf check2_prima,f goto COMPR Inter4_3 movf check3_prima,w xorlw b'00000000' btfss STATUS,Z bsf tira,3 movf check3_prima,w xorlw b'00000000' btfss STATUS,Z decf check3_prima,f goto COMPR COMPROVACIO_nivells_3_4 ; Comprovem cada LED, però desordenem les pistes movf check1,w ; Comprovem si cada color introduit correspon xorwf Comprova1,w ; amb el del seu lloc btfsc STATUS,Z call CO1 movf check2,w xorwf Comprova2,w btfsc STATUS,Z call CO2 movf check3,w xorwf Comprova3,w btfsc STATUS,Z call CO3 movf check4,w xorwf Comprova4,w btfsc STATUS,Z call CO4 goto CO CO movf Sort,w ; Comprovem si tot està encés i, per tant, hem guanyat andlw b'00001111' xorlw b'00001111' btfsc STATUS,Z goto Print btfss Tra,0 ; en cas contrari, Passem a fer ells bucles de intermitència goto Intermitent1_pre ; Mirem si el primer LED Groc hauria d'estar encés goto Intermitent2_pre ; Per veure per on comencem Intermitent1_pre ; Amb un procediment anàleg a la intermitència movf Comprova1,w ; dels nivells on sí corresponen les pistes xorwf check2,w ; anem comprovant si el color introduït és igual btfsc STATUS,Z ; a algun dels colors de la combinació que no goto pre1_1 ; sigui ell mateix movf Comprova1,w xorwf check3,w btfsc STATUS,Z goto pre1_2 movf Comprova1,w xorwf check4,w btfsc STATUS,Z goto pre1_3 goto Intermitent2_pre pre1_1 movf check2_prima,w xorlw b'00000000' btfss STATUS,Z call busca ; Però aquest cop cridem el bloc busca movf check2_prima,w ; que "desordena" les pistes igual que feia xorlw b'00000000' ; el bloc obra abans btfss STATUS,Z decf check2_prima,f goto Intermitent2_pre pre1_2 movf check3_prima,w xorlw b'00000000' btfss STATUS,Z call busca movf check3_prima,w xorlw b'00000000' btfss STATUS,Z decf check3_prima,f goto Intermitent2_pre pre1_3 movf check4_prima,w xorlw b'00000000' btfss STATUS,Z call busca movf check4_prima,w xorlw b'00000000' btfss STATUS,Z decf check4_prima,f goto Intermitent2_pre Intermitent2_pre btfsc Tra,1 ; Mirem si el 2n LED hauria d'estar encés goto Intermitent3_pre ; si es així, passem al següent bloc movf Comprova2,w xorwf check1,w btfsc STATUS,Z goto pre2_1 movf Comprova2,w xorwf check3,w btfsc STATUS,Z goto pre2_2 movf Comprova2,w xorwf check4,w btfsc STATUS,Z goto pre2_3 goto Intermitent3_pre pre2_1 movf check1_prima,w xorlw b'00000000' btfss STATUS,Z call busca movf check1_prima,w xorlw b'00000000' btfss STATUS,Z decf check1_prima,f goto Intermitent3_pre pre2_2 movf check3_prima,w xorlw b'00000000' btfss STATUS,Z call busca movf check3_prima,w xorlw b'00000000' btfss STATUS,Z decf check3_prima,f goto Intermitent3_pre pre2_3 movf check4_prima,w xorlw b'00000000' btfss STATUS,Z call busca movf check4_prima,w xorlw b'00000000' btfss STATUS,Z decf check4_prima,f goto Intermitent3_pre Intermitent3_pre btfsc Tra,2 ; Mirem si el 3r LED hauria d'estar encés, igual que abans goto Intermitent4_pre movf Comprova3,w xorwf check1,w btfsc STATUS,Z goto pre3_1 movf Comprova3,w xorwf check2,w btfsc STATUS,Z goto pre3_2 movf Comprova3,w xorwf check4,w btfsc STATUS,Z goto pre3_3 goto Intermitent4_pre pre3_1 movf check1_prima,w xorlw b'00000000' btfss STATUS,Z call busca movf check1_prima,w xorlw b'00000000' btfss STATUS,Z decf check1_prima,f goto Intermitent4_pre pre3_2 movf check2_prima,w xorlw b'00000000' btfss STATUS,Z call busca movf check2_prima,w xorlw b'00000000' btfss STATUS,Z decf check2_prima,f goto Intermitent4_pre pre3_3 movf check4_prima,w xorlw b'00000000' btfss STATUS,Z call busca movf check4_prima,w xorlw b'00000000' btfss STATUS,Z decf check4_prima,f goto Intermitent4_pre Intermitent4_pre btfsc Tra,3 ; Si el 4rt LED també hauria d'estar encés, enviem goto COMPR ; als LED les pistes movf Comprova4,w xorwf check1,w btfsc STATUS,Z goto pre4_1 movf Comprova4,w xorwf check2,w btfsc STATUS,Z goto pre4_2 movf Comprova4,w xorwf check3,w btfsc STATUS,Z goto pre4_3 goto COMPR pre4_1 movf check1_prima,w xorlw b'00000000' btfss STATUS,Z call busca movf check1_prima,w xorlw b'00000000' btfss STATUS,Z decf check1_prima,f goto COMPR pre4_2 movf check2_prima,w xorlw b'00000000' btfss STATUS,Z call busca movf check2_prima,w xorlw b'00000000' btfss STATUS,Z decf check2_prima,f goto COMPR pre4_3 movf check3_prima,w xorlw b'00000000' btfss STATUS,Z call busca movf check3_prima,w xorlw b'00000000' btfss STATUS,Z decf check3_prima,f goto COMPR COMPR ; Bucle per a mostrar les pistes un cop el programa hagi movf Sort,w ; fet les degudes comprovacions xorwf tira,w ; com es pot veure, comparem Sort amb tira per el que movwf Sort ; s'ha comentat més amunt. Cada vegada que comparem, si movf Sort,w ; tira té el bit encés, alternarà entre 1 i 0 el bit movwf Sortida ; corresponent a Sort movf Sort+1,w movwf Sortida+1 call EnviaR16 movlw .2 call Rets movf Sort,w ; i ho tornem a fer per assegurar-nos que parpelleji xorwf tira,w ; al menys 1 cop abans de poder apretar un altre botó movwf Sort movf Sort,w movwf Sortida movf Sort+1,w movwf Sortida+1 call EnviaR16 movlw .2 call Rets call Llegir_tornatirar ; Comprovem si estem prement algun dels 4 polsadors movlw b'00000001' ; que fan rotar els colors i, en cas afirmatiu xorwf Polsador,w ; anem a Nova_Tirada btfsc STATUS,Z goto Nova_Tirada movlw b'00000010' xorwf Polsador,w btfsc STATUS,Z goto Nova_Tirada movlw b'00000100' xorwf Polsador,w btfsc STATUS,Z goto Nova_Tirada movlw b'00001000' xorwf Polsador,w btfsc STATUS,Z goto Nova_Tirada btfss PORTA,3 ; Si el que es prem és el botó de la placa petita goto ensenya_combinacio ; assumim que el jugador es rendeix i, per tant, goto COMPR ; toquem la melodia de derrota i ensenyem la combinació Nova_Tirada clrf check1_prima ; Netegem totes les variables necessàries clrf check2_prima clrf check3_prima clrf check4_prima clrf tira clrf Tra clrf check1 clrf check2 clrf check3 clrf check4 bcf Sort,0 ; Apaguem els LED grocs de les pistes bcf Sort,1 bcf Sort,2 bcf Sort,3 movf PORTC,w ; i comprovem si estem en el 3r o 4t nivell xorlw b'00000111' ; on hi ha un límit de tirades btfsc STATUS,Z goto Compta_tirades movf PORTC,w xorlw b'00001111' btfsc STATUS,Z goto Compta_tirades goto torna_a_tirar ; Si no ens hem passat, tornem a tirar Compta_tirades ; Si ens hem passat de 10 tirades, sona la derrota incf Compta_tirada,f ; i ens ensenya la combinació movlw .9 xorwf Compta_tirada,w btfsc STATUS,Z goto ensenya_combinacio torna_a_tirar call CHECK ; Abans de tornar a començar, tornem a comprovar la quantitat de colors de cada que hi ha goto Inici_joc ensenya_combinacio ; Toca la música de la derrota 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'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 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 TocaNotaNegra ; Toca la nota configurada movlw .168 ; Valor que correspon aproximadament a fa#3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .84 ; 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 TocaNotaNegra ; Toca la nota configurada 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 TocaNotaNegra ; Toca la nota configurada 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 TocaNotaBlanca ; Toca la nota configurada call Rets ; Espera 0,2 s parpalleja ; Ensenya parpallejant la combinació real movf Rand,w movwf Sortida movf Rand+1,w movwf Sortida+1 call EnviaR16 movlw .4 call Rets movlw .0 movwf Sortida movlw .0 movwf Sortida+1 call EnviaR16 movlw .2 call Rets goto parpalleja Print ; Aquí s'arriba quan els 4 LED grocs estan encessos ; i per tant la combinació introduïda és correcte movf Sort,w movwf Sortida movf Sort+1,w movwf Sortida+1 call EnviaR16 movlw .5 call Rets 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'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 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 TocaNotaTresillo ; Toca la nota configurada movlw .149 ; Valor que correspon aproximadament a sol#3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .75 ; 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 TocaNotaTresillo ; Toca la nota configurada 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 TocaNotaTresillo ; Toca la nota configurada movlw .133 ; Valor que correspon aproximadament a la#3 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 call TocaNotaTresillo ; Toca la nota configurada movlw .126 ; Valor que correspon aproximadament a si3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .63 ; 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 TocaNotaTresillo ; Toca la nota configurada movlw .118 ; Valor que correspon aproximadament a do4 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 call TocaNotaTresillo ; Toca la nota configurada movlw .105 ; Valor que correspon aproximadament a re4 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .53 ; 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 TocaNotaCorcheapunto ; Toca la nota configurada movlw .118 ; Valor que correspon aproximadament a do4 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 call TocaNotaTresillo ; Toca la nota configurada movlw .105 ; Valor que correspon aproximadament a re4 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .53 ; 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 TocaNotaNegra ; Toca la nota configurada movlw .133 ; Valor que correspon aproximadament a la#4 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 call TocaNotaNegra ; Toca la nota configurada movlw .118 ; Valor que correspon aproximadament a do4 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 call TocaNotaNegra ; Toca la nota configurada movlw .105 ; Valor que correspon aproximadament a re4 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .53 ; 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 TocaNotaCorcheapunto ; Toca la nota configurada movlw .118 ; Valor que correspon aproximadament a do4 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 call TocaNotaTresillo ; Toca la nota configurada movlw .105 ; Valor que correspon aproximadament a re4 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .53 ; 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 TocaNotaNegra ; Toca la nota configurada call Rets ; Espera 0,2 s parpalleja2 movlw .0 movwf Sortida movlw .0 movwf Sortida+1 call EnviaR16 movlw .2 call Rets movf Sort,w movwf Sortida movf Sort+1,w movwf Sortida+1 call EnviaR16 movlw .5 call Rets goto parpalleja2
Rets ; Funció de retard de 0,2 W s movwf Retard3 Bucles decfsz Retard1,f goto Bucles decfsz Retard2,f goto Bucles decfsz Retard3,f goto Bucles return Llegir clrf Polsador ; Si aquest valor no es canvia és que no hi ha cap polsador premut 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 ; Comparació P1 movlw .220 ; Límit superior de P1 subwf ADRESH,w ; W = ADRESH - W btfsc STATUS,C ; C = 1 si ADRESH >= W goto NoP5 ; ADRESH >= W movlw .200 ; Límit inferior de P1 subwf ADRESH,w ; W = ADRESH - W btfss STATUS,C ; C = 1 si ADRESH >= W goto NoP5 ; ADRESH < W movlw b'00000001' ; Polsador P1 movwf Polsador ; Ho copia a Polsador goto NoP5 NoP5 return Llegir_tornatirar ; Comprovem si s'esta prement algun botó clrf Polsador ; Si aquest valor no es canvia és que no hi ha cap polsador premut 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 ; Comparació P1 movlw .220 ; Límit superior de P1 subwf ADRESH,w ; W = ADRESH - W btfsc STATUS,C ; C = 1 si ADRESH >= W goto NoP1_t ; ADRESH >= W movlw .200 ; Límit inferior de P1 subwf ADRESH,w ; W = ADRESH - W btfss STATUS,C ; C = 1 si ADRESH >= W goto NoP1_t ; ADRESH < W movlw b'00000001' ; Polsador P1 movwf Polsador ; Ho copia a Polsador goto NoP5_t NoP1_t ; Comparació P2 movlw .194 ; Límit superior de P2 subwf ADRESH,w ; W = ADRESH - W btfsc STATUS,C ; C = 1 si ADRESH >= W goto NoP2_t ; ADRESH >= W movlw .174 ; Límit inferior de P2 subwf ADRESH,w ; W = ADRESH - W btfss STATUS,C ; C = 1 si ADRESH >= W goto NoP2_t ; ADRESH < W movlw b'00000010' ; Polsador P2 movwf Polsador ; Ho copia a Polsador goto NoP5_t NoP2_t ; Comparació P3 movlw .163 ; Límit superior de P3 subwf ADRESH,w ; W = ADRESH - W btfsc STATUS,C ; C = 1 si ADRESH >= W goto NoP3_t ; ADRESH >= W movlw .143 ; Límit inferior de P3 subwf ADRESH,w ; W = ADRESH - W btfss STATUS,C ; C = 1 si ADRESH >= W goto NoP3_t ; ADRESH < W movlw b'00000100' ; Polsador P3 movwf Polsador ; Ho copia a Polsador goto NoP5_t NoP3_t ; Comparació P4 movlw .90 ; Límit superior de P4 subwf ADRESH,w ; W = ADRESH - W btfsc STATUS,C ; C = 1 si ADRESH >= W goto NoP4_t ; ADRESH >= W movlw .70 ; Límit inferior de P4 subwf ADRESH,w ; W = ADRESH - W btfss STATUS,C ; C = 1 si ADRESH >= W goto NoP4_t ; ADRESH < W movlw b'00001000' ; Polsador P4 movwf Polsador ; Ho copia a Polsador goto NoP5_t NoP4_t ; Comparació P5 movlw .55 ; Límit superior de P5 subwf ADRESH,w ; W = ADRESH - W btfsc STATUS,C ; C = 1 si ADRESH >= W goto NoP5_t ; ADRESH >= W movlw .35 ; Límit inferior de P5 subwf ADRESH,w ; W = ADRESH - W btfss STATUS,C ; C = 1 si ADRESH >= W goto NoP5_t ; ADRESH < W movlw b'00010000' ; Polsador P5 movwf Polsador ; Ho copia a Polsador NoP5_t return obra ; Comprovem aquí si la primera comprovació ha encés el btfsc Sort,0 ; primer LED groc, en cas contrari, encenem aquest i no goto Segon ; el segon. Comprovem això per a totes les posicions bsf Sort,0 ; de manera que les pistes queden totes a la dreta goto tornar ; i no tenen perquè correspondre al LED tricolor. Segon btfsc Sort,1 goto Tercer bsf Sort,1 goto tornar Tercer btfsc Sort,2 goto Quart bsf Sort,2 goto tornar Quart bsf Sort,3 tornar return busca ; Comprovem quin ha sigut el resultat d'encendre les pistes btfss Sort,0 ; per a aquells colors que estaven a la seva posició correcta goto Mira ; i comencem a encendre els intermitents a partir de l'últim btfss Sort,1 goto Mira1 btfss Sort,2 goto Mira2 btfss Sort,3 goto Mira3 goto fi Mira btfss tira,0 ; Tornem a fer servir la variable tira, per a controlar goto Encendre_tira ; la intermitència de les pistes que donem Mira1 btfss tira,1 goto Encendre_tira1 Mira2 btfss tira,2 goto Encendre_tira2 Mira3 bsf tira,3 goto fi Encendre_tira bsf tira,0 goto fi Encendre_tira1 bsf tira,1 goto fi Encendre_tira2 bsf tira,2 goto fi fi return C1 bsf Sort,0 decf check1_prima,f ;Decrementem el contador corresponent a la quantitat de colors iguals al del LED que acabem de controlar return ; Si a la combinació hi ha 2 vermells i aquest n'és 1, check1_prima val 1 ara ; Perquè només queda 1 vermell per a aparéixer C2 bsf Sort,1 ; Encenem el LED 2 movf check2,w ; Comprovem si el segon color és el mateix que el primer xorwf check1,w btfsc STATUS,Z decf check1_prima,f ; En cas afirmatiu decrementem la variable que porta la compta del primer color decf check2_prima,f ; En cas contrari decrementem la corresponent al segon color ; Si el primer color fos igual al primer, check2_prima ja no es defineix, per tant, no importa decrementar-la return C3 ; Igual que abans, encenem el LED3 bsf Sort,2 movf check3,w ; Però ara comprovarem si el 3r és igual al primer xorwf check1,w btfsc STATUS,Z goto C3_1 movf check3,w xorwf check2,w ; o al segon color. btfsc STATUS,Z goto C3_2 decf check3_prima,f goto C3_3 C3_1 decf check1_prima,f goto C3_3 C3_2 decf check2_prima,f goto C3_3 C3_3 return C4 ; Finalment, fem el mateix per al LED4 bsf Sort,3 movf check4,w ; Comprovem si és igual al 1r xorwf check1,w btfsc STATUS,Z goto C4_1 movf check4,w ; Al 2n xorwf check2,w btfsc STATUS,Z goto C4_2 movf check4,w ; O al 3r. I decrementem les variables corresponents xorwf check3,w btfsc STATUS,Z goto C4_3 decf check4_prima,f goto C4_4 C4_1 decf check1_prima,f goto C4_4 C4_2 decf check2_prima,f goto C4_4 C4_3 decf check3_prima,f goto C4_4 C4_4 return CO1 ;Si el primer coincideix, encenem el primer LED groc bsf Sort,0 bsf Tra,0 ; encenem el bit corresponent de la variable Tra decf check1_prima,f ; i decrementem la variable corresponent al 1r color return ; Tra servirà per portar el compte dels que s'han d'encendre sense modificar ; la variable Sort CO2 bsf Tra,1 ; fem el mateix que abans call obra ; però ara cridarem la funció obra (més abaix) movf check2,w ; que "desordena" les pistes xorwf check1,w ; comprovem tambe si els 2 primers colors són iguals btfsc STATUS,Z ; i decrementem la variable que pertoqui decf check1_prima,f decf check2_prima,f return CO3 bsf Tra,2 ; igual que abans, anem comprovant 1 a 1 les call obra ; relacions entre els colors. I cridem el bloc obra movf check3,w ; per desordenar les pistes xorwf check1,w btfsc STATUS,Z goto CO3_1 movf check3,w xorwf check2,w btfsc STATUS,Z goto CO3_2 decf check3_prima,f goto CO3_3 CO3_1 decf check1_prima,f goto CO3_3 CO3_2 decf check2_prima,f goto CO3_3 CO3_3 return CO4 bsf Tra,3 call obra movf check4,w xorwf check1,w btfsc STATUS,Z goto CO4_1 movf check4,w xorwf check2,w btfsc STATUS,Z goto CO4_2 movf check4,w xorwf check3,w btfsc STATUS,Z goto CO4_3 decf check4_prima,f goto CO4_4 CO4_1 decf check1_prima,f goto CO4_4 CO4_2 decf check2_prima,f goto CO4_4 CO4_3 decf check3_prima,f goto CO4_4 CO4_4 return CHECK ; Aquest bloc serveix per comprovar quants colors repetits hi ha a la combinació de manera que ; si a la combinació només hi ha un vermell i l'usuari posa 3 vermells a la combinació ;check1 ; tinguem alguna manera de controlar que només movf Rand,w ; es mostri informació d'un sol dels vermells andlw b'01110000' ; Agafem els 3 bits corresponents al primer LED tricolor movwf check1 ; els movem a una variable incf check1_prima,f ; incrementem una variable de comptador rrf check1,f ; alineem la primera variable a la dreta del tot rrf check1,f rrf check1,f rrf check1,f bcf check1,7 ; i posem a zero la resta de bits bcf check1,6 bcf check1,5 bcf check1,4 bcf check1,3 ;check2 movf Rand+1,w ; per al segon LED ens trobem entre Rand i Rand+1 andlw b'00000011' ; agafem el valor de Rand+1 i el movem a l'esquerra movwf check2 ; per deixar un espai pel bit restant rlf check2,f movf Rand,w andlw b'10000000' ; Agafem el bit restant de Rand i el fiquem a una variable movwf check2k ; que rotem a l'esquerra perquè el valor quedi ficat a C rlf check2k,f ; i copiem el valor (1 o 0) a la posició lliure btfsc STATUS,C ; que hem deixat abans bsf check2,0 bcf check2,7 bcf check2,6 bcf check2,5 bcf check2,4 bcf check2,3 movf check2,w xorwf check1,w btfsc STATUS,Z goto Incr incf check2_prima,f goto Continua Incr incf check1_prima,f goto Continua ;check3 Continua movf Rand+1,w ; Fem el mateix procediment pel 3r i el 4t color andlw b'00011100' ; ficant la informació en noves variables checkX movwf check3 ; alineant els 3 bits a la dreta del tot rrf check3,f ; i incrementant els comptadors corresponents rrf check3,f movf check3,w andlw b'00001111' movwf check3 movf check3,w xorwf check1,w btfsc STATUS,Z goto Incr1 movf check3,w xorwf check2,w btfsc STATUS,Z goto Incr2 incf check3_prima,f goto Continua2 Incr1 incf check1_prima,f goto Continua2 Incr2 incf check2_prima,f goto Continua2 Continua2 movf Rand+1,w andlw b'11100000' movwf check4 rrf check4,f rrf check4,f rrf check4,f rrf check4,f rrf check4,f bcf check4,7 bcf check4,6 bcf check4,5 bcf check4,4 bcf check4,3 movf check4,w xorwf check1,w btfsc STATUS,Z goto Incr3 movf check4,w xorwf check2,w btfsc STATUS,Z goto Incr4 movf check4,w xorwf check3,w btfsc STATUS,Z goto Incr5 incf check4_prima,f goto Continua3 Incr3 incf check1_prima,f goto Continua3 Incr4 incf check2_prima,f goto Continua3 Incr5 incf check3_prima,f goto Continua3 Continua3 return Llegir_joc clrf Polsador ; Si aquest valor no es canvia és que no hi ha cap polsador premut 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 ; Comparació P1 movlw .220 ; Límit superior de P1 subwf ADRESH,w ; W = ADRESH - W btfsc STATUS,C ; C = 1 si ADRESH >= W goto NoP1_joc ; ADRESH >= W movlw .200 ; Límit inferior de P1 subwf ADRESH,w ; W = ADRESH - W btfss STATUS,C ; C = 1 si ADRESH >= W goto NoP1_joc ; ADRESH < W movlw b'00000001' ; Polsador P1 movwf Polsador ; Ho copia a Polsador incf Contador,f goto NoP5_joc NoP1_joc ; Comparació P2 movlw .194 ; Límit superior de P2 subwf ADRESH,w ; W = ADRESH - W btfsc STATUS,C ; C = 1 si ADRESH >= W goto NoP2_joc ; ADRESH >= W movlw .174 ; Límit inferior de P2 subwf ADRESH,w ; W = ADRESH - W btfss STATUS,C ; C = 1 si ADRESH >= W goto NoP2_joc ; ADRESH < W movlw b'00000010' ; Polsador P2 movwf Polsador ; Ho copia a Polsador incf Contador+1,f goto NoP5_joc NoP2_joc ; Comparació P3 movlw .163 ; Límit superior de P3 subwf ADRESH,w ; W = ADRESH - W btfsc STATUS,C ; C = 1 si ADRESH >= W goto NoP3_joc ; ADRESH >= W movlw .143 ; Límit inferior de P3 subwf ADRESH,w ; W = ADRESH - W btfss STATUS,C ; C = 1 si ADRESH >= W goto NoP3_joc ; ADRESH < W movlw b'00000100' ; Polsador P3 movwf Polsador ; Ho copia a Polsador incf Contador+2,f goto NoP5_joc NoP3_joc ; Comparació P4 movlw .90 ; Límit superior de P4 subwf ADRESH,w ; W = ADRESH - W btfsc STATUS,C ; C = 1 si ADRESH >= W goto NoP4_joc ; ADRESH >= W movlw .70 ; Límit inferior de P4 subwf ADRESH,w ; W = ADRESH - W btfss STATUS,C ; C = 1 si ADRESH >= W goto NoP4_joc ; ADRESH < W movlw b'00001000' ; Polsador P4 movwf Polsador ; Ho copia a Polsador incf Contador+3,f goto NoP5_joc NoP4_joc ; Comparació P5 movlw .55 ; Límit superior de P5 subwf ADRESH,w ; W = ADRESH - W btfsc STATUS,C ; C = 1 si ADRESH >= W goto NoP5_joc ; ADRESH >= W movlw .35 ; Límit inferior de P5 subwf ADRESH,w ; W = ADRESH - W btfss STATUS,C ; C = 1 si ADRESH >= W goto NoP5_joc ; ADRESH < W movlw b'00010000' ; Polsador P5 movwf Polsador ; Ho copia a Polsador NoP5_joc return EnviaR16 ; Envia 16 bits a un registre de desplaçament ; Els bits estan a les variables Sortida (bits menys significatius) ; i Sortida+1 ; Al final de la funció, el valor de Sortida queda corromput ; Si es vol conservar, cal copiar-lo a una altra variable bcf Port,5 ; S'assegura que Clock està desactivat bcf Port,6 ; S'assegura que Latch està desactivat ; En cas contrari, els bits enviats es copiarien ; immediatament a les sortides movf Port,w ; Agafa el valor de Port movwf PORTB ; I el posa al port B movlw .16 ; Número de bits a enviar movwf Compta ; Variable per comptar els bits BucleR16 bcf Port,4 ; Desactiva Data. Si toca activar-ho, ja ho farem rlf Sortida,f ; Fa sortir el bit de més a l'esquerra cap a C ; i roda els altres a l'esquerra rlf Sortida+1,f ; Fa sortir el bit de més a l'esquerra cap a C ; i roda els altres a l'esquerra btfsc STATUS,C ; Mira si el bit de l'esquerra era un 1 bsf Port,4 ; Si era 1, activa Data movf Port,w ; Agafa el valor de Port. El valor que ha canviat és Data movwf PORTB ; I el posa al port B bsf Port,5 ; Activa Clock, forçant a llegir el bit movf Port,w ; Agafa el valor de Port. El valor que ha canviat és Clock movwf PORTB ; I el posa al port B bcf Port,5 ; Desactiva Clock movf Port,w ; Agafa el valor de Port. El valor que ha canviat és Clock movwf PORTB ; I el posa al port B decfsz Compta,f ; Decrementa Compta goto BucleR16 ; Si Compta no és zero, repeteix el bucle bsf Port,6 ; Torna a activar Latch. Els valors es copiaran a la sortida del registre movf Port,w ; Agafa el valor de Port. El valor que ha canviat és Latch movwf PORTB ; I el posa al port B return TocaNotaTresillo 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 movlw .85 ; 1/3 de negra movwf Retard2 movlw .1 ; multiplica per 4 els 0,2s call Rets ; Espera 0,8. 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 movlw .85 ; 1/3 d'una negra movwf Retard2 movlw .1 call Rets ; Espera 0,2 s return TocaNotaCorcheapunto 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 movlw .1 ; multiplica per 4 els 0,2 s call Rets ; Espera 0,8. movlw .128 movwf Retard2 movlw .1 call Rets 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 movlw .85 ; 1/3 d'una negra movwf Retard2 movlw .1 call Rets ; Espera 0,2 s return TocaNotaBlanca 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 movlw .4 ; multiplica per 4 els 0,2s call Rets ; Espera 0,8. 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 movlw .1 call Rets ; Espera 0,2 s return TocaNotaNegra 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 movlw .128 movwf Retard2 movlw .2 call Rets ; 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 movlw .128 movwf Retard2 movlw .1 call Rets ; Espera 0,2 s return end

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