Aquest grup va decidir fer servir dues variables de setze bits per guardar les posicions de les fitxes de cada jugador.
Els tres polsadors de l'esquerra de la part inferior serveixen per seleccionar la fila o la columna. Els altres dos polsadors de la part inferior serveixen per acceptar la posició, el de la dreta la columna i l'altre per a la filera.
El programa final és:
#include <p16F690.inc> __config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
cblock 0x20 Port ; Bits a enviar al port B Sortida:6 ; Valors a enviar al MAX7221 (48 bits) Compta ; Variable per comptar els bits Filera ; Variable per comptar fileres Actiu ; Variable que diu quin color està actiu Jug1:2 Jug2:2 Fila Columna Polsador Guanyador Caracter ; Actiu = 0 Apagat ; Actiu = 1 Vermell ; Actiu = 2 Verd ; Actiu = 3 Blau Retard1 ; Variables per als cicles de retard Retard2 Retard3 W_Copia ; Guardarà el contingut de W durant la interrupció ST_Copia ; Guardarà STATUS durant la interrupció endc
org 0 goto Inici ; Saltem al lloc on hi ha el programa principal nop ; Zona de memòria de programa que no utilitzem nop nop
Interrup bcf INTCON,GIE ; Desactiva les interrupcions moment?niament movwf W_Copia ; Copiem l'acumulador a W_Copia swapf STATUS,w ; Copiem STATUS a l'acumulador permutant els nibbles clrf STATUS ; Posa a 0 i així segur que el banc és el 0 movwf ST_Copia ; Guarda STATUS permutat a ST_Copia btfss INTCON,T0IF ; Mira si Timer0 ha arribat a zero ; Si hi ha arribat, no fa la instrucció següent goto FiInt ; Si la interrupció no és del Timer0 no fem res Timer0 ; Programa corresponent a Timer0 bcf INTCON,T0IF ; Si ha arribat, desactivem el bit movlw .139 ; Nova preselecció movwf TMR0 ; Ho posem a TMR0 ; Anem a gestionar el canvi de color movlw b'00000011' ; Descarta els bits que no serveixen andwf Actiu,f btfsc STATUS,Z goto NoZero ; Si Actiu val 0 no ho canvia decf Actiu,f ; Passem a activar un altre color btfss STATUS,Z ; Si s'activa Z és que hem arribat a zero goto NoZero ; Si és zero, tornem a 3 movlw .3 movwf Actiu NoZero ; Gestiona l'activació de tres MAX7221 ; Segons Actiu, activa un color o un altre movlw b'00000011' ; Descarta els bits que no serveixen andwf Actiu,f btfsc STATUS,Z ; Salta si el resultat no és zero goto Apagat ; Si est? apagat ho desactiva tot movlw .1 xorwf Actiu,w btfsc STATUS,Z goto Vermell ; Si val 1, activem el vermell movlw .2 xorwf Actiu,w btfsc STATUS,Z goto Verd ; Si val 2, activem el verd ; Si no és cap d'ells, activem el blau movlw 0x01 ; Activat movwf Sortida+4 ; Blau movlw 0x00 ; Desactivat movwf Sortida ; Vermell movwf Sortida+2 ; Verd movlw .1 goto Activa Vermell movlw 0x01 ; Activat movwf Sortida ; Vermell movlw 0x00 ; Desactivat movwf Sortida+2 ; Verd movwf Sortida+4 ; Blau nop ; Temps a afegir nop nop nop goto Activa Verd movlw 0x01 ; Activat movwf Sortida+2 ; Verd movlw 0x00 ; Desactivat movwf Sortida ; Vermell movwf Sortida+4 ; Blau goto Activa Apagat movlw 0x00 ; Desactivat movwf Sortida ; Vermell movwf Sortida+2 ; Verd movwf Sortida+4 ; Blau Activa movlw 0x0C ; Shutdown mode movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 FiInt swapf ST_Copia,w ; Copia permutant ST_Copia a l'acumulador movwf STATUS ; I ho passa a STATUS recuperant el valor d'abans ; de la interrupció swapf W_Copia,f ; Permuta els bits de W_Copia swapf W_Copia,w ; Torna a permutar els bits de W_Copia ; i els guarda a l'acumulador sense variar STATUS bsf INTCON,GIE ; Reactiva les interrupcions a l'acabar retfie ; Torna al programa principal, on s'havia quedat
Inici bsf STATUS,RP0 ; Tria el banc 1 movlw b'10000101' ; Configuració de Timer0 ; Com a temporitzador basat en rellotge ; 101 - Factor d'escala de 64 ; I resistències de pull-up desactivades (valor per defecte) movwf OPTION_REG ; Ho guarda al registre de configuració del Timer0 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'00010000' movwf ADCON1 ; Activa les interrupcions globals i la de Timer0 bsf TXSTA,BRGH ; Configuracià de velocitat bcf BAUDCTL,BRG16 ; Paràmetre de velocitat de 8 bits movlw .25 ; Velocitat de 9600 baud movwf SPBRG ; Paràmetre de velocitat bcf TXSTA,SYNC ; Comunicació asàncrona bcf TXSTA,TX9 ; comuniació de 8 bits bcf STATUS,RP0 bsf STATUS,RP1 ; Tria el banc 2 movlw b'00000101' movwf ANSEL clrf ANSELH bcf STATUS,RP0 ; Configura AN0 i AN2 com entrada analògica bcf STATUS,RP1 ; Tria el banc 0 movlw b'00001001' movwf ADCON0 clrf PORTC clrf Port ; Posa a zero tots els bits de la variable Port movf Port,w movwf PORTB ; I ho envia al port B call Ini3max ; Inicialitza la matriu call Apaga ; Apaga els LED ; Configura Timer 0 i activa la matriu i les interrupcions ; Una interrupció cada, aproximadament, 10 ms movlw .1 movwf Actiu ; Posa en marxa el vermell movlw .139 ; Presselecció de 139, que són 117 iteracions movwf TMR0 ; Ho posa com a preselecció del temporitzador movlw b'10100000' ; Activem GIE i T0IE movwf INTCON IniciJOC clrf Jug1 clrf Jug2 bcf Jug1+1,0 bcf Jug2+1,0 clrf Guanyador call Retard1s call inicideljoc call Retard1s call Retard1s call Retard1s call TAULER tiradaJ1 clrf Fila clrf Columna clrf Polsador call tiraJ1 bucle11 call Llegir btfsc Polsador,0 goto passahofila btfsc Polsador,1 goto passahofila btfsc Polsador,2 goto passahofila goto bucle11 passahofila movf Polsador,w movwf Fila rellegeix call Llegir btfss Polsador,3 goto rellegeix goto bucle21 bucle21 call Llegir btfsc Polsador,0 goto copiacolumna1 btfsc Polsador,1 goto copiacolumna1 btfsc Polsador,2 goto copiacolumna1 goto bucle21 copiacolumna1 movf Polsador,w movwf Columna buclepolsador2 call Llegir btfss Polsador,4 goto buclepolsador2 copiar1 Fila1 btfss Fila,0 goto Fila2 btfsc Columna,0 goto $+2 goto $+8 btfsc Jug2,0 goto $+2 goto $+4 call posicioocupada call Retard1s goto tiradaJ1 bsf Jug1,0 btfsc Columna,1 goto $+2 goto $+8 btfsc Jug2,1 goto $+2 goto $+4 call posicioocupada call Retard1s goto tiradaJ1 bsf Jug1,1 btfsc Columna,2 goto $+2 goto $+8 btfsc Jug2,2 goto $+2 goto $+4 call posicioocupada call Retard1s goto tiradaJ1 bsf Jug1,2 Fila2 btfss Fila,1 goto Fila3 btfsc Columna,0 goto $+2 goto $+8 btfsc Jug2,3 goto $+2 goto $+4 call posicioocupada call Retard1s goto tiradaJ1 bsf Jug1,3 btfsc Columna,1 goto $+2 goto $+8 btfsc Jug2,4 goto $+2 goto $+4 call posicioocupada call Retard1s goto tiradaJ1 bsf Jug1,4 btfsc Columna,2 goto $+2 goto $+8 btfsc Jug2,5 goto $+2 goto $+4 call posicioocupada call Retard1s goto tiradaJ1 bsf Jug1,5 Fila3 btfss Fila,2 goto Final btfsc Columna,0 goto $+2 goto $+8 btfsc Jug2,6 goto $+2 goto $+4 call posicioocupada call Retard1s goto tiradaJ1 bsf Jug1,6 btfsc Columna,1 goto $+2 goto $+8 btfsc Jug2,7 goto $+2 goto $+4 call posicioocupada call Retard1s goto tiradaJ1 bsf Jug1,7 btfsc Columna,2 goto $+2 goto $+8 btfsc Jug2+1,0 goto $+2 goto $+4 call posicioocupada call Retard1s goto tiradaJ1 bsf Jug1+1,0 Final call MATRIULED call comprovartresenliniaJug1 btfss Guanyador,0 goto tiradaJ2 goto GuanyadordelJoc1 tiradaJ2 clrf Fila clrf Columna clrf Polsador call tiraJ2 bucle12 call Llegir btfsc Polsador,0 goto passahofila2 btfsc Polsador,1 goto passahofila2 btfsc Polsador,2 goto passahofila2 goto bucle12 passahofila2 movf Polsador,w movwf Fila rellegeix2 call Llegir btfss Polsador,3 goto rellegeix2 goto bucle22 bucle22 call Llegir btfsc Polsador,0 goto passahocolumna2 btfsc Polsador,1 goto passahocolumna2 btfsc Polsador,2 goto passahocolumna2 goto bucle22 passahocolumna2 movf Polsador,w movwf Columna confirmacolumna call Llegir btfss Polsador,4 goto confirmacolumna copiar12 Fila12 btfss Fila,0 goto Fila22 btfsc Columna,0 goto $+2 goto $+8 btfsc Jug1,0 goto $+2 goto $+4 call posicioocupada call Retard1s goto tiradaJ2 bsf Jug2,0 btfsc Columna,1 goto $+2 goto $+8 btfsc Jug1,1 goto $+2 goto $+4 call posicioocupada call Retard1s goto tiradaJ2 bsf Jug2,1 btfsc Columna,2 goto $+2 goto $+8 btfsc Jug1,2 goto $+2 goto $+4 call posicioocupada call Retard1s goto tiradaJ2 bsf Jug2,2 Fila22 btfss Fila,1 goto Fila32 btfsc Columna,0 goto $+2 goto $+8 btfsc Jug1,3 goto $+2 goto $+4 call posicioocupada call Retard goto tiradaJ2 bsf Jug2,3 btfsc Columna,1 goto $+2 goto $+8 btfsc Jug1,4 goto $+2 goto $+4 call posicioocupada call Retard goto tiradaJ2 bsf Jug2,4 btfsc Columna,2 goto $+2 goto $+8 btfsc Jug1,5 goto $+2 goto $+4 call posicioocupada call Retard goto tiradaJ2 bsf Jug2,5 Fila32 btfss Fila,2 goto Final2 btfsc Columna,0 goto $+2 goto $+8 btfsc Jug1,6 goto $+2 goto $+4 call posicioocupada call Retard goto tiradaJ2 bsf Jug2,6 btfsc Columna,1 goto $+2 goto $+8 btfsc Jug1,7 goto $+2 goto $+4 call posicioocupada call Retard goto tiradaJ2 bsf Jug2,7 btfsc Columna,2 goto $+2 goto $+8 btfsc Jug1+1,0 goto $+2 goto $+4 call posicioocupada call Retard goto tiradaJ2 bsf Jug2+1,0 Final2 call MATRIULED call comprovartresenliniaJug2 btfss Guanyador,1 goto tiradaJ1 goto GuanyadordelJoc2 GuanyadordelJoc1 call guanyadorJ1 call Retard1s call Retard1s goto inicialitza GuanyadordelJoc2 call guanyadorJ2 call Retard1s call Retard1s inicialitza goto IniciJOC
; FUNCIONS ; FUNCIÓ MATRIU LED MATRIULED ; Matriu 1 movlw 0x01 ; Filera 1 movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 movlw 0x00 btfsc Jug1,0 ; Ho prepara per enviar-ho iorlw b'11000000' movwf Sortida btfsc Jug1,1 iorlw b'00011000' ; Vermells movwf Sortida btfsc Jug1,2 iorlw b'00000011' movwf Sortida movlw 0x00 ; Ho prepara per enviar-ho movlw b'00100100' ; Verds movwf Sortida+2 ; Ho prepara per enviar-ho movlw 0x00 btfsc Jug2,0 ; Ho prepara per enviar-ho iorlw b'11000000' movwf Sortida+4 btfsc Jug2,1 iorlw b'00011000' ; Vermells movwf Sortida+4 btfsc Jug2,2 iorlw b'00000011' movwf Sortida+4 movlw 0x00 ; Blaus ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 movlw 0x02 ; Filera 2 movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 movlw 0x00 btfsc Jug1,0 ; Ho prepara per enviar-ho iorlw b'11000000' movwf Sortida btfsc Jug1,1 iorlw b'00011000' movwf Sortida btfsc Jug1,2 iorlw b'00000011' movwf Sortida movlw 0x00 ; Vermells movlw b'00100100' ; Verds movwf Sortida+2 ; Ho prepara per enviar-ho movlw 0x00 btfsc Jug2,0 iorlw b'11000000' movwf Sortida+4 btfsc Jug2,1 iorlw b'00011000' ; Vermells movwf Sortida+4 btfsc Jug2,2 iorlw b'00000011' movwf Sortida+4 movlw 0x00 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 movlw 0x03 ; Filera 3 movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 movlw b'00000000' movwf Sortida ; Ho prepara per enviar-ho movlw b'11111111' ; Verds movwf Sortida+2 ; Ho prepara per enviar-ho movlw b'00000000' ; Blaus movwf Sortida+4 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 movlw 0x04 ; Filera 4 movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 movlw 0x00 movwf Sortida ; Ho prepara per enviar-ho btfsc Jug1,3 iorlw b'11000000' ; Vermells movwf Sortida btfsc Jug1,4 iorlw b'00011000' movwf Sortida btfsc Jug1,5 iorlw b'00000011' movwf Sortida movlw 0x00 ; Vermells movlw b'00100100' ; Verds movwf Sortida+2 movlw 0 movwf Sortida+4 ; Ho prepara per enviar-ho btfsc Jug2,3 iorlw b'11000000' ; Vermells movwf Sortida+4 btfsc Jug2,4 iorlw b'00011000' movwf Sortida+4 btfsc Jug2,5 iorlw b'00000011' movwf Sortida+4 movlw 0x00 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 movlw 0x05 ; Filera 5 movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 movlw 0x00 movwf Sortida btfsc Jug1,3 ; Ho prepara per enviar-ho iorlw b'11000000' ; Vermells movwf Sortida btfsc Jug1,4 iorlw b'00011000' movwf Sortida btfsc Jug1,5 iorlw b'00000011' movwf Sortida movlw 0x00 ; Ho prepara per enviar-ho movlw b'00100100' ; Verds movwf Sortida+2 ; Ho prepara per enviar-ho movlw 0 movwf Sortida+4 btfsc Jug2,3 iorlw b'11000000' ; Vermells movwf Sortida+4 btfsc Jug2,4 iorlw b'00011000' movwf Sortida+4 btfsc Jug2,5 iorlw b'00000011' movwf Sortida+4 movlw 0x00 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 movlw 0x06 ; Filera 6 movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 ; Ho prepara per enviar-ho movlw b'00000000' ; Vermells movwf Sortida ; Ho prepara per enviar-ho movlw b'11111111' ; Verds movwf Sortida+2 ; Ho prepara per enviar-ho movlw b'00000000' ; Blaus movwf Sortida+4 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 movlw 0x07 ; Filera 7 movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 movlw 0x00 movwf Sortida btfsc Jug1,6 ; Ho prepara per enviar-ho iorlw b'11000000' ; Vermells movwf Sortida btfsc Jug1,7 iorlw b'00011000' movwf Sortida btfsc Jug1+1,0 iorlw b'00000011' movwf Sortida movlw 0x00 ; Ho prepara per enviar-ho movlw b'00100100' ; Verds movwf Sortida+2 ; Ho prepara per enviar-ho movlw 0 movwf Sortida+4 btfsc Jug2,6 ; Ho prepara per enviar-ho iorlw b'11000000' ; Vermells movwf Sortida+4 btfsc Jug2,7 iorlw b'00011000' movwf Sortida+4 btfsc Jug2+1,0 iorlw b'00000011' movwf Sortida+4 movlw 0x00 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 movlw 0x08 ; Filera 8 movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 movlw 0x00 movwf Sortida btfsc Jug1,6 ; Ho prepara per enviar-ho iorlw b'11000000' ; Vermells movwf Sortida btfsc Jug1,7 iorlw b'00011000' movwf Sortida btfsc Jug1+1,0 iorlw b'00000011' movwf Sortida movlw 0x00 ; Ho prepara per enviar-ho movlw b'00100100' ; Verds movwf Sortida+2 ; Ho prepara per enviar-ho movlw 0 movwf Sortida+4 btfsc Jug2,6 ; Ho prepara per enviar-ho iorlw b'11000000' ; Vermells movwf Sortida+4 btfsc Jug2,7 iorlw b'00011000' movwf Sortida+4 btfsc Jug2+1,0 iorlw b'00000011' movwf Sortida+4 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 ; Fi de la matriu 1 return ; Torna a repetir TAULER ; Matriu 1 movlw 0x01 ; Filera 1 movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 ; Ho prepara per enviar-ho movlw b'00000000' ; Vermells movwf Sortida ; Ho prepara per enviar-ho movlw b'00100100' ; Verds movwf Sortida+2 ; Ho prepara per enviar-ho movlw b'00000000' ; Blaus movwf Sortida+4 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 movlw 0x02 ; Filera 2 movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 ; Ho prepara per enviar-ho movlw b'00000000' ; Vermells movwf Sortida ; Ho prepara per enviar-ho movlw b'00100100' ; Verds movwf Sortida+2 ; Ho prepara per enviar-ho movlw b'00000000' ; Blaus movwf Sortida+4 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 movlw 0x03 ; Filera 3 movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 ; Ho prepara per enviar-ho movlw b'00000000' ; Vermells movwf Sortida ; Ho prepara per enviar-ho movlw b'11111111' ; Verds movwf Sortida+2 ; Ho prepara per enviar-ho movlw b'00000000' ; Blaus movwf Sortida+4 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 movlw 0x04 ; Filera 4 movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 ; Ho prepara per enviar-ho movlw b'00000000' ; Vermells movwf Sortida ; Ho prepara per enviar-ho movlw b'00100100' ; Verds movwf Sortida+2 ; Ho prepara per enviar-ho movlw b'00000000' ; Blaus movwf Sortida+4 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 movlw 0x05 ; Filera 5 movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 ; Ho prepara per enviar-ho movlw b'00000000' ; Vermells movwf Sortida ; Ho prepara per enviar-ho movlw b'00100100' ; Verds movwf Sortida+2 ; Ho prepara per enviar-ho movlw b'00000000' ; Blaus movwf Sortida+4 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 movlw 0x06 ; Filera 6 movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 ; Ho prepara per enviar-ho movlw b'00000000' ; Vermells movwf Sortida ; Ho prepara per enviar-ho movlw b'11111111' ; Verds movwf Sortida+2 ; Ho prepara per enviar-ho movlw b'00000000' ; Blaus movwf Sortida+4 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 movlw 0x07 ; Filera 7 movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 ; Ho prepara per enviar-ho movlw b'00000000' ; Vermells movwf Sortida ; Ho prepara per enviar-ho movlw b'00100100' ; Verds movwf Sortida+2 ; Ho prepara per enviar-ho movlw b'00000000' ; Blaus movwf Sortida+4 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 movlw 0x08 ; Filera 8 movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 ; Ho prepara per enviar-ho movlw b'00000000' ; Vermells movwf Sortida ; Ho prepara per enviar-ho movlw b'00100100' ; Verds movwf Sortida+2 ; Ho prepara per enviar-ho movlw b'00000000' ; Blaus movwf Sortida+4 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 ; Fi de la matriu 1 return ; ; Apaga tots els LED ; Apaga movlw .8 ; Hem d'apagar vuit fileres movwf Filera ; Ho guarda al comptador Repetir movf Filera,w ; Filera actual movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 ; Ho prepara per enviar-ho movlw b'00000000' ; Apagat movwf Sortida ; Ho prepara per enviar-ho movwf Sortida+2 ; Ho prepara per enviar-ho movwf Sortida+4 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 decfsz Filera,f ; Passem a una altra filera goto Repetir return ; ; Inicialització de tres MAX7221 ; Ini3max movlw 0x0C ; Shutdown mode movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 ; Ho prepara per enviar-ho movlw 0x00 ; Desactivat movwf Sortida ; Ho prepara per enviar-ho movwf Sortida+2 ; Ho prepara per enviar-ho movwf Sortida+4 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 movlw 0x09 ; Decode mode movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 ; Ho prepara per enviar-ho movlw 0x00 ; No decode movwf Sortida ; Ho prepara per enviar-ho movwf Sortida+2 ; Ho prepara per enviar-ho movwf Sortida+4 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 movlw 0x0B ; Scan limit movwf Sortida+1 ; Ho prepara per enviar-ho movwf Sortida+3 ; Ho prepara per enviar-ho movwf Sortida+5 ; Ho prepara per enviar-ho movlw 0x07 ; Vuit fileres movwf Sortida ; Ho prepara per enviar-ho movwf Sortida+2 ; Ho prepara per enviar-ho movwf Sortida+4 ; Ho prepara per enviar-ho call Envia3max ; Ho envia al MAX7221 return ; ; Envia dades (48 bits) a tres MAX7221 ; ; Els bits estan a les variables: ; Sortida Valor vermells ; Sortida+1 Adreça vermells ; Sortida+2 Valor verds ; Sortida+3 Adreça verds ; Sortida+4 Valor blaus ; Sortida+5 Adreça blaus ; Al final de la funció, el valor de Sortida queda corromput ; Si es vol conservar, cal copiar-lo a una altra variable ; ; Aquesta funció dura, aproximadament, 1 ms Envia3max bcf INTCON,GIE ; Desactiva les interrupcions momentàniament bcf Port,5 ; S'assegura que Clock està desactivat bcf Port,6 ; S'assegura que Latch està desactivat movf Port,w ; Agafa el valor de Port movwf PORTB ; I el posa al port B movlw .48 ; Nàmero de bits a enviar movwf Compta ; Variable per comptar els bits Bucle3max 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 rlf Sortida+1,f ; i roda els altres a l'esquerra rlf Sortida+2,f rlf Sortida+3,f rlf Sortida+4,f rlf Sortida+5,f btfsc STATUS,C ; Mira si el bit de l'esquerra era un 1 bsf Port,4 ; Si era 1, activa Data movf Port,w ; Agafa el valor de Port. El valor que ha canviat és Data movwf PORTB ; I el posa al port B bsf Port,5 ; Activa Clock, forçant a llegir el bit movf Port,w ; Agafa el valor de Port. El valor que ha canviat és Clock movwf PORTB ; I el posa al port B bcf Port,5 ; Desactiva Clock movf Port,w ; Agafa el valor de Port. El valor que ha canviat és Clock movwf PORTB ; I el posa al port B decfsz Compta,f ; Decrementa Compta goto Bucle3max ; 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 bsf INTCON,GIE ; Torna a activar les interrupcions return ; FUNCIÓ LECTURA POLSADORS Llegir clrf Polsador ; Si aquest valor no es canvia és que no hi ha cap polsador premut nop ; espera un microsegon nop ; espera un microsegon nop ; espera un microsegon nop ; espera un microsegon nop ; espera un microsegon, en total 5 bsf ADCON0,GO ; Inicia la conversió btfsc ADCON0,GO ; Quan el bit sigui 0 la conversió haurà acabat goto $-1 ; repetim la línia fins que deixi de ser 0 ; Comparació P1 movlw .220 ; Límit superior de P1 subwf ADRESH,w ; W = ADRESH - W btfsc STATUS,C ; C = 1 si ADRESH >= W goto 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 movlw b'01000000' call Retardpolsador return ; FUNCIÓ PER COMPROBAR EL TRES EN RATLLA comprovartresenliniaJug1 fila1.1 btfss Jug1,0 goto fila2.1 btfss Jug1,1 goto fila2.1 btfss Jug1,2 goto fila2.1 bsf Guanyador,0 return fila2.1 btfss Jug1,3 goto fila3.1 btfss Jug1,4 goto fila3.1 btfss Jug1,5 goto fila3.1 bsf Guanyador,0 return fila3.1 btfss Jug1,6 goto columna1.1 btfss Jug1,7 goto columna1.1 btfss Jug1+1,0 goto columna1.1 bsf Guanyador,0 return columna1.1 btfss Jug1,0 goto columna2.1 btfss Jug1,3 goto columna2.1 btfss Jug1,6 goto columna2.1 bsf Guanyador,0 return columna2.1 btfss Jug1,1 goto columna3.1 btfss Jug1,4 goto columna3.1 btfss Jug1,7 goto columna3.1 bsf Guanyador,0 return columna3.1 btfss Jug1,2 goto iagonal.1 btfss Jug1,5 goto diagonal.1 btfss Jug1+1,0 goto diagonal.1 bsf Guanyador,0 return diagonal.1 btfss Jug1,0 goto diagonalinversa.1 btfss Jug1,4 goto diagonalinversa.1 btfss Jug1+1,0 goto diagonalinversa.1 bsf Guanyador,0 return diagonalinversa.1 btfss Jug1,2 return btfss Jug1,4 return btfss Jug1,6 return bsf Guanyador,0 return comprovartresenliniaJug2 fila1.2 btfss Jug2,0 goto fila2.2 btfss Jug2,1 goto fila2.2 btfss Jug2,2 goto fila2.2 bsf Guanyador,1 return fila2.2 btfss Jug2,3 goto fila3.2 btfss Jug2,4 goto fila3.2 btfss Jug2,5 goto fila3.2 bsf Guanyador,1 return fila3.2 btfss Jug2,6 goto columna1.2 btfss Jug2,7 goto columna1.2 btfss Jug2+1,0 goto columna1.2 bsf Guanyador,1 return columna1.2 btfss Jug2,0 goto columna2.2 btfss Jug2,3 goto columna2.2 btfss Jug2,6 goto columna2.2 bsf Guanyador,1 return columna2.2 btfss Jug2,1 goto columna3.2 btfss Jug2,4 goto columna3.2 btfss Jug2,7 goto columna3.2 bsf Guanyador,1 return columna3.2 btfss Jug2,2 goto diagonal.2 btfss Jug2,5 goto diagonal.2 btfss Jug2+1,0 goto diagonal.2 bsf Guanyador,1 return diagonal.2 btfss Jug2,0 goto diagonalinversa.2 btfss Jug2,4 goto diagonalinversa.2 btfss Jug2+1,0 goto diagonalinversa.2 bsf Guanyador,1 return diagonalinversa.2 btfss Jug2,2 return btfss Jug2,4 return btfss Jug2,6 return bsf Guanyador,1 return ; FUNCIONS PER ESCRIURE COSES A LA PANTALLA SERIE guanyadorJ1 movlw .254 ; Caràcter de control movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .1 ; Esborra la pantalla i posa el cursor a l'inici movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'J' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'U' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'G' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'A' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'D' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'O' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'R' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw ' ' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw '1' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .254 ; Control de la posicià del cursor movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .64 ; Filera 2 columna 1 iorlw b'10000000' ; Posa el bit de posicionat a 1 movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'H' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'A' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'S' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw ' ' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'G' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'U' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'A' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'N' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'Y' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'A' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'T' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw '!' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho enviareturn return guanyadorJ2 movlw .254 ; Caràcter de control movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .1 ; Esborra la pantalla i posa el cursor a l'inici movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'J' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'U' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'G' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'A' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'D' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'O' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'R' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw ' ' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw '2' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .254 ; Control de la posicià del cursor movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .64 ; Filera 2 columna 1 iorlw b'10000000' ; Posa el bit de posicionat a 1 movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'H' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'A' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'S' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw ' ' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'G' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'U' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'A' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'N' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'Y' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'A' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'T' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw '!' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho enviareturn return tiraJ1 movlw .254 ; Caràcter de control movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .1 ; Esborra la pantalla i posa el cursor a l'inici movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'T' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'I' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'R' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'A' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw ' ' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'J' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw '1' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .254 ; Control de la posicià del cursor movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .64 ; Filera 2 columna 1 iorlw b'10000000' ; Posa el bit de posicionat a 1 movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia return tiraJ2 movlw .254 ; Caràcter de control movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .1 ; Esborra la pantalla i posa el cursor a l'inici movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'T' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'I' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'R' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'A' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw ' ' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'J' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw '2' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .254 ; Control de la posicià del cursor movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .64 ; Filera 2 columna 1 iorlw b'10000000' ; Posa el bit de posicionat a 1 movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia return posicioocupada movlw .254 ; Caràcter de control movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .1 ; Esborra la pantalla i posa el cursor a l'inici movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'P' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'O' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'S' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'I' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'C' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'I' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'O' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .254 ; Control de la posicià del cursor movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .64 ; Filera 2 columna 1 iorlw b'10000000' ; Posa el bit de posicionat a 1 movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'O' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'C' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'U' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'P' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'A' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'D' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'A' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw '!' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia return inicideljoc movlw .254 ; Caràcter de control movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .1 ; Esborra la pantalla i posa el cursor a l'inici movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'B' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'E' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'N' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'V' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'I' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'N' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'G' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'U' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'T' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'S' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw '!' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .254 ; Control de la posicià del cursor movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .64 ; Filera 2 columna 1 iorlw b'10000000' ; Posa el bit de posicionat a 1 movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia return EnviaL bcf INTCON,GIE ; Desactiva les interrupcions momentàniament bsf RCSTA,SPEN ; Activa comunicació sèrie bsf STATUS,RP0 ; Tria el banc 1 bsf TXSTA,TXEN ; Activa comunicació bcf STATUS,RP0 ; Tria el banc 0 movf Caracter,f ; Agafa el caràcter movf Caracter,w movwf TXREG ; L'envia Ret1 nop decfsz Retard1,f ; Retard de 0,8 ms goto Ret1 btfss PIR1,TXIF ; El registre TXREG ha quedat lliure? goto $-1 ; No, doncs esperem bcf RCSTA,SPEN ; Desactiva comunicació sèrie bsf STATUS,RP0 ; Tria el banc 1 bcf TXSTA,TXEN ; Desactiva comunicació bcf STATUS,RP0 ; Tria el banc 0 bsf INTCON,GIE ; Activa les interrupcions return ; Tornem al lloc des d'on hem vingut ; FUNCIONS DE RETARD Rets ; Funció de retard 0,2 s Bucles1 decfsz Retard1,f goto Bucles1 decfsz Retard2,f goto Bucles1 return Retard movwf Retard3 Bucles decfsz Retard1,f goto Bucles decfsz Retard2,f goto Bucles decfsz Retard3,f goto Bucles return Retard1s call Rets call Rets call Rets call Rets call Rets return Retardpolsador Retms movwf Retard2 Buclems decfsz Retard1,f goto Buclems decfsz Retard2,f goto Buclems return end

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