Aquest grup va plantejar quatre nivells de joc:
| Nivell | Colors | Colors repetits | Tirades | Indicació de quins colors són encertats |
| 1 | 7 | No | Sense límit | Sí |
| 2 | 7 | No | 10 | No |
| 3 | 7 | Sí | Sense límit | 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 |
Aquest programa ocupava més que els 2 kB disponibles a la primera pàgina de la memòria de programa. Per això s'ha hagut de posar una part del programa a la segona pàgina. 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 Retard1rand ; Variables de retard per a la generacio de colors aleatoris Retard2rand ; Variables de retard per a la generacio de colors aleatoris Retard3rand ; Variables de retard per a la generacio de colors aleatoris Port ; Bits a enviar al port B Sortida ; Valors a enviar al registre de desplaçament Sortida2 ; Sortida+1 correspon als bits del 8 al 15 iSortida als bits del 0 al 7 ; Sortida2 ; R3 G3 B3 R2 G2 B2 R1 G1B1 R0 G0 B0 M3 M2 M1 M0 Compta ; Variable per comptar els bitss'utilitza en el EnviaR16 Polsador ; Variable pel polsador comptador0 ; Hi han 4 comptadors, un per cada LED, laseva funcio es controlar quin color toca, cada cop que escanvii de color elcomptador comptador1 ; es decrementara fins que sigui zero llavorsli donarem el valor .6 de nou (hi ha 7 colors) perque tornial primer color comptador2 ; o sigui cada comptador te en cada moment el decimal correponent al color ences en aquest LED en concret comptador3 Retard1 ; variables que s'utilitzen en el bucle de retard Retard2 Retard3 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 colors1 ; com que quan la variable sortia i sortida2entren en el EnviaR16 queden corrompudes(no saps amb quinvalor te les ; deixa), necessitem colors2 ; aquestes dos variables per controlar elsbits que activem a cada LED i d'aqui ho passarem a lesvariables Sortida i ; Sortida2 ; Vaig canviar el nom de sortida+1 pel desortida2 en un intent desesperat quan no em funcionava el codi0 ; te el decimal corresponent al color guanyador del LED 0 codi1 ; te el decimal corresponent al color guanyador del LED 1 codi2 ; te el decimal corresponent al color guanyador del LED 2 codi3 ; te el decimal corresponent al color guanyador del LED 3 guardat ; aquesta la faig per saber si es el primercop que pulso el pulsador1.. osigui per distingir entreguardar la bona o fercheck Retardo2 ; variables deretard en enencendre els LED grocs Retardo1 ; variables deretard en enencendre els LED grocs mirar_apagat:2 ; variable per a comprovar que cap LED esta apagat passar_codi:2 ; variables per passar de els 16 bits que tenen la combinacio a encendre a els decimals guardats a cada codi varia ; ajuda a comptar els LED que haurem d'encendre intermitens variafix ; ajuda a comptar els LED que haurem d'encendre fixos fixos ; numero de LED monocroms que cal encendre fixos intermitents ; numero de LED monocroms que cal encendre intermitents polsadordigital ; variable pel polsador que canvia de nivell Previ ; I una amb l'estat previ del polsadordigital Visualit ; Una variable on guardem el que mostraran els LED que marquen el nivell Comptait ; Una variable per comptar iteracions per filtrar els rebots del polsador digital Retard1nivell ; variable per al retard del canvi de nivell Combiguanyadora:2 ; emmagatzema els bits que cal enviar per encendre la combinacio guanyadora nivell1 ; aquestes variables tenen l'ultim bit ences quan aquell nivell es l'ultim en el qual hem entrat nivell2 ; aquestes variables tenen l'ultim bit ences quan aquell nivell es l'ultim en el qual hem entrat nivell3 ; aquestes variables tenen l'ultim bit ences quan aquell nivell es l'ultim en el qual hem entrat nivell4 ; aquestes variables tenen l'ultim bit ences quan aquell nivell es l'ultim en el qual hem entrat intentsnivell2 ; comptador dels intents que portem en la partida. si arriba a 10 muerte. intentsnivell4 ; comptador dels intents que portem en la partida. si arriba a 10 muerte. Retard1g ; retard LED intermitents en guanyar Retard2g ; retard LED intermitents en guanyar fracasado ; al canviar de pagina emmagatzema cal, emmagatzema b'00000001' si fracasses i es 0 en cas contrari 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 portA com a entrada clrf TRISB ; Posa tots els bits del portB com a sortida clrf TRISC ; Posa tots els bits del portC 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 bcf STATUS,RP0 bsf STATUS,RP1 ; Tria el banc 2 movlw b'00000100' movwf ANSEL ; Posa AN2 com entrada an bcf STATUS,RP0 bcf STATUS,RP1 ; Tria el banc 0 clrf Comptait ; Posa el comptador d'iteracions per al polsadordigital a valor zero clrf Visualit ; Posa el comptador dels LED a valor zero clrf Previ ; L'estat previ del polsador és no premut clrf PORTC ; Aquest clear es perque inicialment no s'encenguin els LED vermells de la placa petita movlw b'00001001' ; activa el conversor A/Dconnectat a AN2 movwf ADCON0 ; amb el resultat justifi al'esquerra clrf Port ; Posa a zero tots els bitsde la variable Port movf Port,w movwf PORTB ; I ho envia al port B movlw d'6' movwf comptador0 ; donem el valor de 6 decimal alscomptadors perque tenim si colors movwf comptador1 movwf comptador2 ; donem el valor de 6 decimal alscomptadors perque tenim si colors movwf comptador3 movlw d'0' movwf guardat movlw b'00000000' ; aqui diem que els LED estiguininicialment apagats (per si a cas) movwf Sortida movwf Sortida2 movwf colors1 movwf colors2 clrf varia clrf variafix call EnviaR16 clrf nivell1 clrf nivell2 clrf nivell3 clrf nivell4 ; Triar_Nivell1 Bucle_canvi_nivell call Llegir movf Polsador,w xorlw b'00000001' btfsc STATUS,Z goto tria_nivells ; lectura del polsador petit call Llegirdigital ; aqui comença a fer els canvis quan ja confirma que ha estat premut movlw b'00000000' xorwf Visualit,w btfsc STATUS,Z goto encennivell1 movlw b'00000001' xorwf Visualit,w btfsc STATUS,Z goto encennivell2 movlw b'00000010' xorwf Visualit,w btfsc STATUS,Z goto encennivell3 movlw b'00000100' xorwf Visualit,w btfsc STATUS,Z goto encennivell4 movlw b'00001000' xorwf Visualit,w btfsc STATUS,Z goto encennivell1 goto encenLEDnivell encennivell1 movlw b'00000001' movwf Visualit goto encenLEDnivell encennivell4 movlw b'00001000' movwf Visualit goto encenLEDnivell encennivell3 movlw b'00000100' movwf Visualit goto encenLEDnivell encennivell2 movlw b'00000010' movwf Visualit encenLEDnivell movf Visualit,w ; Copia Visualit a l'acumulador movwf PORTC ; I ho posa als LED goto Bucle_canvi_nivell tria_nivells ; aqui entra quan ja hem polsat el 5è de la placa gran movlw b'00000001' xorwf Visualit,w btfsc STATUS,Z goto NIVELL1 movlw b'00000010' xorwf Visualit,w btfsc STATUS,Z goto NIVELL2 movlw b'00000100' xorwf Visualit,w btfsc STATUS,Z goto NIVELL3 movlw b'00001000' xorwf Visualit,w btfsc STATUS,Z goto NIVELL4 ; final del canvi de nivell: NIVELL1 ; entra a nivell 1 i prepara les variables per tal que quan arribi a inicia1 sàpiga el joc a quin nivell estem clrf nivell1 bsf nivell1,0 clrf nivell2 clrf nivell3 clrf nivell4 goto INICIA1 ; inicia1 és on comença el joc i alla es distingeix a quin nivell estem NIVELL2 ; entra a nivell 2 i prepara les variables per tal que quan arribi a inicia1 sàpiga el joc a quin nivell estem clrf intentsnivell2 clrf nivell2 bsf nivell2,0 clrf nivell1 clrf nivell3 clrf nivell4 goto INICIA1 NIVELL3 ; entra a nivell 3 i prepara les variables per tal que quan arribi a inicia1 sàpiga el joc a quin nivell estem clrf nivell3 bsf nivell3,0 clrf nivell1 clrf nivell2 clrf nivell4 goto INICIA1 NIVELL4 ; entra a nivell 1 i prepara les variables per tal que quan arribi a inicia1 sàpiga el joc a quin nivell estem clrf intentsnivell4 clrf nivell4 bsf nivell4,0 clrf nivell1 clrf nivell3 clrf nivell2 goto INICIA1 FRACAS ; aqui arriba només quan s'han fallat els 10 intents en el nivell 2 i 4 movlw b'00000001' movwf fracasado ; activem l'ultim bit de la variable fracasado clrf intentsnivell2 ; netegem el comptador de nivells clrf intentsnivell4 bcf Combiguanyadora,0 ; encenem la combi guanyadora per tal que el jugador la conegui bcf Combiguanyadora,1 bcf Combiguanyadora,2 bcf Combiguanyadora,3 movf Combiguanyadora+1,w movwf Sortida2 movf Combiguanyadora,w movwf Sortida call EnviaR16 bsf PCLATH,3 ; activem el bit 3 de PCLATH goto gameover ; anem a la funcio gameover que reprodueix la canço de fracas fracas2 ; bucle al que torna al acabar la canço que esta pendent de si pitgem el polsador petit per tal de permetre que es segueixi jugant btfsc PORTA,3 goto fracas2 goto Bucle_canvi_nivell CAMPIONS ; aqui entra un cop es guanya clrf fracasado ; no activem la variable fracasado bsf PCLATH,3 ; activem el bit per a canvi de pagina goto Hasganado ; anem a la funcio Hasganado de la pagina1 que triara el nivell on som i reproduirà la canço corresponent campions2 ; bucle al que es torna al acabar la canço, que encen de forma intermitent els LED verds i liles i els grocs btfss PORTA,3 ; anem comprovant si es pitja el polsador de la placa petita per seguir jugant ; goto Ret1g goto Bucle_canvi_nivell bcf Combiguanyadora,0 bsf Combiguanyadora,1 bcf Combiguanyadora,2 bsf Combiguanyadora,3 bcf Combiguanyadora,4 bsf Combiguanyadora,5 bcf Combiguanyadora,6 bsf Combiguanyadora,7 bcf Combiguanyadora+1,0 bsf Combiguanyadora+1,1 bcf Combiguanyadora+1,2 bsf Combiguanyadora+1,3 bcf Combiguanyadora+1,4 bsf Combiguanyadora+1,5 bcf Combiguanyadora+1,6 bsf Combiguanyadora+1,7 movf Combiguanyadora+1,w movwf Sortida2 movf Combiguanyadora,w movwf Sortida call EnviaR16 Ret1g ; bucle per a l'intermitent btfss PORTA,3 goto Bucle_canvi_nivell decfsz Retard1g,f ; Decrementa la variable 1 ; si dona zero, no es fa la instrucció següent goto Ret1g ; Salta, excepte si el resultat ha estat zero decfsz Retard2g,f ; Decrementa la variable 2 goto Ret1g ; Salta, excepte si el resultat ha estat zero bsf Combiguanyadora,0 bcf Combiguanyadora,1 bsf Combiguanyadora,2 bcf Combiguanyadora,3 bsf Combiguanyadora,4 bcf Combiguanyadora,5 bsf Combiguanyadora,6 bcf Combiguanyadora,7 bsf Combiguanyadora+1,0 bcf Combiguanyadora+1,1 bsf Combiguanyadora+1,2 bcf Combiguanyadora+1,3 bsf Combiguanyadora+1,4 bcf Combiguanyadora+1,5 bsf Combiguanyadora+1,6 bcf Combiguanyadora+1,7 movf Combiguanyadora+1,w movwf Sortida2 movf Combiguanyadora,w movwf Sortida call EnviaR16 Ret2g ; bucle per a fer intermitent btfss PORTA,3 goto Bucle_canvi_nivell decfsz Retard1g,f ; Decrementa la variable 1 ; si dona zero, no es fa la instrucció següent goto Ret2g ; Salta, excepte si el resultat ha estat zero decfsz Retard2g,f ; Decrementa la variable 2 goto Ret2g ; Salta, excepte si el resultat ha estat zero goto campions2 ; Repetim-ho... INICIA1 ; en quant es pitja el 5e polsador de la placa gran va a generar la combinacio bona Llegir_pols1 ; va comprovant si es pitja o no call Llegir movf Polsador,w xorlw b'00000001' btfsc STATUS,Z goto num_aleatori goto Llegir_pols1 num_aleatori ; funcio que genera el nombre aleatori 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 Generar_num call Random ; Genera un valor aleatori apagat3 ; comprova si el LED3 esta apagat movf Rand+1,w movwf mirar_apagat bcf mirar_apagat,0 bcf mirar_apagat,1 bcf mirar_apagat,2 bcf mirar_apagat,3 bcf mirar_apagat,4 movf mirar_apagat,w xorlw b'00000000' btfsc STATUS,Z goto Generar_num ; si esta a apagat torna a generar una combinacio nova apagat2 ; si no ho estava va a mirar si el LED 2 esta apagat movf Rand+1,w movwf mirar_apagat bcf mirar_apagat,0 bcf mirar_apagat,1 bcf mirar_apagat,5 bcf mirar_apagat,6 bcf mirar_apagat,7 movf mirar_apagat,w xorlw b'00000000' btfsc STATUS,Z goto Generar_num ; si esta a apagat torna a generar una combinacio nova apagat1 ; si no ho estava va a mirar si el LED 1 esta apagat movf Rand+1,w movwf mirar_apagat movf Rand,w movwf mirar_apagat+1 bcf mirar_apagat,2 bcf mirar_apagat,3 bcf mirar_apagat,4 bcf mirar_apagat,5 bcf mirar_apagat,6 bcf mirar_apagat,7 bcf mirar_apagat+1,0 bcf mirar_apagat+1,1 bcf mirar_apagat+1,2 bcf mirar_apagat+1,3 bcf mirar_apagat+1,4 bcf mirar_apagat+1,5 bcf mirar_apagat+1,6 movf mirar_apagat,w xorlw b'00000000' btfsc STATUS,Z goto apagat1_2 goto apagat0 apagat1_2 movf mirar_apagat+1,w xorlw b'00000000' btfsc STATUS,Z goto Generar_num ; si esta a apagat torna a generar una combinacio nova apagat0 ; si no ho estava va a mirar si el LED 0 esta apagat movf Rand,w movwf mirar_apagat+1 bcf mirar_apagat+1,0 bcf mirar_apagat+1,1 bcf mirar_apagat+1,2 bcf mirar_apagat+1,3 bcf mirar_apagat+1,7 movf mirar_apagat+1,w xorlw b'00000000' btfsc STATUS,Z goto Generar_num ; si esta a apagat torna a generar una combinacio nova Cap_apagat ; aqui nomes entra si no hi ha cap d'apagat movf Rand,w movwf colors1 ; guarda a les variables color1 i color2 la combinacio sense colors apagats movf Rand+1,w movwf colors2 movlw .5 ; Retard de 1 s call Rets Passar_a_codi3 ; passem de dues variables amb la combinacio que cal enviar a EnviaR16 per encendre, ; a tenir-ne 4, una per a cada LED, que coneixin el decimal atribuit a cada color (ens sera ; útil per al check i per a el bucle que va canviant de colors al pitjar polsadors) c3_6 movf colors2,w movwf passar_codi+1 bcf passar_codi+1,0 bcf passar_codi+1,1 bcf passar_codi+1,2 bcf passar_codi+1,3 bcf passar_codi+1,4 movf passar_codi+1,w xorlw b'11100000' btfss STATUS,Z goto c3_5 movlw .5 movwf codi3 goto Passar_a_codi2 c3_5 movf passar_codi+1,w xorlw b'00100000' btfss STATUS,Z goto c3_4 movlw .4 movwf codi3 goto Passar_a_codi2 c3_4 movf passar_codi+1,w xorlw b'01000000' btfss STATUS,Z goto c3_3 movlw .3 movwf codi3 goto Passar_a_codi2 c3_3 movf passar_codi+1,w xorlw b'10000000' btfss STATUS,Z goto c3_2 movlw .2 movwf codi3 goto Passar_a_codi2 c3_2 movf passar_codi+1,w xorlw b'01100000' btfss STATUS,Z goto c3_1 movlw .1 movwf codi3 goto Passar_a_codi2 c3_1 movf passar_codi+1,w xorlw b'10100000' btfss STATUS,Z goto c3_0 movlw .0 movwf codi3 goto Passar_a_codi2 c3_0 movlw .6 movwf codi3 goto Passar_a_codi2 Passar_a_codi2 c2_6 movf colors2,w movwf passar_codi+1 bcf passar_codi+1,0 bcf passar_codi+1,1 bcf passar_codi+1,5 bcf passar_codi+1,6 bcf passar_codi+1,7 movf passar_codi+1,w xorlw b'00011100' btfss STATUS,Z goto c2_5 movlw .5 movwf codi2 goto Passar_a_codi1 c2_5 movf passar_codi+1,w xorlw b'00000100' btfss STATUS,Z goto c2_4 movlw .4 movwf codi2 goto Passar_a_codi1 c2_4 movf passar_codi+1,w xorlw b'00001000' btfss STATUS,Z goto c2_3 movlw .3 movwf codi2 goto Passar_a_codi1 c2_3 movf passar_codi+1,w xorlw b'00010000' btfss STATUS,Z goto c2_2 movlw .2 movwf codi2 goto Passar_a_codi1 c2_2 movf passar_codi+1,w xorlw b'00001100' btfss STATUS,Z goto c2_1 movlw .1 movwf codi2 goto Passar_a_codi1 c2_1 movf passar_codi+1,w xorlw b'00010100' btfss STATUS,Z goto c2_0 movlw .0 movwf codi2 goto Passar_a_codi1 c2_0 movlw .6 movwf codi2 goto Passar_a_codi1 Passar_a_codi1 c1_6_1 movf colors2,w movwf passar_codi+1 bcf passar_codi+1,2 bcf passar_codi+1,3 bcf passar_codi+1,4 bcf passar_codi+1,5 bcf passar_codi+1,6 bcf passar_codi+1,7 movf colors1,w movwf passar_codi bcf passar_codi,0 bcf passar_codi,1 bcf passar_codi,2 bcf passar_codi,3 bcf passar_codi,4 bcf passar_codi,5 bcf passar_codi,6 movf passar_codi+1,w xorlw b'00000011' btfss STATUS,Z goto c1_5_1 movf passar_codi,w xorlw b'10000000' btfss STATUS,Z goto c1_6_2 movlw .5 movwf codi1 goto Passar_a_codi0 c1_6_2 movlw .6 movwf codi1 goto Passar_a_codi0 c1_5_1 movf passar_codi+1,w xorlw b'00000000' btfss STATUS,Z goto c1_4_1 movlw .4 movwf codi1 goto Passar_a_codi0 c1_4_1 movf passar_codi+1,w xorlw b'00000001' btfss STATUS,Z goto c1_3_1 movf passar_codi,w xorlw b'10000000' btfss STATUS,Z goto c1_4_2 movlw .1 movwf codi1 goto Passar_a_codi0 c1_4_2 movlw .3 movwf codi1 goto Passar_a_codi0 c1_3_1 movf passar_codi,w xorlw b'10000000' btfss STATUS,Z goto c1_3_2 movlw .0 movwf codi1 goto Passar_a_codi0 c1_3_2 movlw .2 movwf codi1 goto Passar_a_codi0 Passar_a_codi0 c0_6 movf colors1,w movwf passar_codi bcf passar_codi,0 bcf passar_codi,1 bcf passar_codi,2 bcf passar_codi,3 bcf passar_codi,7 movf passar_codi,w xorlw b'01110000' btfss STATUS,Z goto c0_5 movlw .5 movwf codi0 goto mirarnivell3_4 c0_5 movf passar_codi,w xorlw b'00010000' btfss STATUS,Z goto c0_4 movlw .4 movwf codi0 goto mirarnivell3_4 c0_4 movf passar_codi,w xorlw b'00100000' btfss STATUS,Z goto c0_3 movlw .3 movwf codi0 goto mirarnivell3_4 c0_3 movf passar_codi,w xorlw b'01000000' btfss STATUS,Z goto c0_2 movlw .2 movwf codi0 goto mirarnivell3_4 c0_2 movf passar_codi,w xorlw b'00110000' btfss STATUS,Z goto c0_1 movlw .1 movwf codi0 goto mirarnivell3_4 c0_1 movf passar_codi,w xorlw b'01010000' btfss STATUS,Z goto c0_0 movlw .0 movwf codi0 goto mirarnivell3_4 c0_0 movlw .6 movwf codi0 goto mirarnivell3_4 mirarnivell3_4 ; si estem a nivell 3 o quatre ja hem acabat amb la generacio de colors, ja que en podem tenir repetits movf nivell3,w xorlw b'00000001' btfsc STATUS,Z goto Cap_apagat_ni_repetit movf nivell4,w xorlw b'00000001' btfsc STATUS,Z goto Cap_apagat_ni_repetit Repetits ; s'encarrega de que no hi hagi colors repetits en els dos primers nivells movf codi0,w xorwf codi1,w btfsc STATUS,Z goto Generar_num ; si n'hi ha de repetits torna a generar una combi nova i repeteix tot movf codi0,w xorwf codi2,w btfsc STATUS,Z goto Generar_num ; si n'hi ha de repetits torna a generar una combi nova i repeteix tot movf codi0,w xorwf codi3,w btfsc STATUS,Z goto Generar_num ; si n'hi ha de repetits torna a generar una combi nova i repeteix tot movf codi1,w xorwf codi2,w btfsc STATUS,Z goto Generar_num ; si n'hi ha de repetits torna a generar una combi nova i repeteix tot movf codi1,w xorwf codi3,w btfsc STATUS,Z goto Generar_num ; si n'hi ha de repetits torna a generar una combi nova i repeteix tot movf codi2,w xorwf codi3,w btfsc STATUS,Z goto Generar_num ; si n'hi ha de repetits torna a generar una combi nova i repeteix tot Cap_apagat_ni_repetit ; s'ha acabat la generacio de valors. movf colors1,w movwf Combiguanyadora movwf Sortida movf colors2,w movwf Combiguanyadora+1 movwf Sortida2 bcf Sortida,0 bcf Sortida,1 bcf Sortida,2 bcf Sortida,3 ; call EnviaR16 ; encenem la combi guanyadora, aixo es per nosaltres, per anar comprovant, ; aquesta linia cal anul·larla en el joc definitiu Prebucle ; call Llegir ; movf Polsador,w ; xorlw b'00000001' ; btfsc STATUS,Z ; goto apagarLED ; al polsar el 5e LED s'apaga i iniciem la partida ; goto Prebucle apagarLED movlw b'00000000' movwf Sortida movwf Sortida2 movwf colors1 movwf colors2 call EnviaR16 ; apaguem la combi movlw .5 call Rets movlw .6 ; posem tots els comptadors que van emmmagatzemant el color de cada LED a apagats movwf comptador0 movwf comptador1 movwf comptador2 movwf comptador3 goto Bucle Bucle ; inici de la partida! bcf colors1,0 bcf colors1,1 bcf colors1,2 bcf colors1,3 btfss PORTA,3 ; si es pitja el polsador de la placa petita, ens hem rendit i se'ns mostra la combi guanyadora goto Mostraguanyadora call Llegir ; Llegeix els polsadors movf Polsador,w xorlw b'00010000' ; Mirem si s'ha premut el 5 btfsc STATUS,Z ; Si no és el 5, salta goto LED3 ; No cal comentar mes perque laresta d'apartats fan el mateix movf Polsador,w xorlw b'00001000' btfsc STATUS,Z goto LED2 movf Polsador,w xorlw b'00000100' btfsc STATUS,Z goto LED1 movf Polsador,w xorlw b'00000010' btfsc STATUS,Z goto LED0 movf Polsador,w xorlw b'00000001' btfsc STATUS,Z goto quincheck ; al polsar el 5e LED es passa a comprovar resultats goto Bucle ; si no es pitja res es torna a repetir el bucle i mirar tot quincheck ; depenent del nivell va a check 1 (nivell1) o check 2 (nivell2,3,4) movlw b'00000001' xorwf nivell1,w btfsc STATUS,Z goto Check1 movlw b'00000001' xorwf nivell2,w btfsc STATUS,Z goto Check2 movlw b'00000001' xorwf nivell3,w btfsc STATUS,Z goto Check2 movlw b'00000001' xorwf nivell4,w btfsc STATUS,Z goto Check2 goto Bucle ; no hauria de entrar mai aqui ja que sempre estem en un nivell o un altre Check1 ; a cada LED encen el LED corresponent intermitent fix o apagat bcf colors1,0 bcf colors1,1 bcf colors1,2 bcf colors1,3 clrf varia clrf variafix ; primer pas, comptar posicions colorposicio0 movf codi0,w xorwf comptador0,w btfss STATUS,Z goto colorposicio1 bsf variafix,0 colorposicio1 movf codi1,w xorwf comptador1,w btfss STATUS,Z goto colorposicio2 bsf variafix,1 colorposicio2 movf codi2,w xorwf comptador2,w btfss STATUS,Z goto colorposicio3 bsf variafix,2 colorposicio3 movf codi3,w xorwf comptador3,w btfss STATUS,Z goto colorNOposicio0 bsf variafix,3 movlw b'00001111' xorwf variafix,w btfsc STATUS,Z goto CAMPIONS colorNOposicio0 movf codi0,w xorwf comptador0,w btfsc STATUS,Z goto colorNOposicio1 movf codi0,w xorwf comptador1,w btfsc STATUS,Z goto varia1 movf codi0,w xorwf comptador2,w btfsc STATUS,Z goto varia2 movf codi0,w xorwf comptador3,w btfsc STATUS,Z goto varia3 goto colorNOposicio1 varia1 bsf varia,1 goto colorNOposicio1 varia2 bsf varia,2 goto colorNOposicio1 varia3 bsf varia,3 goto colorNOposicio1 colorNOposicio1 movf codi1,w xorwf comptador1,w btfsc STATUS,Z goto colorNOposicio2 movf codi1,w xorwf comptador0,w btfsc STATUS,Z goto varia11 movf codi1,w xorwf comptador2,w btfsc STATUS,Z goto varia22 movf codi1,w xorwf comptador3,w btfsc STATUS,Z goto varia33 goto colorNOposicio2 varia11 bsf varia,0 goto colorNOposicio2 varia22 bsf varia,2 goto colorNOposicio2 varia33 bsf varia,3 goto colorNOposicio2 colorNOposicio2 movf codi2,w xorwf comptador2,w btfsc STATUS,Z goto colorNOposicio3 movf codi2,w xorwf comptador0,w btfsc STATUS,Z goto varia111 movf codi2,w xorwf comptador1,w btfsc STATUS,Z goto varia222 movf codi2,w xorwf comptador3,w btfsc STATUS,Z goto varia333 goto colorNOposicio3 varia111 bsf varia,0 goto colorNOposicio3 varia222 bsf varia,1 goto colorNOposicio3 varia333 bsf varia,3 goto colorNOposicio3 colorNOposicio3 movf codi3,w xorwf comptador3,w btfsc STATUS,Z goto encendre movf codi3,w xorwf comptador0,w btfsc STATUS,Z goto varia1111 movf codi3,w xorwf comptador1,w btfsc STATUS,Z goto varia2222 movf codi3,w xorwf comptador2,w btfsc STATUS,Z goto varia3333 goto encendre varia1111 bsf varia,0 goto encendre varia2222 bsf varia,1 goto encendre varia3333 bsf varia,2 goto encendre Check2 ; sense indicar posicions incf intentsnivell2,f ; incrementa en 1 els intents cada cop que entra a check incf intentsnivell4,f bcf colors1,0 bcf colors1,1 bcf colors1,2 bcf colors1,3 clrf fixos clrf intermitents clrf varia clrf variafix ; primer pas, comptar posicions codi_0 movf codi0,w xorwf comptador0,w btfsc STATUS,Z goto codi_1_A movf codi0,w xorwf comptador1,w btfsc STATUS,Z goto codi_1_B movf codi0,w xorwf comptador2,w btfsc STATUS,Z goto codi_1_C movf codi0,w xorwf comptador3,w btfsc STATUS,Z goto codi_1_D goto codi_1_E codi_1_A call FIX movf codi1,w xorwf comptador1,w btfsc STATUS,Z goto A_1_1 movf codi1,w xorwf comptador2,w btfsc STATUS,Z goto A_1_2 movf codi1,w xorwf comptador3,w btfsc STATUS,Z goto A_1_3 goto codi_2_D A_1_1 call FIX goto codi_2_A A_1_2 call INTERMITENT goto codi_2_B A_1_3 call INTERMITENT goto codi_2_C codi_1_B call INTERMITENT movf codi1,w xorwf comptador0,w btfsc STATUS,Z goto B_1_0 movf codi1,w xorwf comptador2,w btfsc STATUS,Z goto B_1_2 movf codi1,w xorwf comptador3,w btfsc STATUS,Z goto B_1_3 goto codi_2_G B_1_0 call INTERMITENT goto codi_2_A B_1_2 call INTERMITENT goto codi_2_E B_1_3 call INTERMITENT goto codi_2_F codi_1_C call INTERMITENT movf codi1,w xorwf comptador1,w btfsc STATUS,Z goto C_1_1 movf codi1,w xorwf comptador0,w btfsc STATUS,Z goto C_1_0 movf codi1,w xorwf comptador3,w btfsc STATUS,Z goto C_1_3 goto codi_2_I C_1_0 call INTERMITENT goto codi_2_B C_1_1 call FIX goto codi_2_E C_1_3 call INTERMITENT goto codi_2_H codi_1_D call INTERMITENT movf codi1,w xorwf comptador1,w btfsc STATUS,Z goto D_1_1 movf codi1,w xorwf comptador0,w btfsc STATUS,Z goto D_1_0 movf codi1,w xorwf comptador2,w btfsc STATUS,Z goto D_1_2 goto codi_2_J D_1_0 call INTERMITENT goto codi_2_C D_1_1 call FIX goto codi_2_F D_1_2 call INTERMITENT goto codi_2_H codi_1_E movf codi1,w xorwf comptador1,w btfsc STATUS,Z goto E_1_1 movf codi1,w xorwf comptador0,w btfsc STATUS,Z goto E_1_0 movf codi1,w xorwf comptador2,w btfsc STATUS,Z goto E_1_2 movf codi1,w xorwf comptador3,w btfsc STATUS,Z goto E_1_3 goto codi_2_I E_1_0 call INTERMITENT goto codi_2_D E_1_1 call FIX goto codi_2_G E_1_2 call INTERMITENT goto codi_2_I E_1_3 call INTERMITENT goto codi_2_J codi_2_A movf codi2,w xorwf comptador2,w btfsc STATUS,Z goto A_2_2 movf codi2,w xorwf comptador3,w btfsc STATUS,Z goto A_2_3 goto codi_3_C A_2_2 call FIX goto codi_3_A A_2_3 call INTERMITENT goto codi_3_B codi_2_B movf codi2,w xorwf comptador1,w btfsc STATUS,Z goto B_2_1 movf codi2,w xorwf comptador3,w btfsc STATUS,Z goto B_2_3 goto codi_3_E B_2_1 call INTERMITENT goto codi_3_A B_2_3 call INTERMITENT goto codi_3_D codi_2_C movf codi2,w xorwf comptador2,w btfsc STATUS,Z goto C_2_2 movf codi2,w xorwf comptador1,w btfsc STATUS,Z goto C_2_1 goto codi_3_F C_2_1 call INTERMITENT goto codi_3_B C_2_2 call FIX goto codi_3_D codi_2_D movf codi2,w xorwf comptador2,w btfsc STATUS,Z goto D_2_2 movf codi2,w xorwf comptador1,w btfsc STATUS,Z goto D_2_1 movf codi2,w xorwf comptador3,w btfsc STATUS,Z goto D_2_3 goto codi_3_G D_2_1 call INTERMITENT goto codi_3_C D_2_2 call FIX goto codi_3_E D_2_3 call INTERMITENT goto codi_3_F codi_2_E movf codi2,w xorwf comptador0,w btfsc STATUS,Z goto E_2_0 movf codi2,w xorwf comptador3,w btfsc STATUS,Z goto E_2_3 goto codi_3_I E_2_0 call INTERMITENT goto codi_3_A E_2_3 call INTERMITENT goto codi_3_H codi_2_F movf codi2,w xorwf comptador2,w btfsc STATUS,Z goto F_2_2 movf codi2,w xorwf comptador0,w btfsc STATUS,Z goto F_2_0 goto codi_3_F F_2_0 call INTERMITENT goto codi_3_B F_2_2 call FIX goto codi_3_H codi_2_G movf codi2,w xorwf comptador2,w btfsc STATUS,Z goto G_2_2 movf codi2,w xorwf comptador0,w btfsc STATUS,Z goto G_2_0 movf codi2,w xorwf comptador3,w btfsc STATUS,Z goto G_2_3 goto codi_3_K G_2_0 call INTERMITENT goto codi_3_C G_2_2 call FIX goto codi_3_I G_2_3 call INTERMITENT goto codi_3_J codi_2_H movf codi2,w xorwf comptador0,w btfsc STATUS,Z goto H_2_0 movf codi2,w xorwf comptador1,w btfsc STATUS,Z goto H_2_1 goto codi_3_L H_2_0 call INTERMITENT goto codi_3_D H_2_1 call INTERMITENT goto codi_3_H codi_2_I movf codi2,w xorwf comptador0,w btfsc STATUS,Z goto I_2_0 movf codi2,w xorwf comptador1,w btfsc STATUS,Z goto I_2_1 movf codi2,w xorwf comptador3,w btfsc STATUS,Z goto I_2_3 goto codi_3_K I_2_0 call INTERMITENT goto codi_3_E I_2_1 call INTERMITENT goto codi_3_I I_2_3 call INTERMITENT goto codi_3_L codi_2_J movf codi2,w xorwf comptador2,w btfsc STATUS,Z goto J_2_2 movf codi2,w xorwf comptador0,w btfsc STATUS,Z goto J_2_0 movf codi2,w xorwf comptador1,w btfsc STATUS,Z goto J_2_1 goto codi_3_K J_2_0 call INTERMITENT goto codi_3_J J_2_1 call INTERMITENT goto codi_3_I J_2_2 call FIX goto codi_3_L codi_3_A movf codi3,w xorwf comptador3,w btfsc STATUS,Z call FIX goto RESULTAT codi_3_B movf codi3,w xorwf comptador2,w btfsc STATUS,Z call INTERMITENT goto RESULTAT codi_3_C movf codi3,w xorwf comptador3,w btfsc STATUS,Z goto codi_3_C_3 movf codi3,w xorwf comptador2,w btfsc STATUS,Z goto codi_3_C_2 goto RESULTAT codi_3_C_2 call INTERMITENT goto RESULTAT codi_3_C_3 call FIX goto RESULTAT codi_3_D movf codi3,w xorwf comptador1,w btfsc STATUS,Z call INTERMITENT goto RESULTAT codi_3_E movf codi3,w xorwf comptador3,w btfsc STATUS,Z goto codi_3_E_3 movf codi3,w xorwf comptador1,w btfsc STATUS,Z goto codi_3_E_1 goto RESULTAT codi_3_E_1 call INTERMITENT goto RESULTAT codi_3_E_3 call FIX goto RESULTAT codi_3_F movf codi3,w xorwf comptador2,w btfsc STATUS,Z goto codi_3_F_1 movf codi3,w xorwf comptador1,w btfsc STATUS,Z goto codi_3_F_1 goto RESULTAT codi_3_F_1 call INTERMITENT goto RESULTAT codi_3_G movf codi3,w xorwf comptador3,w btfsc STATUS,Z goto codi_3_G_3 movf codi3,w xorwf comptador1,w btfsc STATUS,Z goto codi_3_G_1 movf codi3,w xorwf comptador2,w btfsc STATUS,Z goto codi_3_G_1 goto RESULTAT codi_3_G_1 call INTERMITENT goto RESULTAT codi_3_G_3 call FIX goto RESULTAT codi_3_H movf codi3,w xorwf comptador0,w btfsc STATUS,Z call INTERMITENT goto RESULTAT codi_3_I movf codi3,w xorwf comptador3,w btfsc STATUS,Z goto codi_3_I_3 movf codi3,w xorwf comptador0,w btfsc STATUS,Z goto codi_3_I_0 goto RESULTAT codi_3_I_0 call INTERMITENT goto RESULTAT codi_3_I_3 call FIX goto RESULTAT codi_3_J movf codi3,w xorwf comptador0,w btfsc STATUS,Z goto codi_3_I_0 movf codi3,w xorwf comptador2,w btfsc STATUS,Z goto codi_3_I_0 goto RESULTAT codi_3_K movf codi3,w xorwf comptador3,w btfsc STATUS,Z goto codi_3_G_3 movf codi3,w xorwf comptador0,w btfsc STATUS,Z goto codi_3_G_1 movf codi3,w xorwf comptador2,w btfsc STATUS,Z goto codi_3_G_1 goto RESULTAT codi_3_L movf codi3,w xorwf comptador0,w btfsc STATUS,Z goto codi_3_I_0 movf codi3,w xorwf comptador1,w btfsc STATUS,Z goto codi_3_I_0 goto RESULTAT FIX ; cada cop que es cridada incrementa fixos en 1 incf fixos,f return INTERMITENT ; cada cop que es cridada incremeenta intermitents en 1 incf intermitents,f return RESULTAT ; envia a la funcio que cal depenent de quants fixos i quants intermitents cal encendre movf fixos,w xorlw .4 btfsc STATUS,Z goto tots_fixos movf fixos,w xorlw .3 btfsc STATUS,Z goto tres_fixos movf fixos,w xorlw .2 btfsc STATUS,Z goto dos_fixos movf fixos,w xorlw .1 btfsc STATUS,Z goto un_fix goto cap_fix tots_fixos ; encen tots 4 fixos movlw b'00001111' movwf variafix goto CAMPIONS goto encendre tres_fixos ; encen 3 fixos movlw b'00000111' movwf variafix movf intermitents,w xorlw .1 btfsc STATUS,Z goto tres_fixos_un_int goto encendre tres_fixos_un_int ; tres fix i un int movlw b'00001000' movwf varia goto encendre dos_fixos ; dos fixos movlw b'00000011' movwf variafix movf intermitents,w xorlw .2 btfsc STATUS,Z goto dos_fixos_dos_int movf intermitents,w xorlw .1 btfsc STATUS,Z goto dos_fixos_un_int goto encendre dos_fixos_dos_int ;dos fixos i un int movlw b'00001100' movwf varia goto encendre dos_fixos_un_int ; dos fixos i un int movlw b'00000100' movwf varia goto encendre un_fix ; un fix i va mirant quants int movlw b'00000001' movwf variafix movf intermitents,w xorlw .3 btfsc STATUS,Z goto un_fix_tres_int movf intermitents,w xorlw .2 btfsc STATUS,Z goto un_fix_dos_int movf intermitents,w xorlw .1 btfsc STATUS,Z goto un_fix_un_int goto encendre un_fix_tres_int movlw b'00001110' movwf varia goto encendre un_fix_dos_int movlw b'00000110' movwf varia goto encendre un_fix_un_int movlw b'00000010' movwf varia goto encendre cap_fix ; cap fix i va mirant quants int movf intermitents,w xorlw .4 btfsc STATUS,Z goto tots_int movf intermitents,w xorlw .3 btfsc STATUS,Z goto cap_fix_tres_int movf intermitents,w xorlw .2 btfsc STATUS,Z goto cap_fix_dos_int movf intermitents,w xorlw .1 btfsc STATUS,Z goto cap_fix_un_int goto encendre tots_int ; tots int movlw b'00001111' movwf varia goto encendre cap_fix_tres_int movlw b'00000111' movwf varia goto encendre cap_fix_dos_int movlw b'00000011' movwf varia goto encendre cap_fix_un_int movlw b'00000001' movwf varia goto encendre encendre ; encen el que calgui call incrementaintents movf colors2,w movwf Sortida2 movf variafix,w xorwf colors1,f ; uneix colors1 amb varia movf varia,w xorwf colors1,f movf colors1,w movwf Sortida call EnviaR16 Ret1_unint ; bucle pels intermitens decfsz Retardo1,f goto Ret1_unint decfsz Retardo2,f goto Ret1_unint movf varia,w xorwf colors1,f movf colors1,w movwf Sortida movf colors2,w movwf Sortida2 call EnviaR16 btfss PORTA,3 goto Mostraguanyadora Ret2un ; bucle pels intermitens decfsz Retardo1,f ; Decrementa la variable 1 ; si dona zero, no es fa lainstrucció següent goto Ret2un ; Salta, excepte si elresultat ha estat zero decfsz Retardo2,f ; Decrementa la variable 2 goto Ret2un ; Salta, excepte si elresultat ha estat zero call Llegir movf Polsador,w btfss STATUS,Z goto Bucle goto Ret1_unint ; Repetim-ho... ; és per encendre els LED de colors i canviar-ne els colors al pitjar els corresponents polsadors: LED3 s6 movf comptador3,w ; mirem el valor del comptador, sies 6 vol dir que toca el primer color, si no es 6 saltara capa s5 xorlw d'6' ; i aixi successivament fins quetrobi el seu valor i en modifiqui el color del LED btfss STATUS,Z goto s5 ; si es 6, aquest pas no el fara,si no es 6 anira a s5 bsf colors2,7 ; aqui modifiquem tan sols els bits que volem per aconseguir el color desitjat al LED3 (les variables ; colors2 i colors1 es bsf colors2,6 ; com si fossin la sortida i sortida+1 a l'exemple d'internet (per si voleu veure els colors que s'encenen a ; la taula aquella) bsf colors2,5 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador3,1 ; decrementem el comptadorper a que la proxima vegada que premem el polsador vagi cap aun altre color call EnviaR16 ; enviem call Rets ; Retard goto Bucle ; cap al bucle fins que es premiun altre polsador s5 movf comptador3,w ; No cal comentar res mes perquees tot igual fins al final,l'unic que anirem canviant seraels bits que activem xorlw d'5' ; quan arribem a la s0 li donaremun altre cop el valor al comptador btfss STATUS,Z goto s4 bcf colors2,7 bcf colors2,6 bsf colors2,5 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador3,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle s4 movf comptador3,w xorlw .4 btfss STATUS,Z goto s3 bcf colors2,7 bsf colors2,6 bcf colors2,5 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador3,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle s3 movf comptador3,w xorlw .3 btfss STATUS,Z goto s2 bsf colors2,7 bcf colors2,6 bcf colors2,5 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador3,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle s2 movf comptador3,w xorlw .2 btfss STATUS,Z goto s1 bcf colors2,7 bsf colors2,6 bsf colors2,5 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador3,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle s1 movf comptador3,w xorlw .1 btfss STATUS,Z goto s0 bsf colors2,7 bcf colors2,6 bsf colors2,5 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador3,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle s0 movf comptador3,w xorlw .0 btfss STATUS,Z goto Bucle bsf colors2,7 bsf colors2,6 bcf colors2,5 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida call EnviaR16 ; Ho envia al registre movlw .6 ; li donem el valor de 6 decimal al comptador movwf comptador3 call Rets goto Bucle LED2 g6 movf comptador2,w xorlw d'6' btfss STATUS,Z goto g5 bsf colors2,4 bsf colors2,3 bsf colors2,2 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador2,1 call EnviaR16 call Rets goto Bucle g5 movf comptador2,w xorlw d'5' btfss STATUS,Z goto g4 bcf colors2,4 bcf colors2,3 bsf colors2,2 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador2,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle g4 movf comptador2,w xorlw .4 btfss STATUS,Z goto g3 bcf colors2,4 bsf colors2,3 bcf colors2,2 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador2,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle g3 movf comptador2,w xorlw .3 btfss STATUS,Z goto g2 bsf colors2,4 bcf colors2,3 bcf colors2,2 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador2,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle g2 movf comptador2,w xorlw .2 btfss STATUS,Z goto g1 bcf colors2,4 bsf colors2,3 bsf colors2,2 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador2,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle g1 movf comptador2,w xorlw .1 btfss STATUS,Z goto g0 bsf colors2,4 bcf colors2,3 bsf colors2,2 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador2,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle g0 movf comptador2,w xorlw .0 btfss STATUS,Z goto Bucle bsf colors2,4 bsf colors2,3 bcf colors2,2 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida call EnviaR16 ; Ho envia al registre movlw .6 movwf comptador2 call Rets goto Bucle LED1 b6 movf comptador1,w xorlw d'6' btfss STATUS,Z goto b5 bsf colors2,1 bsf colors2,0 bsf colors1,7 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador1,f call EnviaR16 call Rets goto Bucle b5 movf comptador1,w xorlw d'5' btfss STATUS,Z goto b4 bcf colors2,1 bcf colors2,0 bsf colors1,7 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador1,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle b4 movf comptador1,w xorlw .4 btfss STATUS,Z goto b3 bcf colors2,1 bsf colors2,0 bcf colors1,7 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador1,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle b3 movf comptador1,w xorlw .3 btfss STATUS,Z goto b2 bsf colors2,1 bcf colors2,0 bcf colors1,7 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador1,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle b2 movf comptador1,w xorlw .2 btfss STATUS,Z goto b1 bcf colors2,1 bsf colors2,0 bsf colors1,7 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador1,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle b1 movf comptador1,w xorlw .1 btfss STATUS,Z goto b0 bsf colors2,1 bcf colors2,0 bsf colors1,7 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador1,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle b0 movf comptador1,w xorlw .0 btfss STATUS,Z goto Bucle bsf colors2,1 bsf colors2,0 bcf colors1,7 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida call EnviaR16 ; Ho envia al registre movlw .6 movwf comptador1 call Rets goto Bucle LED0 h6 movf comptador0,w xorlw d'6' btfss STATUS,Z goto h5 bsf colors1,6 bsf colors1,5 bsf colors1,4 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador0,1 call EnviaR16 call Rets goto Bucle h5 movf comptador0,w xorlw d'5' btfss STATUS,Z goto h4 bcf colors1,6 bcf colors1,5 bsf colors1,4 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador0,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle h4 movf comptador0,w xorlw .4 btfss STATUS,Z goto h3 bcf colors1,6 bsf colors1,5 bcf colors1,4 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador0,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle h3 movf comptador0,w xorlw .3 btfss STATUS,Z goto h2 bsf colors1,6 bcf colors1,5 bcf colors1,4 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador0,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle h2 movf comptador0,w xorlw .2 btfss STATUS,Z goto h1 bcf colors1,6 bsf colors1,5 bsf colors1,4 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador0,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle h1 movf comptador0,w xorlw .1 btfss STATUS,Z goto h0 bsf colors1,6 bcf colors1,5 bsf colors1,4 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida decf comptador0,1 call EnviaR16 ; Ho envia al registre call Rets goto Bucle h0 movf comptador0,w xorlw .0 btfss STATUS,Z goto Bucle bsf colors1,6 bsf colors1,5 bcf colors1,4 movf colors2,w movwf Sortida2 movf colors1,w movwf Sortida call EnviaR16 ; Ho envia al registre movlw .6 movwf comptador0 call Rets goto Bucle
EnviaR16 ; Envia 16 bits a un registre de desplaçament ; Els bits estan a lesvariables Sortida (bits menys significatius) ; i Sortida+1 ; Al final de la funció, elvalor de Sortida queda corromput ; Si es vol conservar, calcopiar-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 bitsenviats es copiarien ; immediatament a lessortides 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 elsbits 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 Sortida2,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 del'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 Llegir clrf Polsador ; Si aquest valor no escanvia é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 Rets ; Funció de retard d'1 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 Retsrand ; Funció de retard de 0,2 W s movwf Retard3rand Buclesrand decfsz Retard1rand,f goto Bucles decfsz Retard2rand,f goto Bucles decfsz Retard3rand,f goto Bucles return Llegirdigital movlw b'00000001' movwf polsadordigital ; Activem polsador abans de comprovar btfsc PORTA,3 ; Mira si està desactivada l'entrada A3 ; Si desactivat (premut), no fa la instrucció següent clrf polsadordigital ; Si no està premut, desactiva polsador movf Previ,w ; Copia Previ a l'acumulador xorwf polsadordigital,w ; Compara Previ amb Polsador, si són iguals s'activa Z btfsc STATUS,Z ; Si són iguals va a Final goto Esborra incf Comptait,f ; Si són iguals, incrementa el valor de Comptait movf Comptait,w ; Copia Comptait a l'acumulador xorlw .4 ; Comprova si val 4, si ho val s'activa Z btfss STATUS,Z ; Si val 4 no fa la instrucció següent goto Final ; Si no era 4 va a Final movf polsadordigital,w ; Copia Polsador a W, si val 0 s'activa Z btfsc STATUS,Z ; Si Polsador valia 1 (Z=0) no fa la instrucció següent goto Invert ; Si no està premut, ja estem return Mostraguanyadora ; encen la combinacio bona i va mirant si polsem el polsador de la placa peque bcf Combiguanyadora,0 bcf Combiguanyadora,1 bcf Combiguanyadora,2 bcf Combiguanyadora,3 movf Combiguanyadora+1,w movwf Sortida2 movf Combiguanyadora,w movwf Sortida call EnviaR16 btfss PORTA,3 goto Mostraguanyadora goto Bucle_canvi_nivell Invert ; pertany a lllegirdigital movf Previ,w ; Copia Previ a l'acumulador xorlw b'00000001' ; Inverteix el valor movwf Previ ; I ho guarda a Previ Esborra ; pertany a lllegirdigital clrf Comptait ; Posa el comptador d'iteracions a valor zero Final ; Funció de retard 1 ms nop decfsz Retard1nivell,f goto Final goto Bucle_canvi_nivell ; Repetim-ho... incrementaintents ; va mirant que no ens passem del tope d'intents movf nivell3,w xorlw b'00000001' btfsc STATUS,Z return movlw d'10' xorwf intentsnivell4,w btfsc STATUS,Z goto FRACAS movlw d'10' xorwf intentsnivell2,w btfsc STATUS,Z goto FRACAS return
org 0x800 ; canvi de pagina Hasganado ; tria la canço que reprodueix quan guanyes movlw b'00000001' xorwf Visualit,w btfsc STATUS,Z goto granjapepito movlw b'00000010' xorwf Visualit,w btfsc STATUS,Z goto simpsons movlw b'00000100' xorwf Visualit,w btfsc STATUS,Z goto caribe movlw b'00001000' xorwf Visualit,w btfsc STATUS,Z goto imperio granjapepito ; nivell1 bsf STATUS,RP0 ; Tria el banc 1 movlw b'00100000' ; Definim com volem les E/S del port C movwf TRISC ; RC5 (sortida del PWM) com a entrada bcf STATUS,RP0 ; Tria el banc 0 movlw b'00001100' ; Configura el PWM, bits P1M (bits 7-6) a 00 mode senzill ; DC1B = 00 (bits 5-4) els dos bits de menys pes són 0 ; CCP1M = 11xx en mode senzill els bit 0 i 1 no afecten movwf ValCCP1CON ; Ho guarda per fer-ho servir més tard movwf CCP1CON ; Ho posa com a configuració del PWM movlw b'00000011' ; Configura el Timer 2 ; bits T2KCPS (bits 1-0) a 11 prescalat de 16 ; bit 2 (TMR2ON) a 0, Timer aturat ; Postscaler TOUTPS (bits 6-3) no afecten al PWM movwf T2CON ; Ho posa com a configuració del Timer 2 call Sol call TocaNota4 ; Toca la nota configurada call RetM call Sol call TocaNota4 ; Toca la nota configurada call RetM call Sol call TocaNota4 ; Toca la nota configurada call TocaNota4 ; Toca la nota configurada call Re call TocaNota4 ; Toca la nota configurada call TocaNota4 call Mi call TocaNota4 ; Toca la nota configurada call RetM call Mi call TocaNota4 ; Toca la nota configurada call RetM call Re call TocaNota3 ; Toca la nota configurada call RetM call Si call TocaNota4 ; Toca la nota configurada call RetM call Si call TocaNota4 ; Toca la nota configurada call RetM call La call TocaNota4 ; Toca la nota configurada call RetM call La call TocaNota4 ; Toca la nota configurada call RetM call Sol call TocaNota3 ; Toca la nota configurada call RetM bcf PCLATH,3 goto campions2 simpsons 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 call Fa call TocaNota3 ; Toca la nota configurada call RetM call La call TocaNota2 ; Toca la nota configurada call RetM call Si call TocaNota2 ; Toca la nota configurada call RetM call Reagud call TocaNota2 ; Toca la nota configurada call Doagud call TocaNota3 ; Toca la nota configurada call RetM call La call TocaNota2 ; Toca la nota configurada call RetM call Fa call TocaNota2 ; Toca la nota configurada call RetM call Re call TocaNota2 ; Toca la nota configurada call Sigrave call TocaNota2 ; Toca la nota configurada call Miniret call RetC call Sigrave call TocaNota2 ; Toca la nota configurada call Miniret call RetC call Sigrave call TocaNota2 ; Toca la nota configurada call Miniret call RetC call Do call TocaNota3 ; Toca la nota configurada call RetM call RetM call RetM call RetM call Sigrave call TocaNota2 ; Toca la nota configurada call Miniret call RetC call Sigrave call TocaNota2 ; Toca la nota configurada call Miniret call RetC call Sigrave call TocaNota2 ; Toca la nota configurada call Miniret call RetC call Do call TocaNota2 ; Toca la nota configurada call Mi call TocaNota3 ; Toca la nota configurada call RetM call Fa call TocaNota2 ; Toca la nota configurada call Miniret call RetC call Fa call TocaNota2 ; Toca la nota configurada call Miniret call RetC call Fa call TocaNota2 ; Toca la nota configurada call Miniret call RetC call Fa call TocaNota2 ; Toca la nota configurada call RetM bcf PCLATH,3 goto campions2 caribe ; nivelll3 bsf STATUS,RP0 ; Tria el banc 1 movlw b'00100000' ; Definim com volem les E/S del port C movwf TRISC ; RC5 (sortida del PWM) com a entrada bcf STATUS,RP0 ; Tria el banc 0 movlw b'00001100' ; Configura el PWM, bits P1M (bits 7-6) a 00 mode senzill ; DC1B = 00 (bits 5-4) els dos bits de menys pes són 0 ; CCP1M = 11xx en mode senzill els bit 0 i 1 no afecten movwf ValCCP1CON ; Ho guarda per fer-ho servir més tard movwf CCP1CON ; Ho posa com a configuració del PWM movlw b'00000011' ; Configura el Timer 2 ; bits T2KCPS (bits 1-0) a 11 prescalat de 16 ; bit 2 (TMR2ON) a 0, Timer aturat ; Postscaler TOUTPS (bits 6-3) no afecten al PWM movwf T2CON ; Ho posa com a configuració del Timer 2 call Do call TocaNota4 ; Toca la nota configurada call Mib call TocaNota4 ; Toca la nota configurada call Fa call TocaNota4 ; Toca la nota configurada call RetM call Fa call TocaNota4 ; Toca la nota configurada call RetM call Fa call TocaNota4 ; Toca la nota configurada call Sol call TocaNota4 ; Toca la nota configurada call Lab call TocaNota4 ; Toca la nota configurada call RetM call Lab call TocaNota4 ; Toca la nota configurada call RetM call Lab call TocaNota4 ; Toca la nota configurada call Sib call TocaNota4 ; Toca la nota configurada call Sol call TocaNota4 ; Toca la nota configurada call RetM call Sol call TocaNota4 ; Toca la nota configurada call RetM call Fa call TocaNota4 ; Toca la nota configurada call Mib call TocaNota4 ; Toca la nota configurada call Miniret call RetC call Mib call TocaNota4 ; Toca la nota configurada call Fa call TocaNota4 ; Toca la nota configurada call RetM call RetM call Do call TocaNota4 ; Toca la nota configurada call Mib call TocaNota4 ; Toca la nota configurada call Fa call TocaNota4 ; Toca la nota configurada call RetM call Fa call TocaNota4 ; Toca la nota configurada call RetM call Fa call TocaNota4 ; Toca la nota configurada call Sol call TocaNota4 ; Toca la nota configurada call Lab call TocaNota4 ; Toca la nota configurada call RetM call Lab call TocaNota4 ; Toca la nota configurada call RetM call Lab call TocaNota4 ; Toca la nota configurada call Sib call TocaNota4 ; Toca la nota configurada call Sol call TocaNota4 ; Toca la nota configurada call RetM call Sol call TocaNota4 ; Toca la nota configurada call RetM call Fa call TocaNota4 ; Toca la nota configurada call Mib call TocaNota4 ; Toca la nota configurada call Fa call TocaNota4 ; Toca la nota configurada call RetM call RetM call Do call TocaNota4 ; Toca la nota configurada call Mib call TocaNota4 ; Toca la nota configurada call Fa call TocaNota4 ; Toca la nota configurada call RetM call Fa call TocaNota4 ; Toca la nota configurada call RetM call Fa call TocaNota4 ; Toca la nota configurada call Lab call TocaNota4 ; Toca la nota configurada call Sib call TocaNota4 ; Toca la nota configurada call RetM call Sib call TocaNota4 ; Toca la nota configurada call RetM call Sib call TocaNota4 ; Toca la nota configurada call Doagud call TocaNota4 ; Toca la nota configurada call Dosostagud call TocaNota4 ; Toca la nota configurada call RetM call Dosostagud call TocaNota4 ; Toca la nota configurada call RetM call Doagud call TocaNota4 ; Toca la nota configurada call Sib call TocaNota4 ; Toca la nota configurada call Doagud call TocaNota4 ; Toca la nota configurada call Fa call TocaNota4 ; Toca la nota configurada call RetM call RetM call Fa call TocaNota4 ; Toca la nota configurada call Sol call TocaNota4 ; Toca la nota configurada call Lab call TocaNota4 ; Toca la nota configurada call RetM call Lab call TocaNota4 ; Toca la nota configurada call RetM call Sib call TocaNota4 ; Toca la nota configurada call RetM call Doagud call TocaNota4 ; Toca la nota configurada call Fa call TocaNota4 ; Toca la nota configurada call RetM call RetM call Fa call TocaNota4 ; Toca la nota configurada call Lab call TocaNota4 ; Toca la nota configurada call Sol call TocaNota4 ; Toca la nota configurada call RetM call Sol call TocaNota4 ; Toca la nota configurada call RetM call Fa call TocaNota4 ; Toca la nota configurada call Mi call TocaNota4 ; Toca la nota configurada call Fa call TocaNota3 ; Toca la nota configurada call RetM bcf PCLATH,3 goto campions2 imperio ; nivell4 bsf STATUS,RP0 ; Tria el banc 1 movlw b'00100000' ; Definim com volem les E/S del port C movwf TRISC ; RC5 (sortida del PWM) com a entrada bcf STATUS,RP0 ; Tria el banc 0 movlw b'00001100' ; Configura el PWM, bits P1M (bits 7-6) a 00 mode senzill ; DC1B = 00 (bits 5-4) els dos bits de menys pes són 0 ; CCP1M = 11xx en mode senzill els bit 0 i 1 no afecten movwf ValCCP1CON ; Ho guarda per fer-ho servir més tard movwf CCP1CON ; Ho posa com a configuració del PWM movlw b'00000011' ; Configura el Timer 2 ; bits T2KCPS (bits 1-0) a 11 prescalat de 16 ; bit 2 (TMR2ON) a 0, Timer aturat ; Postscaler TOUTPS (bits 6-3) no afecten al PWM movwf T2CON ; Ho posa com a configuració del Timer 2 call Sol call TocaNota3 ; Toca la nota configurada call RetM call Sol call TocaNota3 ; Toca la nota configurada call RetM call Sol call TocaNota3 ; Toca la nota configurada call RetM call Reb call TocaNota3 ; Toca la nota configurada call Sib call TocaNota2 ; Toca la nota configurada call Sol call TocaNota3 ; Toca la nota configurada call RetM call Reb call TocaNota3 ; Toca la nota configurada call Sib call TocaNota2 ; Toca la nota configurada call Sol call TocaNota3 ; Toca la nota configurada call RetM call RetM ; Espera 0,2 s call RetM ; Espera 0,2 s call RetM ; Espera 0,2 s call Reagud call TocaNota3 ; Toca la nota configurada call RetM call Reagud call TocaNota3 ; Toca la nota configurada call RetM call Reagud call TocaNota3 ; Toca la nota configurada call RetM call Mibagudo call TocaNota3 ; Toca la nota configurada call Sib call TocaNota2 ; Toca la nota configurada call Fasost call TocaNota3 ; Toca la nota configurada call RetM call Reb call TocaNota3 ; Toca la nota configurada call Sib call TocaNota2 ; Toca la nota configurada call Sol call TocaNota3 ; Toca la nota configurada call RetM ; Espera 0,2 s bcf PCLATH,3 goto campions2 gameover bsf STATUS,RP0 ; Tria el banc 1 movlw b'00100000' ; Definim com volem les E/S del port C movwf TRISC ; RC5 (sortida del PWM) com a entrada bcf STATUS,RP0 ; Tria el banc 0 movlw b'00001100' ; Configura el PWM, bits P1M (bits 7-6) a 00 mode senzill ; DC1B = 00 (bits 5-4) els dos bits de menys pes són 0 ; CCP1M = 11xx en mode senzill els bit 0 i 1 no afecten movwf ValCCP1CON ; Ho guarda per fer-ho servir més tard movwf CCP1CON ; Ho posa com a configuració del PWM movlw b'00000011' ; Configura el Timer 2 ; bits T2KCPS (bits 1-0) a 11 prescalat de 16 ; bit 2 (TMR2ON) a 0, Timer aturat ; Postscaler TOUTPS (bits 6-3) no afecten al PWM movwf T2CON ; Ho posa com a configuració del Timer 2 call Doagud call TocaNota3 ; Toca la nota configurada call RetM call Sol call TocaNota3 call RetM call Mi call TocaNota3 call La call TocaNota2 call Si call TocaNota2 call La call TocaNota2 call Lab call TocaNota2 call Sib call TocaNota2 call Lab call TocaNota2 call Sol call TocaNota3 ; Toca la nota configurada call RetM bcf PCLATH,3 goto fracas2 TocaNota2 movf ValPR2,w ; Valor de PR2 per a la nota desitjada bsf STATUS,RP0 ; Tria el banc 1 bsf TRISC,5 ; Posem RC5 (sortida del PWM) com a entrada movwf PR2 ; Ho posem com a comparació al Timer 2 bcf STATUS,RP0 ; Tria el banc 0 movf ValCCP1CON,w ; Agafa la configuració de CCP1CON andlw b'11001111' ; Posa els bits que corresponen a DC1B a zero per precaució movwf ValCCP1CON ; I ho torna a guardar swapf ValDC1B,w ; Agafa el valor que ha d'anar a DC1B ; I el guarda, permutat, a W ; Els dos bits han de quedar a les posicions 4-5 andlw b'00110000' ; Posa els altres sis bits a zero per precaució iorwf ValCCP1CON,w ; I ho afegeix a CCP1CON movwf CCP1CON ; Ho posa com a configuració del PWM movf ValCCPR1L,w ; Valor de CCPR1L movwf CCPR1L ; Registre que ens dona l'amplada de tON bcf PIR1,TMR2IF ; Desactiva el bit d'interrupció del Timer 2 bsf T2CON,TMR2ON ; Activa el Timer 2 ; No convé engegar el PWM fins que el Timer 2 no ha fet un cicle btfss PIR1,TMR2IF ; Espera l'activació del bit d'interrupció del Timer 2 goto $-1 bsf STATUS,RP0 ; Tria el banc 1 bcf TRISC,5 ; Posem RC5 (sortida del PWM) com a sortida bcf STATUS,RP0 ; Tria el banc 0 call RetM ; 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 return TocaNota4 movf ValPR2,w ; Valor de PR2 per a la nota desitjada bsf STATUS,RP0 ; Tria el banc 1 bsf TRISC,5 ; Posem RC5 (sortida del PWM) com a entrada movwf PR2 ; Ho posem com a comparació al Timer 2 bcf STATUS,RP0 ; Tria el banc 0 movf ValCCP1CON,w ; Agafa la configuració de CCP1CON andlw b'11001111' ; Posa els bits que corresponen a DC1B a zero per precaució movwf ValCCP1CON ; I ho torna a guardar swapf ValDC1B,w ; Agafa el valor que ha d'anar a DC1B ; I el guarda, permutat, a W ; Els dos bits han de quedar a les posicions 4-5 andlw b'00110000' ; Posa els altres sis bits a zero per precaució iorwf ValCCP1CON,w ; I ho afegeix a CCP1CON movwf CCP1CON ; Ho posa com a configuració del PWM movf ValCCPR1L,w ; Valor de CCPR1L movwf CCPR1L ; Registre que ens dona l'amplada de tON bcf PIR1,TMR2IF ; Desactiva el bit d'interrupció del Timer 2 bsf T2CON,TMR2ON ; Activa el Timer 2 ; No convé engegar el PWM fins que el Timer 2 no ha fet un cicle btfss PIR1,TMR2IF ; Espera l'activació del bit d'interrupció del Timer 2 goto $-1 bsf STATUS,RP0 ; Tria el banc 1 bcf TRISC,5 ; Posem RC5 (sortida del PWM) com a sortida bcf STATUS,RP0 ; Tria el banc 0 call Miniret2 call Miniret call Miniret2 call Miniret call Miniret2 ; 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 return TocaNota3 movf ValPR2,w ; Valor de PR2 per a la nota desitjada bsf STATUS,RP0 ; Tria el banc 1 bsf TRISC,5 ; Posem RC5 (sortida del PWM) com a entrada movwf PR2 ; Ho posem com a comparació al Timer 2 bcf STATUS,RP0 ; Tria el banc 0 movf ValCCP1CON,w ; Agafa la configuració de CCP1CON andlw b'11001111' ; Posa els bits que corresponen a DC1B a zero per precaució movwf ValCCP1CON ; I ho torna a guardar swapf ValDC1B,w ; Agafa el valor que ha d'anar a DC1B ; I el guarda, permutat, a W ; Els dos bits han de quedar a les posicions 4-5 andlw b'00110000' ; Posa els altres sis bits a zero per precaució iorwf ValCCP1CON,w ; I ho afegeix a CCP1CON movwf CCP1CON ; Ho posa com a configuració del PWM movf ValCCPR1L,w ; Valor de CCPR1L movwf CCPR1L ; Registre que ens dona l'amplada de tON bcf PIR1,TMR2IF ; Desactiva el bit d'interrupció del Timer 2 bsf T2CON,TMR2ON ; Activa el Timer 2 ; No convé engegar el PWM fins que el Timer 2 no ha fet un cicle btfss PIR1,TMR2IF ; Espera l'activació del bit d'interrupció del Timer 2 goto $-1 bsf STATUS,RP0 ; Tria el banc 1 bcf TRISC,5 ; Posem RC5 (sortida del PWM) com a sortida bcf STATUS,RP0 ; Tria el banc 0 call RetM ; Espera 0,2 s call RetM ; 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 return Sigrave movlw .250 ; Valor que correspon aproximadament a la nota movwf ValPR2 ; Ho posem com a valor de PR2 movlw .130 ; 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 return Do movlw .238 ; Valor que correspon aproximadament a la nota 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 return Re movlw .212 ; Valor que correspon aproximadament a la nota 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 return Reb movlw .200 ; Valor que correspon aproximadament a la nota 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 return Mi movlw .189 ; Valor que correspon aproximadament a la nota 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 return Mib movlw .200 ; Valor que correspon aproximadament a la nota 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 return Fa movlw .178 ; Valor que correspon aproximadament a la nota 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 return Fasost movlw .168 ; Valor que correspon aproximadament a la nota 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 return Sol movlw .158 ; Valor que correspon aproximadament a la nota 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 return La movlw .141 ; Valor que correspon aproximadament a la nota 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 return Lab movlw .149 ; Valor que correspon aproximadament a la nota 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 return Si movlw .126 ; Valor que correspon aproximadament a la nota 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 return Sib movlw .133 ; Valor que correspon aproximadament a la nota 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 return Doagud movlw .118 ; Valor que correspon aproximadament a la nota 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 .0 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B return Dosostagud movlw .113 ; Valor que correspon aproximadament a la nota movwf ValPR2 ; Ho posem com a valor de PR2 movlw .56 ; 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 return Reagud movlw .107 ; Valor que correspon aproximadament a la nota 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 .2 ; Valor dels bits de menys pes del CCP movwf ValDC1B ; Valor de DC1B return Mibagudo movlw .100 ; Valor que correspon aproximadament a la nota movwf ValPR2 ; Ho posem com a valor de PR2 movlw .50 ; 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 return RetM ; Funció de retard de 0,2 s decfsz Retard1,f goto RetM decfsz Retard2,f goto RetM return Miniret call RetC call RetC call RetC call RetC call RetC call RetC call RetC call RetC return Miniret2 call Miniret call Miniret call Miniret call Miniret call Miniret call Miniret call Miniret return RetC decfsz Retard3,f goto RetC return end

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