Aquest grup va plantejar tres nivells de joc predeterminats però també l'opció de fer-se el joc a mida. El següent gràfic mostra la seqüència que permet, amb els cinc polsadors, seleccionar els paràmetres del joc.

Els nivells predeterminats són:
| Nivell | Colors | Tirades |
| 1 | 5 | 8 |
| 2 | 7 i apagat | 6 |
| 3 | 7 i apagat | 4 |
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 Polsador ; Variable que cont un bit per a cada polsador per saber si està premut Retard1 ; Variable per al bucle de retard Retard2 ; Variable per al bucle de retard Retard3 ; Variable per al bucle de retard Port ; Variable interna de la funció EnviaR16 Sortida:2 ; Variable on es guarda la combinació per la funció EnviaR16 Compta ; Variable per comptar els bits a la funció EnviaR16 C1 ; Comptador del color del polsador 1 C2 ; Comptador del color del polsador 2 C3 ; Comptador del color del polsador 3 C4 ; Comptador del color del polsador 4 Co1 ; Color secret LED 1 Co2 ; Color secret LED 2 Co3:2 ; Color secret LED 3 Co4 ; Color secret LED 4 D1 ; Color del LED 1 D2 ; Color del LED 2 D3:2 ; Color del LED 3 D4 ; Color del LED 4 Comprova ; Variable per distingir tots els modes de joc Tirades ; Comptador de les tirades durant la partida ComptaReg ; Comptador usat per l'adregament indirecte So:2 ; Variable on fem els canvis de Sortida Encerts ; Variable per comprovar que es compleixen els dos bytes del tercer LED Rand:2 ; Dos bytes on guardarem el valor aleatori Auxrand:2 ; Variable auxiliar per a Random 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 Blanca ; Diferents durades de notes Negra corpunto semicor cor negrapunto Visualita ; Variable on guardem el que mostraran els LED Visualit CTirades ; Nombre màxim de tirades de la partida Conf ; Variable on s'emmagatzema la configuració de la partida anterior Colorins1 ; Variables per crear un color aleatori Colorins2 Colorins3 Colorins4 CuantosColorins ; Nmero de colors desitjats ColorinsN ; Valor del nombre aleatori 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 resistncies 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 freqncia
movlw b'00100000' ; Definim com volem les E/S del port C
movwf TRISC ; RC5 (sortida del PWM) com a entrada
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'00001000' ; Activa el bit 3
movwf Visualit ; Ho copia sobre la variable Visualit
clrf PORTC ; Apaga els LED
movlw .10 ; Retard de 2 s
call Rets
btfsc PORTA,3 ; Mira si està desactivada l'entrada A3
; Si està desactivada, no fa la instrucció segent
; Fa la instrucció si l'entrada està activada
goto $-1 ; Si no està premut, espera
btfss PORTA,3 ; Mira si està activada l'entrada A3
; Si està activada, no fa la instrucció segent
; Fa la instrucció si l'entrada està desactivada
goto $-1 ; Si està premut, espera
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
movlw b'00001001' ; Activa el conversor A/D connectat a AN2
movwf ADCON0 ; Amb el resultat justificat per l'esquerra
clrf So
clrf So+1
movf So,w ; Copia els valors de So i So+1 a Sortida i Sortida+1 perqu volem que inicialment siguin iguals
movwf Sortida
movf So+1,w
movwf Sortida+1
call EnviaR16 ; Ho envia al registre per a que tots els LED estiguin apagats inicialmente
movlw Tirades ; Començament de Repe per a posar totems les variables a zero
movwf FSR
movlw .16
movwf ComptaReg
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
Repe ; Inicialitza les variables a zero
clrf INDF
decf FSR,f
decfsz ComptaReg
goto Repe
movlw .6 ; Es guarden les diferents durades de les notes
movwf Blanca
movlw .3
movwf Negra
movlw .1
movwf semicor
movlw .2
movwf corpunto
movlw .5
movwf negrapunto
movlw .2
movwf cor
ModeJoc
call Llegir ; Llegeix els polsadors
movf Polsador,w
xorlw b'00010000' ; Mira si s'ha premut el 5
btfsc STATUS,Z ; Si és el 5, va a Salta
goto Salta
movf Polsador,w
xorlw b'00000100' ; Mira si s'ha premut el 3
btfsc STATUS,Z ; Si és el 3, va a Mode1
goto Mode1
movf Polsador,w
xorlw b'00000010' ; Mira si s'ha premut el 2
btfsc STATUS,Z ; Si és el 2, va a Mode2
goto Mode2
movf Polsador,w
xorlw b'00000001' ; Mira si s'ha premut el 1
btfsc STATUS,Z ; Si és el 1, va a Mode3
goto Mode3
movf Polsador,w
xorlw b'00001000' ; Mira si s'ha premut el 4
btfss STATUS,Z ; Si és el 4, va a ModeJoc
goto ModeJoc
call Potenciometre ; Guarda el valor del potenciòmetre a Visualita
movlw b'11100000' ; SUencén el primer LED en blanc
movwf Sortida+1
call EnviaR16
movf Visualita,w ; Guarda el valor de Visualita a CTirades
movwf CTirades
call RetM
call Potenciometre ; Guarda el valor del potenciòmetre a Visualita
movlw b'11111100' ; SUencén el segon LED en blanc
movwf Sortida+1
call EnviaR16
movf Visualita,w
xorlw .1 ; Compara Visualita amb 1
btfsc STATUS,Z ; Si són iguals, activa el bit quatre de Comprova
bsf Comprova,4 ; Si està activat, no sona el brunzidor
call RetM
call Potenciometre ; Guarda el valor del potenciòmetre a Visualita
movlw b'11111111' ; SUencén el tercer LED en blanc
movwf Sortida+1
movlw b'10000000'
movwf Sortida
call EnviaR16
movf Visualita,w
xorlw .1 ; Compara Visualita amb 1
btfsc STATUS,Z ; Si són iguals, activa el bit tres de Comprova
bsf Comprova,3 ; Si està activat, inicia el mode multijugador i no va a aleatori
call RetM
call Potenciometre ; Guarda el valor del potenciòmetre a Visualita
movlw b'11111111' ; SUencén el quart LED en blanc
movwf Sortida+1
movlw b'11110000'
movwf Sortida
call EnviaR16
movf Visualita,w
xorlw .4 ; Compara Visualita amb 4
btfsc STATUS,Z ; Si són iguals, va a Colors4
goto Colors4
movf Visualita,w
xorlw .5 ; Compara Visualita amb 5
btfsc STATUS,Z ; Si són iguals, va a Colors5
goto Colors5
movf Visualita,w
xorlw .6 ; Compara Visualita amb 6
btfsc STATUS,Z ; Si són iguals, va a Colors6
goto Colors6
movf Visualita,w
xorlw .7 ; Compara Visualita amb 7
btfsc STATUS,Z ; Si són iguals, va a Colors7
goto Colors7
movf Visualita,w
xorlw .8 ; Compara Visualita amb 8
btfsc STATUS,Z ; Si són iguals, va a Colors8
goto Colors8
goto Bucle
Salta ; Manté la configuració de l'última partida
clrf So
clrf So+1
call EnviaR16 ; Apaga tots els LED
movf Conf,w
movwf Comprova ; Guarda la configuració de la partida anterior a Comprova
btfsc Comprova,3 ; Si el bit corresponent al mode multijugador està activat sUinicia la partida
goto Bucle
btfsc Comprova,0 ; Sinó, va a l'aleatori corresponent
goto Colors4
btfsc Comprova,1
goto Colors5
btfsc Comprova,2
goto Colors6
btfsc Comprova,5
goto Colors7
goto Colors8
Mode1 ; Mode amb 8 tirades i 5 colors
movlw b'00001000'
movwf CTirades
goto Colors5
Mode2 ; Mode amb 6 tirades i 8 colors
movlw b'00000110'
movwf CTirades
bsf Comprova,4
goto Colors8
Mode3 ; Mode amb 4 tirades i 8 colors
movlw b'00000100'
movwf CTirades
bsf Comprova,4
goto Colors8
Colors8 ; Tots els colors possibles
btfsc Comprova,3 ; Comprova si està activat el bit corresponent al mode multijugador
goto Bucle ; Si està activat inicia la partida
movlw b'00001000' ; Indica el nmero de colors (8)
call RandomN ; Crida a la funció que genera un nmero aleatorique no supera el 7
movwf Colorins1 ; Guarda el resultat a Colorins1
; Repeteix la mateixa operació amb Colorins2,3 i 4
movlw b'00001000'
call RandomN
movwf Colorins2
movlw b'00001000'
call RandomN
movwf Colorins3
movlw b'00001000'
call RandomN
movwf Colorins4
movf Comprova,w ; Guarda la Configuració a Conf
movwf Conf
goto Aleatori ; Ho envia a Aleatori
Colors4
bsf Comprova,0 ; Activa el bit 0 de Comprova que després limita els colors dels LED a lUhora dUescollir-los
btfsc Comprova,3 ; Comprova si està activat el bit corresponent al mode multijugador
goto Bucle ; Si està activat inicia la partida
movlw b'00000100' ; Indica el nmero de colors (4)
call RandomN ; Crida a la funció que genera un nmero aleatorique no supera el 7
movwf Colorins1 ; Guarda el resultat a Colorins1
; Repeteix la mateixa operació amb Colorins2,3 i 4
movlw b'00000100'
call RandomN
movwf Colorins2
movlw b'00000100'
call RandomN
movwf Colorins3
movlw b'00000100'
call RandomN
movwf Colorins4
movf Comprova,w ; Guarda la Configuració a Conf
movwf Conf
goto Aleatori ; Ho envia a Aleatori
Colors5
bsf Comprova,1 ; Activa el bit 1 de Comprova que després limita els colors dels LED a lUhora dUescollir-los
btfsc Comprova,3 ; Comprova si està activat el bit corresponent al mode multijugador
goto Bucle ; Si està activat inicia la partida
movlw b'00000101' ; Indica el nmero de colors (5)
call RandomN ; Crida a la funció que genera un nmero aleatorique no supera el 7
movwf Colorins1 ; Guarda el resultat a Colorins1
; Repeteix la mateixa operació amb Colorins2,3 i 4
movlw b'00000101'
call RandomN
movwf Colorins2
movlw b'00000101'
call RandomN
movwf Colorins3
movlw b'00000101'
call RandomN
movwf Colorins4
movf Comprova,w ; Guarda la Configuració a Conf
movwf Conf
goto Aleatori ; Ho envia a Aleatori
Colors6
bsf Comprova,2 ; Activa el bit 2 de Comprova que després limita els colors dels LED a lUhora dUescollir-los
btfsc Comprova,3 ; Comprova si està activat el bit corresponent al mode multijugador
goto Bucle ; Si està activat inicia la partida
movlw b'00000110' ; Indica el nmero de colors (6)
call RandomN ; Crida a la funció que genera un nmero aleatorique no supera el 7
movwf Colorins1 ; Guarda el resultat a Colorins1
; Repeteix la mateixa operació amb Colorins2,3 i 4
movlw b'00000110'
call RandomN
movwf Colorins2
movlw b'00000110'
call RandomN
movwf Colorins3
movlw b'00000110'
call RandomN
movwf Colorins4
movf Comprova,w ; Guarda la Configuració a Conf
movwf Conf
goto Aleatori ; Ho envia a Aleatori
Colors7
bsf Comprova,5 ; Activa el bit 5 de Comprova que després limita els colors dels LED a lUhora dUescollir-los
btfsc Comprova,3 ; Comprova si està activat el bit corresponent al mode multijugador
goto Bucle ; Si està activat inicia la partida
movlw b'00000111' ; Indica el nmero de colors (7)
call RandomN ; Crida a la funció que genera un nmero aleatori que no supera el 7
movwf Colorins1 ; Guarda el resultat a Colorins1
; Repeteix la mateixa operació amb Colorins2,3 i 4
movlw b'00000111'
call RandomN
movwf Colorins2
movlw b'00000111'
call RandomN
movwf Colorins3
movlw b'00000111'
call RandomN
movwf Colorins4
movf Comprova,w ; Guarda la Configuració a Conf
movwf Conf
goto Aleatori ; Ho envia a Aleatori
Aleatori ; Crea la combinació secreta aleatòria comparant els valors de Colorins amb els números possibles (per exemple, si és 5: 0,1,2,3,4)
; I fa correspondre cada número a un color
movlw b'00000000' ; Compara el valor de Colorins1 amb cada nmero possible
xorwf Colorins1,w
btfsc STATUS,Z
bsf Co1,7 ; Si és 0, encén el primer LED de color blau
movlw b'00000001'
xorwf Colorins1,w
btfsc STATUS,Z
bsf Co1,6 ; Si és 1, encén el primer LED de color verd
movlw b'00000010'
xorwf Colorins1,w
btfsc STATUS,Z
bsf Co1,5 ; Si és 2, encén el primer LED de color vermell
movlw b'00000011'
xorwf Colorins1,w
btfsc STATUS,Z
bsf Co1,7 ; Si és 3, encén el primer LED de color cian
btfsc STATUS,Z
bsf Co1,6
movlw b'00000100'
xorwf Colorins1,w
btfsc STATUS,Z
bsf Co1,7 ; Si és 4, encén el primer LED de color Magenta
btfsc STATUS,Z
bsf Co1,5
movlw b'00000101'
xorwf Colorins1,w
btfsc STATUS,Z
bsf Co1,6 ; Si és 5, encén el primer LED de color groc
btfsc STATUS,Z
bsf Co1,5
movlw b'00000110'
xorwf Colorins1,w
btfsc STATUS,Z
bsf Co1,5 ; Si és 6, encén el primer LED de color blanc
btfsc STATUS,Z
bsf Co1,6
btfsc STATUS,Z
bsf Co1,7
; Apagat en el cas de que sigui 7
movlw b'00000000' ; Repeteix el procés amb els LED 2,3,4
xorwf Colorins2,w
btfsc STATUS,Z
bsf Co3,1
movlw b'00000001'
xorwf Colorins2,w
btfsc STATUS,Z
bsf Co3,0
movlw b'00000010'
xorwf Colorins2,w
btfsc STATUS,Z
bsf Co3+1,7
movlw b'00000011'
xorwf Colorins2,w
btfsc STATUS,Z
bsf Co3,1
btfsc STATUS,Z
bsf Co3,0
movlw b'00000100'
xorwf Colorins2,w
btfsc STATUS,Z
bsf Co3,1
btfsc STATUS,Z
bsf Co3+1,7
movlw b'00000101'
xorwf Colorins2,w
btfsc STATUS,Z
bsf Co3,0
btfsc STATUS,Z
bsf Co3+1,7
movlw b'00000110'
xorwf Colorins2,w
btfsc STATUS,Z
bsf Co3,1
btfsc STATUS,Z
bsf Co3,0
btfsc STATUS,Z
bsf Co3+1,7
movlw b'00000000'
xorwf Colorins3,w
btfsc STATUS,Z
bsf Co2,4
movlw b'00000001'
xorwf Colorins3,w
btfsc STATUS,Z
bsf Co2,3
movlw b'00000010'
xorwf Colorins3,w
btfsc STATUS,Z
bsf Co2,2
movlw b'00000011'
xorwf Colorins3,w
btfsc STATUS,Z
bsf Co2,4
btfsc STATUS,Z
bsf Co2,3
movlw b'00000100'
xorwf Colorins3,w
btfsc STATUS,Z
bsf Co2,4
btfsc STATUS,Z
bsf Co2,2
movlw b'00000101'
xorwf Colorins3,w
btfsc STATUS,Z
bsf Co2,3
btfsc STATUS,Z
bsf Co2,2
movlw b'00000110'
xorwf Colorins3,w
btfsc STATUS,Z
bsf Co2,4
btfsc STATUS,Z
bsf Co2,3
btfsc STATUS,Z
bsf Co2,2
movlw b'00000000'
xorwf Colorins4,w
btfsc STATUS,Z
bsf Co4,6
movlw b'00000001'
xorwf Colorins4,w
btfsc STATUS,Z
bsf Co4,5
movlw b'00000010'
xorwf Colorins4,w
btfsc STATUS,Z
bsf Co4,4
movlw b'00000011'
xorwf Colorins4,w
btfsc STATUS,Z
bsf Co4,6
btfsc STATUS,Z
bsf Co4,5
movlw b'00000100'
xorwf Colorins4,w
btfsc STATUS,Z
bsf Co4,6
btfsc STATUS,Z
bsf Co4,4
movlw b'00000101'
xorwf Colorins4,w
btfsc STATUS,Z
bsf Co4,5
btfsc STATUS,Z
bsf Co4,4
movlw b'00000110'
xorwf Colorins4,w
btfsc STATUS,Z
bsf Co4,5
btfsc STATUS,Z
bsf Co4,6
btfsc STATUS,Z
bsf Co4,4
goto Fi
Bucle ; S'inicia la partida
clrf Encerts ; Posem Encerts,So i So+1 a 0 cada cop que es comença el bucle
clrf So
clrf So+1
call Llegir ; Llegeix els polsadors
movf Polsador,w
xorlw b'00000001' ; Mira si s'ha premut el 1 (polsador lliure que serveix per comprovar)
btfsc STATUS,Z ; Si és el 1, va a Confirmar
goto Confirmar
movf Polsador,w
xorlw b'00000010' ; Mira si s'ha premut el 2 (corresponent al LED 4)
btfsc STATUS,Z ; Si és el 2, va a Led4
goto Led4
movf Polsador,w
xorlw b'00000100' ; Mira si s'ha premut el 3 (corresponent al LED 3)
btfsc STATUS,Z ; Si és el 2, va a Led3
goto Led3
movf Polsador,w
xorlw b'00001000' ; Mira si s'ha premut el 4 (corresponent al LED 2)
btfsc STATUS,Z ; Si és el 2, va a Led2
goto Led2
movf Polsador,w
xorlw b'00010000' ; Mira si s'ha premut el 5 (corresponent al LED 1)
btfsc STATUS,Z ; Si és el 2, va a Led1
goto Led1
goto Bucle ; Torna a començar si no s'ha premut cap
Led1
incf C1,f ; Incrementa el comptador cada cop que és premut
movlw .1 ; Mira si val 1, llavors el posarem Blau
xorwf C1,w
btfsc STATUS,Z
goto Blau1
movlw .2 ; Mira si val 2, llavors el posarem Verd
xorwf C1,w
btfsc STATUS,Z
goto Verd1
movlw .3 ; Mira si val 3, llavors el posarem Vermell
xorwf C1,w
btfsc STATUS,Z
goto Vermell1
movlw .4 ; Mira si val 4, llavors el posarem Cian
xorwf C1,w
btfsc STATUS,Z
goto Cian1
movlw .5 ; Mira si val 5, llavors el posarem Magenta
xorwf C1,w
btfsc STATUS,Z
goto Magenta1
movlw .6 ; Mira si val 6, llavors el posarem Groc
xorwf C1,w
btfsc STATUS,Z
goto Groc1
movlw .7 ; Mira si val 7, llavors el posarem Blanc
xorwf C1,w
btfsc STATUS,Z
goto Blanc1
movlw .8 ; Mira si val 8, llavors el posarem Negre
xorwf C1,w
btfsc STATUS,Z
goto Negre1
; I així successivament per a cada Led, que tindrà el seu mini-bucle per triar color.
Led2
incf C2,f
movlw .1
xorwf C2,w
btfsc STATUS,Z
goto Blau2
movlw .2
xorwf C2,w
btfsc STATUS,Z
goto Verd2
movlw .3
xorwf C2,w
btfsc STATUS,Z
goto Vermell2
movlw .4
xorwf C2,w
btfsc STATUS,Z
goto Cian2
movlw .5
xorwf C2,w
btfsc STATUS,Z
goto Magenta2
movlw .6
xorwf C2,w
btfsc STATUS,Z
goto Groc2
movlw .7
xorwf C2,w
btfsc STATUS,Z
goto Blanc2
movlw .8
xorwf C2,w
btfsc STATUS,Z
goto Negre2
Led3
incf C3,f
movlw .1
xorwf C3,w
btfsc STATUS,Z
goto Blau3
movlw .2
xorwf C3,w
btfsc STATUS,Z
goto Verd3
movlw .3
xorwf C3,w
btfsc STATUS,Z
goto Vermell3
movlw .4
xorwf C3,w
btfsc STATUS,Z
goto Cian3
movlw .5
xorwf C3,w
btfsc STATUS,Z
goto Magenta3
movlw .6
xorwf C3,w
btfsc STATUS,Z
goto Groc3
movlw .7
xorwf C3,w
btfsc STATUS,Z
goto Blanc3
movlw .8
xorwf C3,w
btfsc STATUS,Z
goto Negre3
Led4
incf C4,f
movlw .1
xorwf C4,w
btfsc STATUS,Z
goto Blau4
movlw .2
xorwf C4,w
btfsc STATUS,Z
goto Verd4
movlw .3
xorwf C4,w
btfsc STATUS,Z
goto Vermell4
movlw .4
xorwf C4,w
btfsc STATUS,Z
goto Cian4
movlw .5
xorwf C4,w
btfsc STATUS,Z
goto Magenta4
movlw .6
xorwf C4,w
btfsc STATUS,Z
goto Groc4
movlw .7
xorwf C4,w
btfsc STATUS,Z
goto Blanc4
movlw .8
xorwf C4,w
btfsc STATUS,Z
goto Negre4
; A les segents funcions activem i desactivem els diferents bits de la variable del color del LED corresponent
Blau1
bcf D1,5
bcf D1,6
bsf D1,7
goto Fi
Blau2
bsf D2,4
bcf D2,2
bcf D2,3
goto Fi
Blau3
bcf D3,0
bsf D3,1
bcf D3+1,7
goto Fi
Blau4
bcf D4,4
bcf D4,5
bsf D4,6
goto Fi
Verd1
bcf D1,7
bsf D1,6
bcf D1,5
goto Fi
Verd2
bcf D2,2
bsf D2,3
bcf D2,4
goto Fi
Verd3
bcf D3,1
bsf D3,0
bcf D3+1,7
goto Fi
Verd4
bcf D4,4
bsf D4,5
bcf D4,6
goto Fi
Vermell1
bsf D1,5
bcf D1,6
bcf D1,7
goto Fi
Vermell2
bsf D2,2
bcf D2,3
bcf D2,4
goto Fi
Vermell3
bcf D3,0
bcf D3,1
bsf D3+1,7
goto Fi
Vermell4
bcf D4,6
bcf D4,5
bsf D4,4
goto Fi
; Si està activat el bit 0 de Comprova (sUhan escolit 4 colors), es posa a zero el comptador i torna a començar
Cian1
bcf D1,5
bsf D1,6
bsf D1,7
btfsc Comprova,0
clrf C1
goto Fi
Cian2
bsf D2,4
bcf D2,2
bsf D2,3
btfsc Comprova,0
clrf C2
goto Fi
Cian3
bsf D3,0
bsf D3,1
bcf D3+1,7
btfsc Comprova,0
clrf C3
goto Fi
Cian4
bcf D4,4
bsf D4,5
bsf D4,6
btfsc Comprova,0
clrf C4
goto Fi
; Si està activat el bit 1 de Comprova (sUhan escolit 5 colors), es posa a zero el comptador i torna a començar
Magenta1
bsf D1,5
bcf D1,6
bsf D1,7
btfsc Comprova,1
clrf C1
goto Fi
Magenta2
bsf D2,4
bsf D2,2
bcf D2,3
btfsc Comprova,1
clrf C2
goto Fi
Magenta3
bcf D3,0
bsf D3,1
bsf D3+1,7
btfsc Comprova,1
clrf C3
goto Fi
Magenta4
bsf D4,4
bcf D4,5
bsf D4,6
btfsc Comprova,1
clrf C4
goto Fi
; Si està activat el bit 2 de Comprova (sUhan escolit 6 colors), es posa a zero el comptador i torna a començar
Groc1
bsf D1,5
bsf D1,6
bcf D1,7
btfsc Comprova,2
clrf C1
goto Fi
Groc2
bcf D2,4
bsf D2,3
bsf D2,2
btfsc Comprova,2
clrf C2
goto Fi
Groc3
bcf D3,1
bsf D3,0
bsf D3+1,7
btfsc Comprova,2
clrf C3
goto Fi
Groc4
bsf D4,5
bsf D4,4
bcf D4,6
btfsc Comprova,2
clrf C4
goto Fi
; Si està activat el bit 5 de Comprova (s'han escolit 7 colors), es posa a zero el comptador i torna a començar
Blanc1
bsf D1,5
bsf D1,6
bsf D1,7
btfsc Comprova,5
clrf C1
goto Fi
Blanc2
bsf D2,4
bsf D2,2
bsf D2,3
btfsc Comprova,5
clrf C2
goto Fi
Blanc3
bsf D3,0
bsf D3,1
bsf D3+1,7
btfsc Comprova,5
clrf C3
goto Fi
Blanc4
bsf D4,4
bsf D4,5
bsf D4,6
btfsc Comprova,5
clrf C4
goto Fi
; Posa a zero el comptador per a que torni a començar
Negre1
bcf D1,5
bcf D1,6
bcf D1,7
clrf C1
goto Fi
Negre2
bcf D2,4
bcf D2,2
bcf D2,3
clrf C2
goto Fi
Negre3
bcf D3,0
bcf D3,1
bcf D3+1,7
clrf C3
goto Fi
Negre4
bcf D4,4
bcf D4,5
bcf D4,6
clrf C4
goto Fi
Confirmar ; Comprova si s'han encertat els colors i sUencenen els LED grocs coresponents en el cas que s'hagin encertat
btfsc Comprova,3 ; Si està activat el bit 3 de Comprova (mode multijugador) va a Copiar
goto Copiar
movf Co1,w ; Copia el valor del color secret del LED 1 a l'acumulador
xorwf D1,w ; Compara el valor de l'acumulador amb el color coresponent
btfsc STATUS,Z
bsf So,3 ; Si són iguals, activa el LED groc 4
movf Co2,w ; Copia el valor del color secret del LED 2 a l'acumulador
xorwf D2,w ; Compara el valor de l'acumulador amb el color coresponent
btfsc STATUS,Z
bsf So,2 ; Si són iguals, activa el LED groc 3
movf Co3,w ; Copia el valor del color secrert del LED 3 a l'acumulador
xorwf D3,w ; Compara el valor de l'acumulador amb el color coresponent
btfsc STATUS,Z
bsf Encerts,0 ; Si són iguals, s'activa el primer bit de Encerts
movf Co3+1,w ; Copia el valor del color secret del LED 3 a l'acumulador
xorwf D3+1,w ; Compara el valor de l'acumulador amb el color coresponent
btfsc STATUS,Z
bsf Encerts,1 ; Si són iguals, s'activa el segon bit de Encerts
movlw b'00000011' ; Copia el valor
xorwf Encerts,w ; Compara el valor amb Encerts
btfsc STATUS,Z
bsf So,1 ; Si són iguals, activa el LED groc 2
movf Co4,w ; Copia el valor del color del LED 4 a l'acumulador
xorwf D4,w ; Compara el valor de l'acumulador amb el color coresponent
btfsc STATUS,Z
bsf So,0 ; Si són iguals, activa el LED groc 1
incf Tirades,f ; Incrementa el nmero de tirades
btfss So,0 ; Si està activat el LED groc 1 salta
goto Fi ; Sinó va a Fi
btfss So,1 ; Si està activat el LED groc 2 salta
goto Fi ; Sinó va a Fi
btfss So,2 ; Si està activat el LED groc 3 salta
goto Fi ; Sinó va a Fi
btfss So,3 ; Si està activat el LED groc 4 salta
goto Fi ; Sinó va a Fi
goto FinalBo ; Si estan tots els LED grocs encesos (ha encertat la combinació secreta), va a FinalBo
Copiar ; Només entra en el mode multijugador i guarda els colors dels LED a la combinació secreta
movf D1,w
movwf Co1
movf D2,w
movwf Co2
movf D3,w
movwf Co3
movf D3+1,w
movwf Co3+1
movf D4,w
movwf Co4
clrf D1 ; Un cop guardats es posen a zero per que s'apaguin
clrf D2
clrf D3
clrf D3+1
clrf D4
movf Comprova,w ; Guarda la configuració de la partida a Conf
movwf Conf
bcf Comprova,3 ; Desactiva el bit 3 de Comprova per a que no torni a entrar a Copiar
Fi
movf CTirades,w ; Compara el número de tirades màxim (CTirades) amb les que s'han jugat fins el moment (Tirades)
xorwf Tirades,w
btfsc STATUS,Z
goto FinalDolent ; Si són iguals (no ha encertat la combinació secreta en el nmero màxim de tirades), va a FinalDolent
call EncendreLeds ; Encén els LED
movf Tirades,w ; Mostra als LED vermells el número de tirades jugades fins el moment
movwf PORTC
call Rets
goto Bucle ; Torna a començar
FinalBo
clrf Tirades ; Posa a zero Tirades
movlw b'01000000' ; Encén els LED de color verd
movwf D1
movlw b'00001000'
movwf D2
movlw b'00000001'
movwf D3
movlw b'00000000'
movwf D3+1
movlw b'00100000'
movwf D4
call EncendreLeds
bcf STATUS,RP0
bsf STATUS,RP1 ; Tria el banc 2
movlw b'00000001'
movwf ANSEL ; Posa AN0 com entrada analògica
bcf STATUS,RP0
bcf STATUS,RP1 ; Tria el banc 0
movlw b'00000001' ; Activa el conversor A/D connectat a AN0
movwf ADCON0 ; Amb el resultat justificat per l'esquerra
btfss Comprova,4 ; Comprova si està activat el bit 4 de Comprova
call Campeones ; Si no està activat sona el brunzidor
goto Inici ; Torna a començar (nova partida)
FinalDolent
clrf Tirades ; Posa a zero Tirades
movf Co1,w ; Encén els LED amb la combinació secreta
movwf D1
movf Co2,w
movwf D2
movf Co3,w
movwf D3
movf Co3+1,w
movwf D3+1
movf Co4,w
movwf D4
call EncendreLeds
btfss Comprova,4 ; Comprova si està activat el bit 4 de Comprova
call Marcha_funebre ; Si no està activat sona el brunzidor
goto Inici ; Torna a començar (nova partida)
RandomN ; Crea un valor aleatori menor o igual al número que hi ha guardat a l'acumulador a l'hora de cridar la funció
movwf CuantosColorins ; Guarda el valor de l'acumulador (número de colors escollit) a CuantosColorins
RandomN1
call Random ; S'obtenen dos nombres aleatoris: Rand i Rand+1
movlw b'00000111' ; Fa la funció and entre Rand+1 i l'acumulador (b'00000111')
andwf Rand+1,w
movwf ColorinsN ; Guarda el resultat a ColorinsN
subwf CuantosColorins,w ; Li resta al valor obtingut el número de colors escollit (Cuantos Colorins)
btfsc STATUS,Z ; Si el resultat és zero (activa el bit Z), torna a generar un altre número aleatori (el que tenim és major que el número màxim de colors)
goto RandomN1
btfss STATUS,C ; Si el resultat és menor que zero (activa el bit C), guarda el valor obtingut abans de la resta (ColorinsN) a l'acumulador
goto RandomN1 ; Sinó, torna a generar un altre número aleatori
movf ColorinsN,w
return
Potenciometre
bcf STATUS,RP0
bsf STATUS,RP1 ; Tria el banc 2
movlw b'00000001'
movwf ANSEL ; Posa AN0 com entrada analògica
bcf STATUS,RP0
bcf STATUS,RP1 ; Tria el banc 0
movlw b'00000001' ; activa el conversor A/D connectat a AN0
movwf ADCON0 ; amb el resultat justificat per l'esquerra
movlw b'00000000' ; Activa el bit 3
movwf Visualita ; Ho copia sobre la variable Visualit
Bucle2
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
swapf ADRESH,w ; Copia els bits superiors a l'acumulador
movwf Visualita ; Ho copia a la variable Retard2
movwf PORTC ; Copia el resultat sobre els LED
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'00001000' ; Activa el bit 3
movlw .10 ; Retard de 2 s
call Rets
btfsc PORTA,3 ; Mira si està activada l'entrada A3
goto Potenciometre ; Si està premut, espera
movlw b'00001001' ; Activa el conversor A/D connectat a AN2
movwf ADCON0 ; Amb el resultat justificat per l'esquerra
movf Visualita,w ; Copia valor pot a acu
andlw b'00001111' ; Fa AND amb el valor de l'acumulador (Visualita) per a que es mantinguin els dels LED
movwf Visualita ; Copia el resultat a Visualita
clrf PORTC
return
EncendreLeds ; Copia els valors dels colors de cada LED a So i So+1 i a Sortida i Sortida+1 respectivament, i encén els LED
movf D1,w
iorwf So+1,f
movf D2,w
iorwf So+1,f
movf D3,w
iorwf So+1,f
movf D3+1,w
iorwf So,f
movf D4,w
iorwf So,f
movf So+1,w
movwf Sortida+1
movf So,w
movwf Sortida
call EnviaR16
return
Campeones
call Sol
movf corpunto,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Sol
movf semicor,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Sol
movf Blanca,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Mi
movf Negra,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Mi
movf corpunto,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Mi
movf semicor,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Mi
movf Blanca,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Do
movf Negra,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Do
movf Negra,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Re
movf Negra,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Re
movf Negra,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Sol
movf Negra,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Sol
movf Negra,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Mi
movf Blanca,w
movwf Retard3
call TocaNota ; Toca la nota configurada
return
Marcha_funebre
call Re
movf Blanca,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Re
movf negrapunto,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Re
movf semicor,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Re
movf Blanca,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Fa
movf negrapunto,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Mi
movf semicor,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Mi
movf negrapunto,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Re
movf semicor,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Re
movf negrapunto,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Re
movf semicor,w
movwf Retard3
call TocaNota ; Toca la nota configurada
call Re
movf Blanca,w
movwf Retard3
call TocaNota ; Toca la nota configurada
return
Llegir ; Funció aïllada que llegeix els polsadors
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 ; 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 ; ADRESH < W
movlw b'00000001' ; Polsador P1
movwf Polsador ; Ho copia a Polsador
goto NoP5
NoP1 ; 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 ; 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 ; ADRESH < W
movlw b'00000010' ; Polsador P2
movwf Polsador ; Ho copia a Polsador
goto NoP5
NoP2 ; 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 NoP5
NoP3 ; 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 ; 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 ; ADRESH < W
movlw b'00001000' ; Polsador P4
movwf Polsador ; Ho copia a Polsador
goto NoP5
NoP4 ; 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 ; 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 ; ADRESH < W
movlw b'00010000' ; Polsador P5
movwf Polsador ; Ho copia a Polsador
NoP5
return
EnviaR16 ; Envia 16 bits a un registre de desplaAament
; 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 - PER AIXÒ HEM CREAT So i So+1
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 mHs 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, forAant 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 ; 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
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
Rets ; Funció de retard
movwf Retard3
Bucles
decfsz Retard1,f
goto Bucles
decfsz Retard2,f
goto Bucles
return
Ret10ms
decfsz Retard1,f
goto Ret10ms
decfsz Retard2,f
goto Ret10ms
return
TocaNota
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 comparacis al Timer 2
bcf STATUS,RP0 ; Tria el banc 0
movf ValCCP1CON,w ; Agafa la configuració de CCP1CON
andlw b'11001111' ; Posa els bits que corresponen a DC1B a zero per precaució
movwf ValCCP1CON ; I ho torna a guardar
swapf ValDC1B,w ; Agafa el valor que ha d'anar a DC1B
; I el guarda, permutat, a W
; Els dos bits han de quedar a les posicions 4-5
andlw b'00110000' ; Posa els altres sis bits a zero per precaució
iorwf ValCCP1CON,w ; I ho afegeix a CCP1CON
movwf CCP1CON ; Ho posa com a configuració del PWM
movf ValCCPR1L,w ; Valor de CCPR1L
movwf CCPR1L ; Registre que ens dona l'amplada de tON
bcf PIR1,TMR2IF ; Desactiva el bit d'interrupció del Timer 2
bsf T2CON,TMR2ON ; Activa el Timer 2
; No convé engegar el PWM fins que el Timer 2 no ha fet un cicle
btfss PIR1,TMR2IF ; Espera l'activació del bit d'interrupció del Timer 2
goto $-1
bsf STATUS,RP0 ; Tria el banc 1
bcf TRISC,5 ; Posem RC5 (sortida del PWM) com a sortida
bcf STATUS,RP0 ; Tria el banc 0
call Rets1 ; Espera 0,2 s
bsf STATUS,RP0 ; Tria el banc 1
bsf TRISC,5 ; Posem RC5 (sortida del PWM) com a entrada
; Fem silenci
bcf STATUS,RP0 ; Tria el banc 0
call Ret10ms
return
Rets1 ; Funció de retard
movlw .30
movwf Retard2
Bucles1
decfsz Retard1,f
goto Bucles1
decfsz Retard2,f
goto Bucles1
decfsz Retard3,f
goto Bucles1
return
RetM ; Funció de retard
decfsz Retard1,f
goto RetM
decfsz Retard2,f
goto RetM
return
; Configuració de les diferents notes
Sol
movlw .158
movwf ValPR2
movlw .79
movwf ValCCPR1L
movlw .2
movwf ValDC1B
return
Fa
movlw .178
movwf ValPR2
movlw .89
movwf ValCCPR1L
movlw .2
movwf ValDC1B
return
Mi
movlw .189
movwf ValPR2
movlw .95
movwf ValCCPR1L
movlw .0
movwf ValDC1B
return
Re
movlw .212
movwf ValPR2
movlw .106
movwf ValCCPR1L
movlw .2
movwf ValDC1B
return
Do
movlw .238
movwf ValPR2
movlw .119
movwf ValCCPR1L
movlw .2
movwf ValDC1B
return
end

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