Programació en mpasm del PIC 16F690

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Tres en línia electrònic

Programa del grup 1

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

 

 

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