Aquest grup va plantejar quatre nivells de joc:
| Nivell | Colors | Tirades | Colors repetits | Indicació de quins colors són encertats |
| 1 | 5 | 3 | No | Sí |
| 2 | 7 | 5 | No | Sí |
| 3 | 7 | 5 | Sí | Sí |
| 4 | 7 | 10 | Sí | 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 Port ; Bits a enviar al port B Compta ; Variable per comptar els bits LED4 ; Variable per comptar els cops que hem premut cada LED LED3 LED2 LED1 VAR4 ; Variables amb els colors aleatoris VAR3 VAR2 VAR1 LEDact ; Variable per guardar el resultat a l'hora de comprar LED i VAR (variable auxiliar) alet ; Variable per guardar el resultat de l'aleatori a l'hora de formar-lo (variable auxiliar) Interm ; Variable equivalent a Sortida+1 però amb els monocroms encesos intermitents i fixes Mode ; Variable per triar Mode de joc Jugada ; Variable per comptar les tirades d'una partida Comp ; Variable per comprovar si els 4 monocroms gros estan encesos Rend ; Variable per a la rendició Actual:2 ; Variables per guardar el resultat que es mostra en els LED tricolor ; Actual servirà per mostrar també el monocrom grocs fixos punter:2 ; punter per fer l'adreçament indirecte i marcar els LED ; punter+1 per fer l'adreçament indirecte i marcar les VAR Rand:2 ; Dos bytes on guardarem el valor aleatori Auxrand:2 ; Variable auxiliar per a Random Sortida:2 ; Valors a enviar al registre de desplaçament ; Sortida+1 correspon als bits del 8 al 15 i Sortida als bits del 0 al 7 ; Sortida+1 Sortida ; R3 G3 B3 R2 G2 B2 R1 G1 B1 R0 G0 B0 M3 M2 M1 M0 Polsador ; Variable que conté un bit per a cada polsador per saber si està premut Retard1 ; Variables per al bucle de retard Retard2 fix ; Comptador de colors encertats en la posició nofix ; Comptador de colors encertats Fix ; Variable amb els LED monocrom grocs encesos de manera continua Tots ; Variable amb els LED monocrom grocs encesos tant de manera continua com intermitent Ret1 ; Variables de retard Ret2 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 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'00000100' movwf ANSEL ; Posa AN2 com entrada analògica bcf STATUS,RP0 bcf STATUS,RP1 ; Tria el banc 0 movlw b'00001001' ; activa el conversor A/D connectat a AN2 movwf ADCON0 ; amb el resultat justificat per l'esquerra Reinici 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 clrf PORTC ; Apaga els LED vermells clrf LED4 ; Posa a zero el comptador clrf LED3 ; Posa a zero el comptador clrf LED2 ; Posa a zero el comptador clrf LED1 ; Posa a zero el comptador clrf Rend ; Posa a zero el comptador per a la Rendició clrf Jugada ; Posa a zero el comptador de les jugades fetes 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 clrf Sortida clrf Sortida+1 call EnviaR16 call Rets call Rets call Rets call Rets call Rets AZero movlw b'00000001' ; Sempre que reiniciarem el joc o quan haguem arribat al 4 LED vermell, es començarà amb el primer LED movwf Mode MJoc call Rets movf Mode,w movwf PORTC btfsc PORTA,3 ; Mirem si s'ha premut el polsador, si no és el cas, mirem si toca començar la partida goto Partida bcf STATUS,C rlf Mode,f ; Si s'havia premut el polsador encenem el següent LED (si és el 4t, tornem al 1r) btfsc Mode,4 goto AZero goto MJoc Partida call Rets call Llegir ; Mirem si s'ha premut el primer polsador de la placa gran btfss Polsador,4 goto MJoc ; Si no s'ha premut continuem triant mode btfsc Mode,0 ; Mirem en quin mode ens trobem goto Mode1 btfsc Mode,1 ; Mirem en quin mode ens trobem goto Mode2 btfsc Mode,2 ; Mirem en quin mode ens trobem goto Mode3 btfsc Mode,3 ; Mirem en quin mode ens trobem goto Mode4 Mode1 Aleatorinum11 call Random ; Cridem la funció Random per obtenir un valor aleatori movf Rand,w ; Ho guardem a l'acumulador andlw b'00000111' ; Ho multipliquem per tal d'agafar només els tres últims números que són els que ens interessen movwf alet btfsc STATUS,Z ; Comprovem que no siguin 0 tots tres, si ho són, agafem un altre número aleatori goto Aleatorinum11 movlw b'00000110' xorwf alet,w btfsc STATUS,Z ; Comprovem que no sigui el color cian goto Aleatorinum11 movlw b'00000111' xorwf alet,w btfsc STATUS,Z ; Comprovem que no sigui el color blanc goto Aleatorinum11 movf alet,w movwf VAR1 ; Ho guardem a la variable1 Aleatorinum21 call Random movf Rand,w andlw b'00000111' movwf alet btfsc STATUS,Z goto Aleatorinum21 movf alet,w xorwf VAR1,w btfsc STATUS,Z ; Comprovem que no sigui el mateix color que VAR1 goto Aleatorinum21 movlw b'00000110' xorwf alet,w btfsc STATUS,Z goto Aleatorinum21 movlw b'00000111' xorwf alet,w btfsc STATUS,Z goto Aleatorinum21 movf alet,w movwf VAR2 Aleatorinum31 call Random movf Rand,w andlw b'00000111' movwf alet btfsc STATUS,Z goto Aleatorinum31 movf alet,w xorwf VAR1,w btfsc STATUS,Z goto Aleatorinum31 movf alet,w xorwf VAR2,w btfsc STATUS,Z goto Aleatorinum31 movlw b'00000110' xorwf alet,w btfsc STATUS,Z goto Aleatorinum31 movlw b'00000111' xorwf alet,w btfsc STATUS,Z goto Aleatorinum31 movf alet,w movwf VAR3 Aleatorinum41 call Random movf Rand,w andlw b'00000111' movwf alet btfsc STATUS,Z goto Aleatorinum41 movf alet,w xorwf VAR1,w btfsc STATUS,Z goto Aleatorinum41 movf alet,w xorwf VAR2,w btfsc STATUS,Z goto Aleatorinum41 movf alet,w xorwf VAR3,w btfsc STATUS,Z goto Aleatorinum41 movlw b'00000110' xorwf alet,w btfsc STATUS,Z goto Aleatorinum41 movlw b'00000111' xorwf alet,w btfsc STATUS,Z goto Aleatorinum41 movf alet,w movwf VAR4 Bucle1 call Rets call Rendicio ; Cridem rendició per saber si s'ha donat l'ordre de rendir-se o no btfsc Rend,0 goto Reinici movf Jugada,w xorlw b'00000011' ; Mirem que no sigui 4 (màxim 3 jugades) btfsc STATUS,Z goto Perdre ; Si era 4 se'ns han acabat les jugades call Llegir ; Llegeix els polsadors movf Polsador,w xorlw b'00010000' ; Mirem si s'ha premut l'1 btfss STATUS,Z ; Si és el 1, salta goto si21 ; No és l'1, mirem si es el 2 incf LED1,f ; Incrementa el valor del comptador movf LED1,w xorlw b'00000110' ; Si és 6 (límit 5 colors) el posem a zero btfsc STATUS,Z clrf LED1 goto Encendre1 ; Encenem el LED tricolor si21 movf Polsador,w xorlw b'00001000' btfss STATUS,Z goto si31 incf LED2,f movf LED2,w xorlw b'00000110' btfsc STATUS,Z clrf LED2 goto Encendre1 si31 movf Polsador,w xorlw b'00000100' btfss STATUS,Z goto si41 incf LED3,f movf LED3,w xorlw b'00000110' btfsc STATUS,Z clrf LED3 goto Encendre1 si41 movf Polsador,w xorlw b'00000010' btfss STATUS,Z goto si51 incf LED4,f movf LED4,w xorlw b'00000110' btfsc STATUS,Z clrf LED4 goto Encendre1 si51 movlw b'00000011' movwf punter ; Posem punter a 3 movf Polsador,w xorlw b'00000001' ; Mirem si s'ha premut el 5 btfss STATUS,Z ; Si és el 5, salta goto Bucle1 ; Si no s'ha premut tornem a Bucle1 per continuar mirant quin polsador és incf Jugada,f ; Cada cop que torna al Bucle1, una nova jugada Comparar1 movf punter,w movwf punter+1 ; Igualem punters movlw LED4 ; Copia la posició de la variable a l'acumulador addwf punter,w ; Suma la variable(punter) amb l'acumulador i guarda el resultat a l'acumulador movwf FSR ; Ho guarda al registre d'adreçament indirecte movf INDF,w ; Guardem l'acumulador a l'adreça indirecta movwf LEDact ; Copia el valor de l'acumulador a LEDact movlw VAR4 addwf punter,w movwf FSR movf INDF,w xorwf LEDact,w ; Funció exclusiva entre la variable i l'acumulador i guarda el resultat a l'acumulador btfsc STATUS,Z ; Si no són iguals salta goto Iguals1 Noiguals1 movf punter+1,w btfsc STATUS,Z ; Mirem que punter+1 no sigui 0 call Restaurar1 ; Si ho és el posarem a 4, per decrementar-lo just després decf punter+1,f ; Decrementar punter+1 movf punter,w ; Copiem punter a l'acumulador xorwf punter+1,w ; Comparem punter+1 i punter btfsc STATUS,Z ; Si són diferents salta goto Tornar1 ; Si són iguals va a la funció tornar, hem fet tota la volta ; Ara compararem variables movlw LED4 ; Copia la posició de la variable a l'acumulador addwf punter,w ; Suma la variable(punter) amb l'acumulador i guarda el resultat a l'acumulador movwf FSR movf INDF,w movwf LEDact movlw VAR4 addwf punter+1,w ; En aquest cas sumem punter+1 movwf FSR movf INDF,w xorwf LEDact,w btfsc STATUS,Z goto Intermitent1 ; Si són iguals va Intermitent1 (no es repeteixen colors a la combinació) goto Noiguals1 ; si no ho són, continua comprovant Tornar1 movf punter,w btfsc STATUS,Z ; Mirem que el comptador no sigui 0 goto Alterna1 ; Si és 0 mostra decf punter,f ; Sinó decrementa punter goto Comparar1 ; I tornem a comparar Intermitent1 movlw LED4 ; Tindrem en compte la possibilitat de colors repetits en la proposta de solució addwf punter+1,w movwf FSR movf INDF,w movwf LEDact movlw VAR4 addwf punter+1,w movwf FSR movf INDF,w xorwf LEDact,w btfsc STATUS,Z goto Tornar1 movlw b'00000000' ; Encenem intermitentment el LED monocrom groc que toqui xorwf punter,w btfsc STATUS,Z bsf Interm,0 movlw b'00000001' xorwf punter,w btfsc STATUS,Z bsf Interm,1 movlw b'00000010' xorwf punter,w btfsc STATUS,Z bsf Interm,2 movlw b'00000011' xorwf punter,w btfsc STATUS,Z bsf Interm,3 goto Tornar1 Alterna1 movf Interm,w ; Copiar la variable Interm, que conté la posició dels LED de Sortida més el marcats, a l'acumulador movwf Sortida ; Copiar Interm a Sortida movf Actual+1,w ; El mateix per a Sortida+1 movwf Sortida+1 call EnviaR16 call Rets movf Actual,w ; Copiar la variable actual, que conté la posició dels LED de Sortida, a l'acumulador movwf Sortida ; Copiar Actual a Sortida movf Actual+1,w ; El mateix per a Sortida+1 movwf Sortida+1 call EnviaR16 ; Ho enviem als LED clrf Comp call Encerts ; Mirem si s'han encertat la combinació movlw b'00001111' xorwf Comp btfsc STATUS,Z goto Guanyar ; Anem a Guanyar call Rets call Llegir movf Polsador,w btfsc STATUS,Z ; Si no hi ha cap polsador premut, alternem, sinó anem al bucle goto Alterna1 goto Bucle1 Iguals1 movf punter,w xorlw d'0' btfsc STATUS,Z call AC03 ; Activa Actual i Interm segons el monocrom groc que toqui movf punter,w xorlw d'1' btfsc STATUS,Z call AC13 movf punter,w xorlw d'2' btfsc STATUS,Z call AC23 movf punter,w xorlw d'3' btfsc STATUS,Z call AC33 movf punter,w btfsc STATUS,Z goto Alterna1 decf punter,f goto Comparar1 ; Si no és 0, continuem comprovant Encendre1 movf LED1,w ; Fem que mostri el LED1 movent els bits de LED a la sortida que pertoca movwf Sortida bcf STATUS,C rlf Sortida, f ; Anem desplaçant de posició primer Sortida i després Sortida+1 perquè no es trepitgin rlf Sortida+1,f ; En total ho farem tres vegades, per moure els tres bits de LED bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f movf LED2,w iorwf Sortida,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f movf LED3,w iorwf Sortida,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f movf LED4,w iorwf Sortida,f bcf STATUS,C rlf Sortida, f ; Aquest cop seran quatre, pels quatre monocroms grocs rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f movf Sortida,w movwf Actual ; Ho guardem a Actual, Actual+1 i Interm per tal que no se'ns esborri la informació movf Sortida,w movwf Interm movf Sortida+1,w movwf Actual+1 call Rets ; Espera 1 s call EnviaR16 goto Bucle1 ; I repetim-ho... Mode2 Aleatorinum1 call Random movf Rand,w andlw b'00000111' btfsc STATUS,Z goto Aleatorinum1 movwf VAR1 Aleatorinum2 call Random movf Rand,w andlw b'00000111' movwf alet btfsc STATUS,Z goto Aleatorinum2 movf alet,w xorwf VAR1,w btfsc STATUS,Z goto Aleatorinum2 movf alet,w movwf VAR2 Aleatorinum3 call Random movf Rand,w andlw b'00000111' movwf alet btfsc STATUS,Z goto Aleatorinum3 movf alet,w xorwf VAR1,w btfsc STATUS,Z goto Aleatorinum3 movf alet,w xorwf VAR2,w btfsc STATUS,Z goto Aleatorinum3 movf alet,w movwf VAR3 Aleatorinum4 call Random movf Rand,w andlw b'00000111' movwf alet btfsc STATUS,Z goto Aleatorinum4 movf alet,w xorwf VAR1,w btfsc STATUS,Z goto Aleatorinum4 movf alet,w xorwf VAR2,w btfsc STATUS,Z goto Aleatorinum4 movf alet,w xorwf VAR3,w btfsc STATUS,Z goto Aleatorinum4 movf alet,w movwf VAR4 goto Bucle3 ; Bucle mode 2 i mode 3 són iguals pel que fa a Bucles de polsadors i verificació Mode3 call Aleatorinum13 call Aleatorinum23 call Aleatorinum33 call Aleatorinum43 Bucle3 ; Funcionament semblat al del mode 1 call Rets call Rendicio btfsc Rend,0 goto Reinici movf Jugada,w xorlw b'00000101' ; Mirem que no sigui 6 (màxim 5 jugades) btfsc STATUS,Z goto Perdre call Llegir movf Polsador,w xorlw b'00010000' btfss STATUS,Z goto si23 incf LED1,f movf LED1,w xorlw b'00001000' ; Límit del comptador a 8, disposarem de 7 colors btfsc STATUS,Z clrf LED1 goto Encendre3 si23 movf Polsador,w xorlw b'00001000' btfss STATUS,Z goto si33 incf LED2,f movf LED2,w xorlw b'00001000' btfsc STATUS,Z clrf LED2 goto Encendre3 si33 movf Polsador,w xorlw b'00000100' btfss STATUS,Z goto si43 incf LED3,f movf LED3,w xorlw b'00001000' btfsc STATUS,Z clrf LED3 goto Encendre3 si43 movf Polsador,w xorlw b'00000010' btfss STATUS,Z goto si53 incf LED4,f movf LED4,w xorlw b'00001000' btfsc STATUS,Z clrf LED4 goto Encendre3 si53 movlw b'00000011' movwf punter movf Polsador,w xorlw b'00000001' btfss STATUS,Z goto Bucle3 incf Jugada,f Comparar3 movf punter,w movwf punter+1 movlw LED4 addwf punter,w movwf FSR movf INDF,w movwf LEDact movlw VAR4 addwf punter,w movwf FSR movf INDF,w xorwf LEDact,w btfsc STATUS,Z goto Iguals3 Noiguals3 movf punter+1,w btfsc STATUS,Z call Restaurar3 decf punter+1,f movf punter,w xorwf punter+1,w btfsc STATUS,Z goto Tornar3 movlw LED4 addwf punter,w movwf FSR movf INDF,w movwf LEDact movlw VAR4 addwf punter+1,w movwf FSR movf INDF,w xorwf LEDact,w btfsc STATUS,Z goto Intermitent3 goto Noiguals3 Tornar3 movf punter,w btfsc STATUS,Z goto Alterna3 decf punter,f goto Comparar3 Intermitent3 movlw LED4 addwf punter+1,w movwf FSR movf INDF,w movwf LEDact movlw VAR4 addwf punter+1,w movwf FSR movf INDF,w xorwf LEDact,w btfsc STATUS,Z goto Tornar3 movlw b'00000000' xorwf punter,w btfsc STATUS,Z bsf Interm,0 movlw b'00000001' xorwf punter,w btfsc STATUS,Z bsf Interm,1 movlw b'00000010' xorwf punter,w btfsc STATUS,Z bsf Interm,2 movlw b'00000011' xorwf punter,w btfsc STATUS,Z bsf Interm,3 goto Tornar3 Alterna3 movf Interm,w movwf Sortida movf Actual+1,w movwf Sortida+1 call EnviaR16 call Rets movf Actual,w movwf Sortida movf Actual+1,w movwf Sortida+1 call EnviaR16 clrf Comp call Encerts movlw b'00001111' xorwf Comp btfsc STATUS,Z goto Guanyar call Rets call Llegir movf Polsador,w btfsc STATUS,Z goto Alterna3 goto Bucle3 Iguals3 movf punter,w xorlw d'0' btfsc STATUS,Z call AC03 movf punter,w xorlw d'1' btfsc STATUS,Z call AC13 movf punter,w xorlw d'2' btfsc STATUS,Z call AC23 movf punter,w xorlw d'3' btfsc STATUS,Z call AC33 movf punter,w btfsc STATUS,Z goto Alterna3 decf punter,f goto Comparar3 Encendre3 movf LED1,w movwf Sortida bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f movf LED2,w iorwf Sortida,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f movf LED3,w iorwf Sortida,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f movf LED4,w iorwf Sortida,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f movf Sortida,w movwf Actual movf Sortida,w movwf Interm movf Sortida+1,w movwf Actual+1 call Rets call EnviaR16 goto Bucle3 Mode4 call Aleatorinum13 ; El mode 4 té una combinació de 7 colors amb la opció de repetir-ne, per tant és com el mode 3 call Aleatorinum23 call Aleatorinum33 call Aleatorinum43 Bucle4 call Rets call Rendicio btfsc Rend,0 goto Reinici movf Jugada,w xorlw b'00001010' ; Mirem que no sigui 11 (màxim 10 jugades) btfsc STATUS,Z goto Perdre call Llegir movf Polsador,w xorlw b'00010000' btfss STATUS,Z goto si24 incf LED1,f movf LED1,w xorlw b'00001000' btfsc STATUS,Z clrf LED1 goto Encendre4 si24 movf Polsador,w xorlw b'00001000' btfss STATUS,Z goto si34 incf LED2,f movf LED2,w xorlw b'00001000' btfsc STATUS,Z clrf LED2 goto Encendre4 si34 movf Polsador,w xorlw b'00000100' btfss STATUS,Z goto si44 incf LED3,f movf LED3,w xorlw b'00001000' btfsc STATUS,Z clrf LED3 goto Encendre4 si44 movf Polsador,w xorlw b'00000010' btfss STATUS,Z goto si54 incf LED4,f movf LED4,w xorlw b'00001000' btfsc STATUS,Z clrf LED4 goto Encendre4 si54 clrf fix ; Posem a 0 fix, que serà el comptador de LED correctes clrf nofix ; Posem a 0 nofix, que serà el comptador de LED amb el color correte i la posició incorrecta movlw b'00000000' movwf Fix ; Posem Fix a zero movlw b'00000000' movwf Tots ; Posem Tots a zero movlw b'00000011' movwf punter ; Posem punter a 3 movf Polsador,w xorlw b'00000001' ; Mirem si s'ha premut el 5 btfss STATUS,Z ; Si és el 5, salta goto Bucle4 incf Jugada,f ; Cada cop que torna al Bucle, una nova jugada Comparar4 ; Essencialment la comprovació és similar a la dels altres modes movf punter,w movwf punter+1 movlw LED4 addwf punter,w movwf FSR movf INDF,w movwf LEDact movlw VAR4 addwf punter,w movwf FSR movf INDF,w xorwf LEDact,w btfsc STATUS,Z goto Iguals4 Noiguals4 movf punter+1,w btfsc STATUS,Z call Restaurar4 decf punter+1,f movf punter,w xorwf punter+1,w btfsc STATUS,Z goto Tornar4 movlw LED4 addwf punter,w movwf FSR movf INDF,w movwf LEDact movlw VAR4 addwf punter+1,w movwf FSR movf INDF,w xorwf LEDact,w btfsc STATUS,Z goto Intermitent4 goto Noiguals4 Tornar4 movf punter,w btfsc STATUS,Z goto Alterna4 decf punter,f goto Comparar4 Intermitent4 movlw LED4 addwf punter+1,w movwf FSR movf INDF,w movwf LEDact movlw VAR4 addwf punter+1,w movwf FSR movf INDF,w xorwf LEDact,w btfsc STATUS,Z goto Tornar4 incf nofix,f ; Incrementem el comptador corresponent als colors encertats amb posició incorrecta bsf STATUS,C ; Posem els bits d'entrada a 1 per tal que poguem assegurar que entrem un 1 rlf Tots, f ; Movem un bit cap a la dreta a Tots (entrarà un 1) goto Tornar4 Alterna4 movf fix,w ; Copiem fix a l'acumulador xorlw d'1' ; El comparem amb 1 btfsc STATUS,Z ; Si no és 1, salta call F34 movf fix,w ; Copiem fix a l'acumulador xorlw d'2' ; El comparem amb 2 btfsc STATUS,Z ; Si no és 2, salta call F24 movf fix,w ; Copiem fix a l'acumulador xorlw d'3' ; El comparem amb 3 btfsc STATUS,Z ; Si no és 3, salta call F14 movf fix,w addwf nofix,f ; COMPTE! ara nofix és la suma de fix i nofix (màxim 4) movf nofix,w ; Copiem nofix a l'acumulador i fem el mateix que en el cas anterior xorlw d'1' btfsc STATUS,Z call NF34 movf nofix,w xorlw d'2' btfsc STATUS,Z call NF24 movf nofix,w xorlw d'3' btfsc STATUS,Z call NF14 movf Fix,w ; Copiem Fix a l'acumulador andlw b'00001111' ; Seleccionem només els 4 últims bits (els altres quedaran a 0) addwf Actual,f ; Sumem Actual i acumulador i ho guardem a Actual movf Tots,w ; Copiem Tots a l'acumulador andlw b'00001111' ; Seleccionem només els 4 últims bits (els altres quedaran a 0) addwf Interm,f ; Sumem Actual i acumulador i ho guardem a Interm Encen movf Interm,w movwf Sortida movf Actual+1,w movwf Sortida+1 call EnviaR16 call Rets movf Actual,w movwf Sortida movf Actual+1,w movwf Sortida+1 call EnviaR16 clrf Comp call Encerts movlw b'00001111' xorwf Comp btfsc STATUS,Z goto Guanyar call Rets call Llegir movf Polsador,w btfsc STATUS,Z goto Encen goto Bucle4 Iguals4 incf fix,f ; Incrementem el comptador dels LED totalment correctes bsf STATUS,C ; Posem tots els bits d'entrada a 1 rlf Tots, f ; Entra un 1 per la dreta bsf STATUS,C rlf Fix, f goto Tornar4 Encendre4 movf LED1,w movwf Sortida bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f movf LED2,w iorwf Sortida,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f movf LED3,w iorwf Sortida,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f movf LED4,w iorwf Sortida,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f movf Sortida,w movwf Actual movf Sortida,w movwf Interm movf Sortida+1,w movwf Actual+1 call Rets call EnviaR16 goto Bucle4 Perdre ; Toca la música de perdre call MostrarAleatori ; I mostra l'aleatori 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 TocaCorxera ; 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 TocaCorxera ; Toca la nota configurada 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 call TocaCorxeraPunt ; Toca la nota configurada 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 TocaSemi ; Toca la nota configurada 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 TocaNegra ; 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 TocaCorxera ; 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 TocaCorxera ; Toca la nota configurada movlw .149 ; Valor que correspon aproximadament a lab3 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 .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B call TocaCorxera ; Toca la nota configurada 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 TocaSemi ; 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 TocaSemi ; Toca la nota configurada 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 TocaNegra ; 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 .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B call TocaCorxera ; 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 TocaCorxera ; Toca la nota configurada 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 TocaCorxera ; 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 .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B call TocaSemi ; Toca la nota configurada movlw .133 ; Valor que correspon aproximadament a sib4 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 .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B call TocaSemi ; 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 .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B call TocaNegra ; Toca la nota configurada movlw .133 ; Valor que correspon aproximadament a sib4 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 .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B call TocaCorxera ; Toca la nota configurada movlw .149 ; Valor que correspon aproximadament a lab4 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 .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B call TocaCorxera ; Toca la nota configurada 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 TocaCorxera ; Toca la nota configurada movlw .200 ; Valor que correspon aproximadament a mib3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .100 ; 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 TocaSemi ; 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 TocaSemi ; Toca la nota configurada movlw .238 ; Valor que correspon aproximadament a do3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .19 ; 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 TocaNegra ; Toca la nota configurada goto Reinici Guanyar 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 TocaCorxera ; Toca la nota configurada movlw .224 ; Valor que correspon aproximadament a reb3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .112 ; 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 TocaCorxera ; Toca la nota configurada movlw .200 ; Valor que correspon aproximadament a mib3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .100 ; 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 TocaCorxeraPunt ; Toca la nota configurada movlw .149 ; Valor que correspon aproximadament a lab3 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 .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B call TocaSemi ; Toca la nota configurada movlw .149 ; Valor que correspon aproximadament a lab3 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 .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B call TocaNegra ; Toca la nota configurada 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 TocaCorxera ; 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 TocaCorxera ; Toca la nota configurada movlw .224 ; Valor que correspon aproximadament a reb3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .112 ; 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 TocaCorxera ; Toca la nota configurada movlw .200 ; Valor que correspon aproximadament a mib3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .100 ; 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 TocaSemi ; 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 TocaSemi ; Toca la nota configurada 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 TocaNegra ; 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 TocaCorxera ; Toca la nota configurada movlw .224 ; Valor que correspon aproximadament a reb3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .112 ; 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 TocaCorxera ; Toca la nota configurada movlw .200 ; Valor que correspon aproximadament a mib3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .100 ; 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 TocaCorxera ; Toca la nota configurada 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 TocaSemi ; Toca la nota configurada movlw .149 ; Valor que correspon aproximadament a lab3 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 .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B call TocaSemi ; Toca la nota configurada movlw .133 ; Valor que correspon aproximadament a sib3 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 .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B call TocaNegra ; Toca la nota configurada movlw .149 ; Valor que correspon aproximadament a lab3 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 .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B call TocaCorxera ; Toca la nota configurada 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 TocaCorxera ; Toca la nota configurada movlw .200 ; Valor que correspon aproximadament a mib3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .100 ; 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 TocaCorxera ; 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 TocaSemi ; Toca la nota configurada 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 TocaSemi ; Toca la nota configurada movlw .149 ; Valor que correspon aproximadament a lab3 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 .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B call TocaNegra ; Toca la nota configurada goto Reinici
Restaurar1 movlw b'00000100' movwf punter+1 ; Posem punter+1 a 4 return Restaurar3 movlw b'00000100' movwf punter+1 return Restaurar4 movlw b'00000100' movwf punter+1 return AC03 bsf Actual,0 bsf Interm,0 return AC13 bsf Actual,1 bsf Interm,1 return AC23 bsf Actual,2 bsf Interm,2 return AC33 bsf Actual,3 bsf Interm,3 return NF14 bcf STATUS,C ; Posem a 0 tots els bits d'entrada rlf Tots, f ; Correm un bit cap a la dreta i entra un 0 return NF24 bcf STATUS,C rlf Tots, f bcf STATUS,C rlf Tots, f return NF34 bcf STATUS,C rlf Tots, f bcf STATUS,C rlf Tots, f bcf STATUS,C rlf Tots, f return F14 bcf STATUS,C rlf Fix, f return F24 bcf STATUS,C rlf Fix, f bcf STATUS,C rlf Fix, f return F34 bcf STATUS,C rlf Fix, f bcf STATUS,C rlf Fix, f bcf STATUS,C rlf Fix, f return Encerts ; Mira si s'han encertat la combinació movf Actual,w ; Agafem Actual que conté els LED monocrom encesos de manera fixa andlw b'00001111' ; Concretament agafem els 4 últims bits que són els dels LED monocrom movwf Comp ; Ho guardem a Comp return Aleatorinum13 call Random ; Cridem la funció Random per obtenir un valor aleatori movf Rand,w ; Ho guardem a l'acumulador andlw b'00000111' ; Ho multipliquem per tal d'agafar només els tres últims números que són els que ens interessen movwf alet btfsc STATUS,Z ; Comprovem que no siguin 0 tots tres, si ho són, agafem un altre número aleatori goto Aleatorinum13 movf alet,w movwf VAR1 ; Ho guardem a la variable1 return Aleatorinum23 call Random movf Rand,w andlw b'00000111' movwf alet btfsc STATUS,Z goto Aleatorinum23 movf alet,w movwf VAR2 return Aleatorinum33 call Random movf Rand,w andlw b'00000111' movwf alet btfsc STATUS,Z goto Aleatorinum33 movf alet,w movwf VAR3 return Aleatorinum43 call Random movf Rand,w andlw b'00000111' movwf alet btfsc STATUS,Z goto Aleatorinum43 movf alet,w movwf VAR4 return MostrarAleatori incf Rend,f ; Incrementa la variable Rend movf VAR1,w movwf Sortida bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f movf VAR2,w iorwf Sortida,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f movf VAR3,w iorwf Sortida,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f movf VAR4,w iorwf Sortida,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f bcf STATUS,C rlf Sortida, f rlf Sortida+1,f call Rets call EnviaR16 call Rets call Rets call Rets call Rets call Rets return Rendicio btfsc PORTA,3 ; Mirem si s'ha premut el polsador de la placa verda return ; Si no és el cas, ja està call MostrarAleatori ; Si s'ha premut, mostra l'aleatori ; Toca música 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 TocaCorxera ; Toca la nota configurada movlw .224 ; Valor que correspon aproximadament a reb3 movwf ValPR2 ; Ho posem com a valor de PR2 movlw .112 ; 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 TocaCorxera ; 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 TocaCorxera ; Toca la nota configurada 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ó P5 movlw .220 ; Límit superior de P5 subwf ADRESH,w ; W = ADRESH - W btfsc STATUS,C ; C = 1 si ADRESH >= W goto NoP5 ; ADRESH >= W movlw .200 ; Límit inferior de P5 subwf ADRESH,w ; W = ADRESH - W btfss STATUS,C ; C = 1 si ADRESH >= W goto NoP5 ; ADRESH < W movlw b'00000001' ; Polsador P5 movwf Polsador ; Ho copia a Polsador goto NoP1 NoP5 ; Comparació P4 movlw .194 ; Límit superior de P4 subwf ADRESH,w ; W = ADRESH - W btfsc STATUS,C ; C = 1 si ADRESH >= W goto NoP4 ; ADRESH >= W movlw .174 ; Límit inferior de P4 subwf ADRESH,w ; W = ADRESH - W btfss STATUS,C ; C = 1 si ADRESH >= W goto NoP4 ; ADRESH < W movlw b'00000010' ; Polsador P4 movwf Polsador ; Ho copia a Polsador goto NoP1 NoP4 ; 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 ; 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 ; ADRESH < W movlw b'00000100' ; Polsador P3 movwf Polsador ; Ho copia a Polsador goto NoP1 NoP3 ; Comparació P2 movlw .90 ; Límit superior de P2 subwf ADRESH,w ; W = ADRESH - W btfsc STATUS,C ; C = 1 si ADRESH >= W goto NoP2 ; ADRESH >= W movlw .70 ; Límit inferior de P2 subwf ADRESH,w ; W = ADRESH - W btfss STATUS,C ; C = 1 si ADRESH >= W goto NoP2 ; ADRESH < W movlw b'00001000' ; Polsador P2 movwf Polsador ; Ho copia a Polsador goto NoP1 NoP2 ; Comparació P1 movlw .55 ; Límit superior de P1 subwf ADRESH,w ; W = ADRESH - W btfsc STATUS,C ; C = 1 si ADRESH >= W goto NoP1 ; ADRESH >= W movlw .35 ; Límit inferior de P1 subwf ADRESH,w ; W = ADRESH - W btfss STATUS,C ; C = 1 si ADRESH >= W goto NoP1 ; ADRESH < W movlw b'00010000' ; Polsador P1 movwf Polsador ; Ho copia a Polsador NoP1 return Rets ; Funció de retard de 0,2 s Bucles decfsz Retard1,f goto Bucles decfsz Retard2,f goto Bucles return 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 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 TocaSemi 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 .104 call Retm ; movlw .52 call Retm ; Espera 0,12 segons en total 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 .52 ; Silenci de 40 ms call Retm return TocaCorxera 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 .208 call Retm movlw .104 call Retm ; Espera 0,24 segons en total 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 .52 ; Silenci de 40 ms call Retm return TocaCorxeraPunt 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 .208 call Retm movlw .208 call Retm movlw .52 call Retm ; Espera 0,36 segons en total 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 .52 call Retm ; Silenci de 40 ms return TocaNegra 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 .208 call Retm movlw .208 call Retm movlw .208 call Retm ; Esperem 0,48 segons en total 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 .52 call Retm ; Silenci de 40 ms return Retm ; Funció de retard de milisegons movwf Ret2 Bucles2 decfsz Ret1,f goto Bucles2 decfsz Ret2,f goto Bucles2 return end

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