Programació en ASM del PIC 16F690 amb PICkit 2

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

Mastermind electrònic

Programa del grup 3

Aquest grup va plantejar quatre nivells de joc:

Nivell Colors Colors repetits Tirades Indicació de quins colors són encertats
1 4 No Sense límit
2 7 No Sense límit
3 4 10 No
4 7 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

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
Retard1			; Variables de retard
Retard2
Retard3
Polsador
check1
check2
check3
check4
check2k
check1_prima
check2_prima
check3_prima
check4_prima
Port
Tra
tira
Compta
Compta_tirada
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
Sort:2
Contador:4
Comprova1:4
Comprova2:4
Comprova3:4
Comprova4:4
Sortida:2
	endc
	org 0
Inici
	bsf	STATUS,RP0	; Tria el banc 1
	movlw	0xFF		; Posa l'acumulador a FFh (tot uns)
	movwf	TRISA		; Posa tots els bits del port A com a entrada
	clrf	TRISB		; Posa tots els bits del port B com a sortida
	clrf	TRISC		; Posa tots els bits del port C com a sortida
	movlw	b'10000000'	; Configuració de Timer0
				; Com a temporitzador basat en rellotge
				; 000 - Factor d'escala de 2
				; I resistències de pull-up desactivades (valor per defecte)
	movwf	OPTION_REG	; Ho guarda
	movlw	b'00010000'
	movwf	ADCON1		; Posa el conversor a 1/8 de la freqüència
	bcf	STATUS,RP0
	bsf	STATUS,RP1	; Tria el banc 2
	movlw	b'00000001'
	movwf	ANSEL		; Posa AN0 com entrada analògica
	bcf	STATUS,RP0
	bcf	STATUS,RP1	; Tria el banc 0
	movlw   .10
	call	Rets
	movlw	b'00000001'	; activa el conversor A/D connectat a AN0
	movwf	ADCON0		; amb el resultat justificat per l'esquerra
	clrf	PORTC
	movlw   b'11111111'
	movwf   Sortida
	movlw   b'11111111'
	movwf   Sortida+1
	call	EnviaR16
Potenciometre_LED
	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 1
LED1				; Comparació LED1
	movlw	.255		; Límit superior de Potenciòmetre
	subwf	ADRESH,w	; W = ADRESH - W
	btfsc	STATUS,C	; C = 1 si ADRESH >= W
	goto	LED2		; ADRESH >= W
	movlw	.192		; Límit inferior de Potenciòmetre
	subwf	ADRESH,w	; W = ADRESH - W
	btfss	STATUS,C	; C = 1 si ADRESH >= W
	goto	LED2		; ADRESH < W
	movlw   b'00001111'	; Encén els 4 LED vermells
	movwf   PORTC
	goto	LED5
LED2				; Comparació LED2
	movlw	.191		; Límit superior de Potenciòmetre
	subwf	ADRESH,w	; W = ADRESH - W
	btfsc	STATUS,C	; C = 1 si ADRESH >= W
	goto	LED3		; ADRESH >= W
	movlw	.128		; Límit inferior de Potenciòmetre
	subwf	ADRESH,w	; W = ADRESH - W
	btfss	STATUS,C	; C = 1 si ADRESH >= W
	goto	LED3		; ADRESH < W
	movlw	b'00000111'	; Encén 3 LED vermells
	movwf	PORTC
	goto	LED5
LED3				; Comparació LED3
	movlw	.127		; Límit superior de Potenciòmetre
	subwf	ADRESH,w	; W = ADRESH - W
	btfsc	STATUS,C	; C = 1 si ADRESH >= W
	goto	LED4		; ADRESH >= W
	movlw	.64		; Límit inferior de Potenciòmetre
	subwf	ADRESH,w	; W = ADRESH - W
	btfss	STATUS,C	; C = 1 si ADRESH >= W
	goto	LED4		; ADRESH < W
	movlw	b'00000011'	; Encén 2 LED vermells
	movwf	PORTC
	goto	LED5
LED4
	movlw   b'00000001'	; Encén 1 LED vermell
	movwf   PORTC
	goto	LED5
LED5
	btfsc   PORTA,3		; Comprova si premem el polsador de la placa petita. Si l'hem premut, comença la partida
	goto	Potenciometre_LED		; si no, torna a fer el bucle de comprovació del Potenciòmetre
	clrf	Port		; Posa a zero tots els bits de la variable Port
	movf	Port,w
	movwf	PORTB		; I ho envia al port B
	movlw	.10		; Retard de 2 s
	call	Rets
	clrf	Sort		; Inicialitzem amb 0 totes aquestes variables
	clrf	Sort+1
	clrf	Contador
	clrf	Contador+1
	clrf	Contador+2
	clrf	Contador+3
	clrf	tira
	clrf	Tra
	clrf	Compta_tirada
	clrf	check3
	clrf	check1_prima
	clrf	check2_prima
	clrf	check3_prima
	clrf	check4_prima
	movlw	b'00001001'	; activa el conversor A/D connectat a AN2
	movwf	ADCON0		; amb el resultat justificat per l'esquerra
	nop			; espera un microsegon
	nop			; espera un microsegon
	nop			; espera un microsegon
	nop			; espera un microsegon
	nop			; espera un microsegon, en total 5
	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
	goto	Bucle
Bucle
	call	Random		; Genera un valor aleatori
Bucle2
	bcf	Rand,0		; Apaguem els bits corresponents als LED monocroms
	bcf	Rand,1
	bcf	Rand,2
	bcf	Rand,3
	movlw   b'00000000'
	movwf   Sortida
	movlw   b'00000000'
	movwf   Sortida+1
	call	EnviaR16
	movlw   .2
	call	Rets
	call	CHECK		; Cridem una funció per comptar quants colors de cada hi ha
	goto	Inici_joc	; Amb les variables checkX_prima definides, comencem el joc

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
	movf	Rand,w		; Comprovem si el resultat del valor aleatori conté algun LED apagat
	andlw   b'01110000'
	xorlw   b'00000000'
	btfsc   STATUS,Z
	goto	Random
	movf	Rand,w
	andlw   b'10000000'
	xorlw   b'00000000'
	btfsc   STATUS,Z
	goto	comprov		; Crida per a comprovar els 2 bits corresponents que queden en Rand+1
continua_comprovacio
	movf	Rand+1,w
	andlw   b'00011100'
	xorlw   b'00000000'
	btfsc   STATUS,Z
	goto	Random
	movf	Rand+1,w
	andlw   b'11100000'
	xorlw   b'00000000'
	btfsc   STATUS,Z
	goto	Random		; En cas que no hi hagi cap LED apagat, podem continuar
	movf	PORTC,w		; Comprovem si ens trobem en el 2n o 4t nivell
	xorlw   b'00000011'	; On es podrien fer servir els 7 colors programats
	btfsc   STATUS,Z	; En cas contrari, (Ens trobem en el 1r o el 3r)
	goto	Bucle2		; Passem a un "filtre" per comprovar que no hi hagi a la combinació
	movf	PORTC,w		; Colors que no siguin els 4 escollits per a aquests nivells
	xorlw   b'00001111'
	btfsc   STATUS,Z
	goto	Bucle2
No_Colors			; Comprovem que NOMÉS hi siguin presents a la combinació
				; Vermell, Verd, Blau i Groc
				; 1r LED
	movf	Rand,w		; Comprovem el Magenta
	andlw   b'01110000'	; Si hi és, tornem a fer una combinació
	xorlw   b'01010000'
	btfsc   STATUS,Z
	goto	Random
	movf	Rand,w		; Comprovem el Cian
	andlw   b'01110000'
	xorlw   b'01100000'
	btfsc   STATUS,Z
	goto	Random
	movf	Rand,w
	andlw   b'01110000'	; Comprovem el Blanc
	xorlw   b'01110000'
	btfsc   STATUS,Z
	goto	Random
				; 2n LED
	movf	Rand,w		; En estar repartit entre Rand i Rand+1, el LED2 és més complex
	andlw   b'10000000'	; Comprovem primer el bit corresponent al primer dels LED tricolors
	xorlw   b'10000000'	; i en funció del valor, anem a un bloc o a un altre
	btfsc   STATUS,Z
	goto	comprov1
continua_comprovacio1
	movf	Rand,w
	andlw   b'10000000'
	xorlw   b'00000000'
	btfsc   STATUS,Z
	goto	comprov2
continua_comprovacio2
	movf	Rand,w
	andlw   b'10000000'
	xorlw   b'10000000'
	btfsc   STATUS,Z
	goto	comprov3
continua_comprovacio3
				; 3r LED
	movf	Rand+1,w
	andlw   b'00011100'
	xorlw   b'00010100'	; Magenta
	btfsc   STATUS,Z
	goto	Random
	movf	Rand+1,w
	andlw   b'00011100'
	xorlw   b'00011000'	; Cian
	btfsc   STATUS,Z
	goto	Random
	movf	Rand+1,w
	andlw   b'00011100'
	xorlw   b'00011100'	; Blanc
	btfsc   STATUS,Z
	goto	Random
				; 4t LED
	movf	Rand+1,w
	andlw   b'11100000'
	xorlw   b'10100000'	; Magenta
	btfsc   STATUS,Z
	goto	Random
	movf	Rand+1,w
	andlw   b'11100000'
	xorlw   b'11000000'	; Cian
	btfsc   STATUS,Z
	goto	Random
	movf	Rand+1,w
	andlw   b'11100000'
	xorlw   b'11100000'	; Blanc
	btfsc   STATUS,Z
	goto	Random
	goto	Bucle2
comprov				; Continuació de la comprovació que el LED2 sigui apagat
	movf	Rand+1,w
	andlw   b'00000011'
	xorlw   b'00000000'
	btfsc   STATUS,Z
	goto	Random
	goto	continua_comprovacio
comprov1
	movf	Rand+1,w	; I aquí tenim la comprovació dels dos bits corresponent
	andlw   b'00000011'	; al 2n i al 3r LED dels tricolors.
	xorlw   b'00000010'	; Magenta
	btfsc   STATUS,Z
	goto	Random
	goto	continua_comprovacio1
comprov2
	movf	Rand+1,w
	andlw   b'00000011'
	xorlw   b'00000011'	; Cian
	btfsc   STATUS,Z
	goto	Random
	goto	continua_comprovacio2
comprov3
	movf	Rand+1,w
	andlw   b'00000011'
	xorlw   b'00000011'	; Blanc
	btfsc   STATUS,Z
	goto	Random
	goto	continua_comprovacio3
Inici_joc
	call	Llegir_joc	; Llegeix els polsadors i incrementa el comptador de pulsacions progressivament
	movf	Polsador,w
	xorlw   b'00000000'
	btfsc   STATUS,Z
	goto	Encendre0
	movf	Polsador,w	; Agafa el polsador actiu
	xorlw   b'00000001'
	btfsc   STATUS,Z
	goto	Encendre1
	movf	Polsador,w	; Agafa el polsador actiu
	xorlw   b'00000010'
	btfsc   STATUS,Z
	goto	Encendre2
	movf	Polsador,w	; Agafa el polsador actiu
	xorlw   b'00000100'
	btfsc   STATUS,Z
	goto	Encendre3
	movf	Polsador,w	; Agafa el polsador actiu
	xorlw   b'00001000'
	btfsc   STATUS,Z
	goto	Encendre4
	movf	Polsador,w	; Agafa el polsador actiu
	xorlw   b'00010000'
	btfsc   STATUS,Z
	goto	COMPROVACIO
Encendre0			; Mentre no s'apreti cap botó, continua mostrant els colors
	movf	Sort,w		; que hi ha a la variable Sort i Sort+1
	movwf   Sortida
	movf	Sort+1,w
	movwf   Sortida+1
	call	EnviaR16
	goto	Inici_joc
Encendre1
	movf	Contador,w	; Si és el primer cop que es prem el botó 1, encèn Vermell
	xorlw	.1
	btfsc   STATUS,Z
	goto	Vermell
	movf	Contador,w	; Si és el segon, encèn Verd
	xorlw	.2
	btfsc   STATUS,Z
	goto	Verd
	movf	Contador,w	; Si és el tercer, enèn Blau
	xorlw	.3
	btfsc   STATUS,Z
	goto	Blau
	movf	Contador,w	; Ara Groc
	xorlw	.4
	btfsc   STATUS,Z
	goto	Groc
	movf	Contador,w	; Ara Magenta
	xorlw	.5
	btfsc   STATUS,Z
	goto	Magenta
	movf	Contador,w	; Cian
	xorlw	.6
	btfsc   STATUS,Z
	goto	Cian
	movf	Contador,w	; Blanc
	xorlw	.7
	btfsc   STATUS,Z
	goto	Blanc
Encendre2
	movf	Contador+1,w	; Procediment anàleg al del polsador 1, però ara amb el segon polsador
	xorlw	.1		; i encenent els LED corresponents a fer el color en el segon LED
	btfsc   STATUS,Z
	goto	Vermell2
	movf	Contador+1,w
	xorlw	.2
	btfsc   STATUS,Z
	goto	Verd2
	movf	Contador+1,w
	xorlw	.3
	btfsc   STATUS,Z
	goto	Blau2
	movf	Contador+1,w
	xorlw	.4
	btfsc   STATUS,Z
	goto	Groc2
	movf	Contador+1,w
	xorlw	.5
	btfsc   STATUS,Z
	goto	Magenta2
	movf	Contador+1,w
	xorlw	.6
	btfsc   STATUS,Z
	goto	Cian2
	movf	Contador+1,w
	xorlw	.7
	btfsc   STATUS,Z
	goto	Blanc2
Encendre3
	movf	Contador+2,w	; Igual que abans però amb el tercer polsador
	xorlw	.1
	btfsc   STATUS,Z
	goto	Vermell3
	movf	Contador+2,w
	xorlw	.2
	btfsc   STATUS,Z
	goto	Verd3
	movf	Contador+2,w
	xorlw	.3
	btfsc   STATUS,Z
	goto	Blau3
	movf	Contador+2,w
	xorlw	.4
	btfsc   STATUS,Z
	goto	Groc3
	movf	Contador+2,w
	xorlw	.5
	btfsc   STATUS,Z
	goto	Magenta3
	movf	Contador+2,w
	xorlw	.6
	btfsc   STATUS,Z
	goto	Cian3
	movf	Contador+2,w
	xorlw	.7
	btfsc   STATUS,Z
	goto	Blanc3
Encendre4
	movf	Contador+3,w	; I per últim amb el 4t Polsador
	xorlw	.1
	btfsc   STATUS,Z
	goto	Vermell4
	movf	Contador+3,w
	xorlw	.2
	btfsc   STATUS,Z
	goto	Verd4
	movf	Contador+3,w
	xorlw	.3
	btfsc   STATUS,Z
	goto	Blau4
	movf	Contador+3,w
	xorlw	.4
	btfsc   STATUS,Z
	goto	Groc4
	movf	Contador+3,w
	xorlw	.5
	btfsc   STATUS,Z
	goto	Magenta4
	movf	Contador+3,w
	xorlw	.6
	btfsc   STATUS,Z
	goto	Cian4
	movf	Contador+3,w
	xorlw	.7
	btfsc   STATUS,Z
	goto	Blanc4
Vermell				; Encèn el color Vermell al primer LED tricolor
	bcf	Sort,4		; Apaguem els 3 LED corresponents al primer LED gran
	bcf	Sort,5
	bcf	Sort,6
	movlw	b'00010000'	; Configurem el color vermell
	xorwf   Sort,f		; i el movem al seu lloc corresponent a la variable Sort
	movf	Sort,w		; Fem servir xorlw per no esborrar els possibles valors que hi haguès a la resta de LED
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00000000'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f	; I els comparem per deixar-los tal i com estaven
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps de 0.4 segons
	call	Rets		; Espera 0.4 s
	movlw   b'00000001'	; Posa el color vermell als 3 LED de la dreta de la variable comprova1
	movwf   Comprova1	; Perquè després sigui més senzilla la comprovació per donar les pistes
	goto	Inici_joc	; I tornem cap a dalt
Verd				; Fem anàlogament amb la resta de colors fins a arribar al Groc
	movlw	b'00110000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00000000'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps de 0.4 segons
	call	Rets		; Espera 0.4 s
	movlw   b'00000010'
	movwf   Comprova1
	goto	Inici_joc
Blau
	movlw	b'01100000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00000000'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps de 0.4 segons
	call	Rets
	movlw   b'00000100'
	movwf   Comprova1
	goto	Inici_joc
Groc
	movlw	b'01110000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00000000'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000011'
	movwf   Comprova1
				; Comprovem ara si som als nivells 1r o 3r (On podem fer servir només 4 colors)
	movf	PORTC,w		; en cas afirmatiu, netegem el contador i, per tant, si premessim un altre cop
	xorlw   b'00000001' 	; el mateix botó, tornariem a començar pel Vermell
	btfsc   STATUS,Z
	clrf	Contador
	movf	PORTC,w
	xorlw   b'00000111'
	btfsc   STATUS,Z
	clrf	Contador
	goto	Inici_joc	; En cas contrari, s'obviarien aquestes instruccions i continuariem amb els últims 3 colors
Magenta
	movlw	b'01100000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00000000'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000101'
	movwf   Comprova1
	goto	Inici_joc
Cian
	movlw	b'00110000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00000000'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000110'
	movwf   Comprova1
	goto	Inici_joc
Blanc
	movlw	b'00010000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00000000'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000111'
	movwf   Comprova1
	clrf	Contador
	goto	Inici_joc
Vermell2			; Encenem el color vermell en el LED2 (tricolor)
	bcf	Sort,7		; Apaguem els LED corresponents als 3 del LED2
	bcf	Sort+1,0
	bcf	Sort+1,1
	movlw	b'10000000'	; Movem el color vermell i el comparem amb la variable sort amb xorwf
	xorwf   Sort,f		; Per posar-hi el color sense modificar el que hi hagi a la resta
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00000000'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000001'
	movwf   Comprova2
	goto	Inici_joc
Verd2				; Un altre cop, fem el mateix amb tots els colors fins al groc
	movlw	b'10000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00000001'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000010'
	movwf   Comprova2
	goto	Inici_joc
Blau2
	movlw	b'00000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00000011'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000100'
	movwf   Comprova2
	goto	Inici_joc
Groc2
	movlw	b'10000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00000011'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000011'
	movwf   Comprova2
				; Comprovem aquí que, igual que abans, no ens trobem en els nivells 1 o 3
	movf	PORTC,w		; Per decidir si es neteja el contador associat al segon polsador
	xorlw   b'00000001'
	btfsc   STATUS,Z
	clrf	Contador+1
	movf	PORTC,w
	xorlw   b'00000111'
	btfsc   STATUS,Z
	clrf	Contador+1
	goto	Inici_joc
Magenta2
	movlw	b'00000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00000011'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000101'
	movwf   Comprova2
	goto	Inici_joc
Cian2
	movlw	b'10000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00000001'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000110'
	movwf   Comprova2
	goto	Inici_joc
Blanc2
	movlw	b'10000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00000000'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000111'
	movwf   Comprova2
	clrf	Contador+1
	goto	Inici_joc
Vermell3			; Procediment anàleg per encendre el color Vermell al 3r LED (tricolor)
	bcf	Sort+1,2
	bcf	Sort+1,3
	bcf	Sort+1,4
	movlw	b'00000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00000100'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000001'
	movwf   Comprova3
	goto	Inici_joc
Verd3
	movlw	b'00000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00001100'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000010'
	movwf   Comprova3
	goto	Inici_joc
Blau3
	movlw	b'00000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00011000'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000100'
	movwf   Comprova3
	goto	Inici_joc
Groc3
	movlw	b'00000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00011100'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000011'
	movwf   Comprova3
				; Tornem a comprovar si ens trobem al nivell adequat per prendre les mesures necessàries
	movf	PORTC,w
	xorlw   b'00000001'
	btfsc   STATUS,Z
	clrf	Contador+2
	movf	PORTC,w
	xorlw   b'00000111'
	btfsc   STATUS,Z
	clrf	Contador+2
	goto	Inici_joc
Magenta3
	movlw	b'00000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00011000'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000101'
	movwf   Comprova3
	goto	Inici_joc
Cian3
	movlw	b'00000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00001100'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000110'
	movwf   Comprova3
	goto	Inici_joc
Blanc3
	movlw	b'00000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00000100'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000111'
	movwf   Comprova3
	clrf	Contador+2
	goto	Inici_joc
Vermell4			; El mateix que abans però amb el color Vermell per al 4t LED
	bcf	Sort+1,5
	bcf	Sort+1,6
	bcf	Sort+1,7
	movlw	b'00000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00100000'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000001'
	movwf   Comprova4
	goto	Inici_joc
Verd4
	movlw	b'00000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'01100000'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000010'
	movwf   Comprova4
	goto	Inici_joc
Blau4
	movlw	b'00000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'11000000'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000100'
	movwf   Comprova4
	goto	Inici_joc
Groc4
	movlw	b'00000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'11100000'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000011'
	movwf   Comprova4
				; Comprovem si hi som al 1r o al 3r nivell
	movf	PORTC,w
	xorlw   b'00000001'
	btfsc   STATUS,Z
	clrf	Contador+3
	movf	PORTC,w
	xorlw   b'00000111'
	btfsc   STATUS,Z
	clrf	Contador+3
	goto	Inici_joc
Magenta4
	movlw	b'00000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'11000000'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000101'
	movwf   Comprova4
	goto	Inici_joc
Cian4
	movlw	b'00000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'01100000'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000110'
	movwf   Comprova4
	goto	Inici_joc
Blanc4
	movlw	b'00000000'
	xorwf   Sort,f
	movf	Sort,w
	movwf	Sortida		; Ho prepara per enviar-ho al registre
	movlw	b'00100000'	; Bits 8 a 15 a zero
	xorwf   Sort+1,f
	movf	Sort+1,w
	movwf	Sortida+1	; Ho prepara per enviar-ho al registre
	call	EnviaR16	; Ho envia al registre
	movlw	.2		; Temps d'un segon
	call	Rets		; Espera 1 s
	movlw   b'00000111'
	movwf   Comprova4
	clrf	Contador+3
	goto	Inici_joc
COMPROVACIO			; Comprovem si estem als 2 primers nivells o als 2 últims
				; Per saber si les pistes dels monocroms han de coincidir amb els LED tricolors
	movf	PORTC,w	; o les hem de desordenar
	xorlw   b'00000001'
	btfsc   STATUS,Z
	goto	COMPROVACIO_nivells_1_2
	movf	PORTC,w
	xorlw   b'00000011'
	btfsc   STATUS,Z
	goto	COMPROVACIO_nivells_1_2
	movf	PORTC,w
	xorlw   b'00000111'
	btfsc   STATUS,Z
	goto	COMPROVACIO_nivells_3_4
	movf	PORTC,w
	xorlw   b'00001111'
	btfsc   STATUS,Z
	goto	COMPROVACIO_nivells_3_4
COMPROVACIO_nivells_1_2 	; Comprovem cada LED i encenem el LED monocrom corresponent
	movf	check1,w	; Si el primer LED és el mateix que el de la combinació
	xorwf   Comprova1,w
	btfsc   STATUS,Z
	call	C1		; Encén el primer LED monocrom
	movf	check2,w	; Comprovem ara si el segon LED és coincident amb la combinació
	xorwf   Comprova2,w
	btfsc   STATUS,Z
	call	C2		; Fem una serie de passos
	movf	check3,w	; Igual per al 3r LED
	xorwf   Comprova3,w
	btfsc   STATUS,Z
	call	C3
	movf	check4,w	; I per al 4t
	xorwf   Comprova4,w
	btfsc   STATUS,Z
	call	C4
	goto	CONTI
CONTI				; Comprovem si ja hem encés tots els LED grocs i sino, passem als bucles d'intermitència
	movf	Sort,w
	andlw   b'00001111'
	xorlw   b'00001111'
	btfsc   STATUS,Z
	goto	Print		; S'ha acabat el joc
	btfss   Sort,0
	goto	Intermitent1
	goto	Intermitent2
Intermitent1			; Comprovem si el primer LED és igual a algun dels colors de la combinació correcta
	movf	Comprova1,w 	; Si és igual al 2n
	xorwf   check2,w
	btfsc   STATUS,Z
	goto	Inter1_1
	movf	Comprova1,w 	; Al 3r
	xorwf   check3,w
	btfsc   STATUS,Z
	goto	Inter1_2
	movf	Comprova1,w 	; O al 4t
	xorwf   check4,w
	btfsc   STATUS,Z
	goto	Inter1_3
	goto	Intermitent2
Inter1_1
	movf	check2_prima,w  ; Comprovem si encara queden vermells (per exemple) per comprovar
	xorlw   b'00000000'
	btfss   STATUS,Z
	bsf	tira,0		; En cas que sí, fiquem un 1 a la variable tira, al lloc corresponent
	movf	check2_prima,w  ; De manera que en el bucle anirem comparant Tira i Sortida amb xorlw
	xorlw   b'00000000'	; i així, el bit que acabem d'activar, en compararlo, va canviant el valor
	btfss   STATUS,Z	; anterior que hi havia a Sort
	decf	check2_prima,f  ; i decrementem la variable corresponent al color que acabem de "gastar"
	goto	Intermitent2

Inter1_2
	movf	check3_prima,w 	; Fem el mateix amb els altres 2 casos.
	xorlw   b'00000000'
	btfss   STATUS,Z
	bsf	tira,0
	movf	check3_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check3_prima,f
	goto	Intermitent2
Inter1_3
	movf	check4_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	bsf	tira,0
	movf	check4_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check4_prima,f
	goto	Intermitent2
Intermitent2
	btfsc   Sort,1		; Comprovem que el 2n LED monocrom no estigui ences
	goto	Intermitent3	; En cas que ho estigui, saltem tot aquest bloc
	movf	Comprova2,w	; Comparem si el segon LED és igual:
	xorwf   check1,w	; al 1r
	btfsc   STATUS,Z
	goto	Inter2_1
	movf	Comprova2,w	; al 3r
	xorwf   check3,w
	btfsc   STATUS,Z
	goto	Inter2_2
	movf	Comprova2,w	; al 4t
	xorwf   check4,w
	btfsc   STATUS,Z
	goto	Inter2_3
	goto	Intermitent3
Inter2_1			; Fem el mateix que hem fet amb el primer però ara
	movf	check1_prima,w  ; encendrem el bit 1 de la variable tira
	xorlw   b'00000000'	; per a fer la intermitencia
	btfss   STATUS,Z	; sempre i quan checkX_prima sigui diferent de 0
	bsf	tira,1
	movf	check1_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check1_prima,f
	goto	Intermitent3
Inter2_2
	movf	check3_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	bsf	tira,1
	movf	check3_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check3_prima,f
	goto	Intermitent3
Inter2_3
	movf	check4_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	bsf	tira,1
	movf	check4_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check4_prima,f
	goto	Intermitent3
Intermitent3			; Comprovem ara si el 3r LED groc és encés
	btfsc   Sort,2
	goto	Intermitent4
	movf	Comprova3,w	; I comprovem si el 3er color introduit és igual:
	xorwf   check1,w	; al 1r
	btfsc   STATUS,Z
	goto	Inter3_1
	movf	Comprova3,w	; al 2n
	xorwf   check2,w
	btfsc   STATUS,Z
	goto	Inter3_2
	movf	Comprova3,w	; al 4t
	xorwf   check4,w
	btfsc   STATUS,Z
	goto	Inter3_3
	goto	Intermitent4
				; Procediment anàleg a Inter2_1 i posteriors
Inter3_1
	movf	check1_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	bsf	tira,2
	movf	check1_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check1_prima,f
	goto	Intermitent4
Inter3_2
	movf	check2_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	bsf	tira,2
	movf	check2_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check2_prima,f
	goto	Intermitent4
Inter3_3
	movf	check4_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	bsf	tira,2
	movf	check4_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check4_prima,f
	goto	Intermitent4
Intermitent4			; Per últim comprovem si el 4t LED groc és encés
	btfsc   Sort,3
	goto	COMPR
	movf	Comprova4,w	; si no, mirem si el 4rt color introduit és igual:
	xorwf   check1,w	; al 1r
	btfsc   STATUS,Z
	goto	Inter4_1
	movf	Comprova4,w	; al 2n
	xorwf   check2,w
	btfsc   STATUS,Z
	goto	Inter4_2
	movf	Comprova4,w	; al 3r
	xorwf   check3,w
	btfsc   STATUS,Z
	goto	Inter4_3
	goto	COMPR
Inter4_1			; Procediment anàleg a Inter2_1 i posteriors
	movf	check1_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	bsf	tira,3
	movf	check1_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check1_prima,f
	goto	COMPR
Inter4_2
	movf	check2_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	bsf	tira,3
	movf	check2_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check2_prima,f
	goto	COMPR
Inter4_3
	movf	check3_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	bsf	tira,3
	movf	check3_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check3_prima,f
	goto	COMPR
COMPROVACIO_nivells_3_4		; Comprovem cada LED, però desordenem les pistes
	movf	check1,w	; Comprovem si cada color introduit correspon
	xorwf   Comprova1,w	; amb el del seu lloc
	btfsc   STATUS,Z
	call	CO1
	movf	check2,w
	xorwf   Comprova2,w
	btfsc   STATUS,Z
	call	CO2
	movf	check3,w
	xorwf   Comprova3,w
	btfsc   STATUS,Z
	call	CO3
	movf	check4,w
	xorwf   Comprova4,w
	btfsc   STATUS,Z
	call	CO4
	goto	CO
CO
	movf	Sort,w		; Comprovem si tot està encés i, per tant, hem guanyat
	andlw   b'00001111'
	xorlw   b'00001111'
	btfsc   STATUS,Z
	goto	Print
	btfss   Tra,0		; en cas contrari, Passem a fer ells bucles de intermitència
	goto	Intermitent1_pre	; Mirem si el primer LED Groc hauria d'estar encés
	goto	Intermitent2_pre	; Per veure per on comencem
Intermitent1_pre		; Amb un procediment anàleg a la intermitència
	movf	Comprova1,w	; dels nivells on sí corresponen les pistes
	xorwf   check2,w	; anem comprovant si el color introduït és igual
	btfsc   STATUS,Z	; a algun dels colors de la combinació que no
	goto	pre1_1		; sigui ell mateix
	movf	Comprova1,w
	xorwf   check3,w
	btfsc   STATUS,Z
	goto	pre1_2
	movf	Comprova1,w
	xorwf   check4,w
	btfsc   STATUS,Z
	goto	pre1_3
	goto	Intermitent2_pre
pre1_1
	movf	check2_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	call	busca		; Però aquest cop cridem el bloc busca
	movf	check2_prima,w	; que "desordena" les pistes igual que feia
	xorlw   b'00000000'	; el bloc obra abans
	btfss   STATUS,Z
	decf	check2_prima,f
	goto	Intermitent2_pre
pre1_2
	movf	check3_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	call	busca
	movf	check3_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check3_prima,f
	goto	Intermitent2_pre
pre1_3
	movf	check4_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	call	busca
	movf	check4_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check4_prima,f
	goto	Intermitent2_pre
Intermitent2_pre
	btfsc   Tra,1		; Mirem si el 2n LED hauria d'estar encés
	goto	Intermitent3_pre	; si es així, passem al següent bloc
	movf	Comprova2,w
	xorwf   check1,w
	btfsc   STATUS,Z
	goto	pre2_1
	movf	Comprova2,w
	xorwf   check3,w
	btfsc   STATUS,Z
	goto	pre2_2
	movf	Comprova2,w
	xorwf   check4,w
	btfsc   STATUS,Z
	goto	pre2_3
	goto	Intermitent3_pre
pre2_1
	movf	check1_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	call	busca
	movf	check1_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check1_prima,f
	goto	Intermitent3_pre
pre2_2
	movf	check3_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	call	busca
	movf	check3_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check3_prima,f
	goto	Intermitent3_pre
pre2_3
	movf	check4_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	call	busca
	movf	check4_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check4_prima,f
	goto	Intermitent3_pre
Intermitent3_pre
	btfsc   Tra,2		; Mirem si el 3r LED hauria d'estar encés, igual que abans
	goto	Intermitent4_pre
	movf	Comprova3,w
	xorwf   check1,w
	btfsc   STATUS,Z
	goto	pre3_1
	movf	Comprova3,w
	xorwf   check2,w
	btfsc   STATUS,Z
	goto	pre3_2
	movf	Comprova3,w
	xorwf   check4,w
	btfsc   STATUS,Z
	goto	pre3_3
	goto	Intermitent4_pre
pre3_1
	movf	check1_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	call	busca
	movf	check1_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check1_prima,f
	goto	Intermitent4_pre
pre3_2
	movf	check2_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	call	busca
	movf	check2_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check2_prima,f
	goto	Intermitent4_pre
pre3_3
	movf	check4_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	call	busca
	movf	check4_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check4_prima,f
	goto	Intermitent4_pre
Intermitent4_pre
	btfsc   Tra,3		; Si el 4rt LED també hauria d'estar encés, enviem
	goto	COMPR		; als LED les pistes
	movf	Comprova4,w
	xorwf   check1,w
	btfsc   STATUS,Z
	goto	pre4_1
	movf	Comprova4,w
	xorwf   check2,w
	btfsc   STATUS,Z
	goto	pre4_2
	movf	Comprova4,w
	xorwf   check3,w
	btfsc   STATUS,Z
	goto	pre4_3
	goto	COMPR
pre4_1
	movf	check1_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	call	busca
	movf	check1_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check1_prima,f
	goto	COMPR
pre4_2
	movf	check2_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	call	busca
	movf	check2_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check2_prima,f
	goto	COMPR
pre4_3
	movf	check3_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	call	busca
	movf	check3_prima,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	decf	check3_prima,f
	goto	COMPR
COMPR				; Bucle per a mostrar les pistes un cop el programa hagi
	movf	Sort,w		; fet les degudes comprovacions
	xorwf   tira,w		; com es pot veure, comparem Sort amb tira per el que
	movwf   Sort		; s'ha comentat més amunt. Cada vegada que comparem, si
	movf	Sort,w		; tira té el bit encés, alternarà entre 1 i 0 el bit
	movwf   Sortida		; corresponent a Sort
	movf	Sort+1,w
	movwf   Sortida+1
	call	EnviaR16
	movlw   .2
	call	Rets
	movf	Sort,w		; i ho tornem a fer per assegurar-nos que parpelleji
	xorwf   tira,w		; al menys 1 cop abans de poder apretar un altre botó
	movwf   Sort
	movf	Sort,w
	movwf   Sortida
	movf	Sort+1,w
	movwf   Sortida+1
	call	EnviaR16
	movlw   .2
	call	Rets
	call	Llegir_tornatirar   ; Comprovem si estem prement algun dels 4 polsadors
	movlw   b'00000001'	; que fan rotar els colors i, en cas afirmatiu
	xorwf   Polsador,w	; anem a Nova_Tirada
	btfsc   STATUS,Z
	goto	Nova_Tirada
	movlw   b'00000010'
	xorwf   Polsador,w
	btfsc   STATUS,Z
	goto	Nova_Tirada
	movlw   b'00000100'
	xorwf   Polsador,w
	btfsc   STATUS,Z
	goto	Nova_Tirada
	movlw   b'00001000'
	xorwf   Polsador,w
	btfsc   STATUS,Z
	goto	Nova_Tirada
	btfss   PORTA,3		; Si el que es prem és el botó de la placa petita
	goto	ensenya_combinacio  ; assumim que el jugador es rendeix i, per tant,
	goto	COMPR		; toquem la melodia de derrota i ensenyem la combinació
Nova_Tirada
	clrf	check1_prima	; Netegem totes les variables necessàries
	clrf	check2_prima
	clrf	check3_prima
	clrf	check4_prima
	clrf	tira
	clrf	Tra
	clrf	check1
	clrf	check2
	clrf	check3
	clrf	check4
	bcf	Sort,0		; Apaguem els LED grocs de les pistes
	bcf	Sort,1
	bcf	Sort,2
	bcf	Sort,3
	movf	PORTC,w		; i comprovem si estem en el 3r o 4t nivell
	xorlw   b'00000111'	; on hi ha un límit de tirades
	btfsc   STATUS,Z
	goto	Compta_tirades
	movf	PORTC,w
	xorlw   b'00001111'
	btfsc   STATUS,Z
	goto	Compta_tirades
	goto	torna_a_tirar   ; Si no ens hem passat, tornem a tirar
Compta_tirades			; Si ens hem passat de 10 tirades, sona la derrota
	incf	Compta_tirada,f ; i ens ensenya la combinació
	movlw   .9
	xorwf   Compta_tirada,w
	btfsc   STATUS,Z
	goto	ensenya_combinacio
torna_a_tirar
	call	CHECK		; Abans de tornar a començar, tornem a comprovar la quantitat de colors de cada que hi ha
	goto	Inici_joc
ensenya_combinacio		; Toca la música de la derrota
	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
	movlw	.158		; Valor que correspon aproximadament a sol3
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.79		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaNotaNegra	; Toca la nota configurada
	movlw	.168		; Valor que correspon aproximadament a fa#3
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.84		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaNotaNegra	; Toca la nota configurada
	movlw	.178		; Valor que correspon aproximadament a fa3
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.89		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaNotaNegra	; Toca la nota configurada
	movlw	.189		; Valor que correspon aproximadament a mi3
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.95		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.0		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaNotaBlanca	; Toca la nota configurada
	call	Rets		; Espera 0,2 s
parpalleja			; Ensenya parpallejant la combinació real
	movf	Rand,w
	movwf   Sortida
	movf	Rand+1,w
	movwf   Sortida+1
	call	EnviaR16
	movlw   .4
	call	Rets
	movlw   .0
	movwf   Sortida
	movlw   .0
	movwf   Sortida+1
	call	EnviaR16
	movlw   .2
	call	Rets
	goto	parpalleja
Print				; Aquí s'arriba quan els 4 LED grocs estan encessos
				; i per tant la combinació introduïda és correcte
	movf	Sort,w			
	movwf   Sortida
	movf	Sort+1,w
	movwf   Sortida+1
	call	EnviaR16
	movlw   .5
	call	Rets
	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
	movlw	.158		; Valor que correspon aproximadament a sol3
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.79		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaNotaTresillo	; Toca la nota configurada
	movlw	.149		; Valor que correspon aproximadament a sol#3
	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
	call	TocaNotaTresillo	; Toca la nota configurada
	movlw	.141		; Valor que correspon aproximadament a la3
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.71		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.0		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaNotaTresillo	; Toca la nota configurada
	movlw	.133		; Valor que correspon aproximadament a la#3
	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
	call	TocaNotaTresillo	; Toca la nota configurada
	movlw	.126		; Valor que correspon aproximadament a si3
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.63		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaNotaTresillo	; Toca la nota configurada
	movlw	.118		; Valor que correspon aproximadament a do4
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.59		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaNotaTresillo	; Toca la nota configurada
	movlw	.105		; Valor que correspon aproximadament a re4
	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	.0		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaNotaCorcheapunto	; Toca la nota configurada
	movlw	.118		; Valor que correspon aproximadament a do4
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.59		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaNotaTresillo	; Toca la nota configurada
	movlw	.105		; Valor que correspon aproximadament a re4
	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	.0		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaNotaNegra		; Toca la nota configurada
	movlw	.133		; Valor que correspon aproximadament a la#4
	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
	call	TocaNotaNegra	; Toca la nota configurada
	movlw	.118		; Valor que correspon aproximadament a do4
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.59		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaNotaNegra		; Toca la nota configurada
	movlw	.105		; Valor que correspon aproximadament a re4
	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	.0		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaNotaCorcheapunto	; Toca la nota configurada
	movlw	.118		; Valor que correspon aproximadament a do4
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.59		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaNotaTresillo	; Toca la nota configurada
	movlw	.105		; Valor que correspon aproximadament a re4
	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	.0		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaNotaNegra	; Toca la nota configurada
	call	Rets		; Espera 0,2 s
parpalleja2
	movlw   .0
	movwf   Sortida
	movlw   .0
	movwf   Sortida+1
	call	EnviaR16
	movlw   .2
	call	Rets
				
	movf	Sort,w			
	movwf   Sortida
	movf	Sort+1,w
	movwf   Sortida+1
	call	EnviaR16
	movlw   .5
	call	Rets
	goto	parpalleja2
Rets				; Funció de retard de 0,2 W s
	movwf	Retard3
Bucles
	decfsz	Retard1,f
	goto	Bucles
	decfsz	Retard2,f
	goto	Bucles
	decfsz	Retard3,f
	goto	Bucles
	return
Llegir
	clrf	Polsador	; Si aquest valor no es canvia és que no hi ha cap polsador premut
	nop			; espera un microsegon
	nop			; espera un microsegon
	nop			; espera un microsegon
	nop			; espera un microsegon
	nop			; espera un microsegon, en total 5
	bsf	ADCON0,GO	; Inicia la conversió
	btfsc	ADCON0,GO	; Quan el bit sigui 0 la conversió haurà acabat
	goto	$-1		; repetim la línia fins que deixi de ser 0
				; Comparació P1
	movlw	.220		; Límit superior de P1
	subwf	ADRESH,w	; W = ADRESH - W
	btfsc	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP5		; ADRESH >= W
	movlw	.200		; Límit inferior de P1
	subwf	ADRESH,w	; W = ADRESH - W
	btfss	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP5		; ADRESH < W
	movlw	b'00000001'	; Polsador P1
	movwf	Polsador	; Ho copia a Polsador
	goto	NoP5
NoP5
	return
Llegir_tornatirar		; Comprovem si s'esta prement algun botó
	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_t		; 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_t		; ADRESH < W
	movlw	b'00000001'	; Polsador P1
	movwf	Polsador	; Ho copia a Polsador
	goto	NoP5_t
NoP1_t				; 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_t		; 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_t		; ADRESH < W
	movlw	b'00000010'	; Polsador P2
	movwf	Polsador	; Ho copia a Polsador
	goto	NoP5_t
NoP2_t				; 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_t		; 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_t		; ADRESH < W
	movlw	b'00000100'	; Polsador P3
	movwf	Polsador	; Ho copia a Polsador
	goto	NoP5_t
NoP3_t				; 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_t		; 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_t		; ADRESH < W
	movlw	b'00001000'	; Polsador P4
	movwf	Polsador	; Ho copia a Polsador
	goto	NoP5_t
NoP4_t				; 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_t		; 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_t		; ADRESH < W
	movlw	b'00010000'	; Polsador P5
	movwf	Polsador	; Ho copia a Polsador
NoP5_t
	return
obra				; Comprovem aquí si la primera comprovació ha encés el
	btfsc   Sort,0		; primer LED groc, en cas contrari, encenem aquest i no
	goto	Segon		; el segon. Comprovem això per a totes les posicions
	bsf	Sort,0		; de manera que les pistes queden totes a la dreta
	goto	tornar		; i no tenen perquè correspondre al LED tricolor.
Segon
	btfsc   Sort,1
	goto	Tercer
	bsf	Sort,1
	goto	tornar
Tercer
	btfsc   Sort,2
	goto	Quart
	bsf	Sort,2
	goto	tornar
Quart
	bsf	Sort,3
tornar
	return
busca				; Comprovem quin ha sigut el resultat d'encendre les pistes
	btfss   Sort,0		; per a aquells colors que estaven a la seva posició correcta
	goto	Mira		; i comencem a encendre els intermitents a partir de l'últim
	btfss   Sort,1
	goto	Mira1
	btfss   Sort,2
	goto	Mira2
	btfss   Sort,3
	goto	Mira3
	goto	fi
Mira
	btfss   tira,0		; Tornem a fer servir la variable tira, per a controlar
	goto	Encendre_tira   ; la intermitència de les pistes que donem
Mira1
	btfss   tira,1
	goto	Encendre_tira1
Mira2
	btfss   tira,2
	goto	Encendre_tira2
Mira3
	bsf	tira,3
	goto	fi
Encendre_tira
	bsf	tira,0
	goto	fi
Encendre_tira1
	bsf	tira,1
	goto	fi
Encendre_tira2
	bsf	tira,2
	goto	fi
fi
	return
C1
	bsf	Sort,0
	decf	check1_prima,f  ;Decrementem el contador corresponent a la quantitat de colors iguals al del LED que acabem de controlar
	return			; Si a la combinació hi ha 2 vermells i aquest n'és 1, check1_prima val 1 ara
				; Perquè només queda 1 vermell per a aparéixer
C2
	bsf	Sort,1		; Encenem el LED 2
	movf	check2,w	; Comprovem si el segon color és el mateix que el primer
	xorwf   check1,w
	btfsc   STATUS,Z
	decf	check1_prima,f  ; En cas afirmatiu decrementem la variable que porta la compta del primer color
	decf	check2_prima,f  ; En cas contrari decrementem la corresponent al segon color
				; Si el primer color fos igual al primer, check2_prima ja no es defineix, per tant, no importa decrementar-la
	return
C3				; Igual que abans, encenem el LED3
	bsf	Sort,2
	movf	check3,w	; Però ara comprovarem si el 3r és igual al primer
	xorwf   check1,w
	btfsc   STATUS,Z
	goto	C3_1
	movf	check3,w
	xorwf   check2,w	; o al segon color.
	btfsc   STATUS,Z
	goto	C3_2
	decf	check3_prima,f
	goto	C3_3
C3_1
	decf	check1_prima,f
	goto	C3_3
C3_2
	decf	check2_prima,f
	goto	C3_3
C3_3
	return
C4				; Finalment, fem el mateix per al LED4
	bsf	Sort,3
	movf	check4,w	; Comprovem si és igual al 1r
	xorwf   check1,w
	btfsc   STATUS,Z
	goto	C4_1
	movf	check4,w	; Al 2n
	xorwf   check2,w
	btfsc   STATUS,Z
	goto	C4_2
	movf	check4,w	; O al 3r. I decrementem les variables corresponents
	xorwf   check3,w
	btfsc   STATUS,Z
	goto	C4_3
	decf	check4_prima,f
	goto	C4_4
C4_1
	decf	check1_prima,f
	goto	C4_4
C4_2
	decf	check2_prima,f
	goto	C4_4
C4_3
	decf	check3_prima,f
	goto	C4_4
C4_4
	return
CO1				;Si el primer coincideix, encenem el primer LED groc
	bsf	Sort,0
	bsf	Tra,0		; encenem el bit corresponent de la variable Tra
	decf	check1_prima,f  ; i decrementem la variable corresponent al 1r color
	return			; Tra servirà per portar el compte dels que s'han d'encendre sense modificar
				; la variable Sort
CO2
	bsf	Tra,1		; fem el mateix que abans
	call	obra		; però ara cridarem la funció obra (més abaix)
	movf	check2,w	; que "desordena" les pistes
	xorwf   check1,w	; comprovem tambe si els 2 primers colors són iguals
	btfsc   STATUS,Z	; i decrementem la variable que pertoqui
	decf	check1_prima,f
	decf	check2_prima,f
	return
CO3
	bsf	Tra,2		; igual que abans, anem comprovant 1 a 1 les
	call	obra		; relacions entre els colors. I cridem el bloc obra
	movf	check3,w	; per desordenar les pistes
	xorwf   check1,w
	btfsc   STATUS,Z
	goto	CO3_1
	movf	check3,w
	xorwf   check2,w
	btfsc   STATUS,Z
	goto	CO3_2
	decf	check3_prima,f
	goto	CO3_3
CO3_1
	decf	check1_prima,f
	goto	CO3_3
CO3_2
	decf	check2_prima,f
	goto	CO3_3
CO3_3
	return
CO4
	bsf	Tra,3
	call	obra
	movf	check4,w
	xorwf   check1,w
	btfsc   STATUS,Z
	goto	CO4_1
	movf	check4,w
	xorwf   check2,w
	btfsc   STATUS,Z
	goto	CO4_2
	movf	check4,w
	xorwf   check3,w
	btfsc   STATUS,Z
	goto	CO4_3
	decf	check4_prima,f
	goto	CO4_4
CO4_1
	decf	check1_prima,f
	goto	CO4_4
CO4_2
	decf	check2_prima,f
	goto	CO4_4
CO4_3
	decf	check3_prima,f
	goto	CO4_4
CO4_4
	return
CHECK				; Aquest bloc serveix per comprovar quants colors repetits hi ha a la combinació de manera que
				; si a la combinació només hi ha un vermell i l'usuari posa 3 vermells a la combinació
;check1				; tinguem alguna manera de controlar que només
	movf	Rand,w		; es mostri informació d'un sol dels vermells
	andlw   b'01110000'	; Agafem els 3 bits corresponents al primer LED tricolor
	movwf   check1		; els movem a una variable
	incf	check1_prima,f	; incrementem una variable de comptador
	rrf	check1,f	; alineem la primera variable a la dreta del tot
	rrf	check1,f
	rrf	check1,f
	rrf	check1,f
	bcf	check1,7	; i posem a zero la resta de bits
	bcf	check1,6
	bcf	check1,5
	bcf	check1,4
	bcf	check1,3
;check2
	movf	Rand+1,w	; per al segon LED ens trobem entre Rand i Rand+1
	andlw   b'00000011'	; agafem el valor de Rand+1 i el movem a l'esquerra
	movwf   check2		; per deixar un espai pel bit restant
	rlf	check2,f
	movf	Rand,w
	andlw   b'10000000'	; Agafem el bit restant de Rand i el fiquem a una variable
	movwf   check2k		; que rotem a l'esquerra perquè el valor quedi ficat a C
	rlf	check2k,f	; i copiem el valor (1 o 0) a la posició lliure
	btfsc   STATUS,C	; que hem deixat abans
	bsf	check2,0
	bcf	check2,7
	bcf	check2,6
	bcf	check2,5
	bcf	check2,4
	bcf	check2,3
	movf	check2,w
	xorwf   check1,w
	btfsc   STATUS,Z
	goto	Incr
	incf	check2_prima,f
	goto	Continua
Incr
	incf	check1_prima,f
	goto	Continua
;check3
Continua
	movf	Rand+1,w	; Fem el mateix procediment pel 3r i el 4t color
	andlw   b'00011100'	; ficant la informació en noves variables checkX
	movwf   check3		; alineant els 3 bits a la dreta del tot
	rrf	check3,f	; i incrementant els comptadors corresponents
	rrf	check3,f
	movf	check3,w
	andlw   b'00001111'
	movwf   check3
	movf	check3,w
	xorwf   check1,w
	btfsc   STATUS,Z
	goto	Incr1
	movf	check3,w
	xorwf   check2,w
	btfsc   STATUS,Z
	goto	Incr2
	incf	check3_prima,f
	goto	Continua2
Incr1
	incf	check1_prima,f
	goto	Continua2
Incr2
	incf	check2_prima,f
	goto	Continua2
Continua2
	movf	Rand+1,w
	andlw   b'11100000'
	movwf   check4
	rrf	check4,f
	rrf	check4,f
	rrf	check4,f
	rrf	check4,f
	rrf	check4,f
	bcf	check4,7
	bcf	check4,6
	bcf	check4,5
	bcf	check4,4
	bcf	check4,3
	movf	check4,w
	xorwf   check1,w
	btfsc   STATUS,Z
	goto	Incr3
	movf	check4,w
	xorwf   check2,w
	btfsc   STATUS,Z
	goto	Incr4
	movf	check4,w
	xorwf   check3,w
	btfsc   STATUS,Z
	goto	Incr5
	incf	check4_prima,f
	goto	Continua3
Incr3
	incf	check1_prima,f
	goto	Continua3
Incr4
	incf	check2_prima,f
	goto	Continua3
Incr5
	incf	check3_prima,f
	goto	Continua3
Continua3
	return
Llegir_joc
	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_joc	; 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_joc	; ADRESH < W
	movlw	b'00000001'	; Polsador P1
	movwf	Polsador	; Ho copia a Polsador
	incf	Contador,f
	goto	NoP5_joc
NoP1_joc			; 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_joc	; 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_joc	; ADRESH < W
	movlw	b'00000010'	; Polsador P2
	movwf	Polsador	; Ho copia a Polsador
	incf	Contador+1,f
	goto	NoP5_joc
NoP2_joc			; 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_joc	; 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_joc	; ADRESH < W
	movlw	b'00000100'	; Polsador P3
	movwf	Polsador	; Ho copia a Polsador
	incf	Contador+2,f
	goto	NoP5_joc
NoP3_joc			; 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_joc	; 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_joc	; ADRESH < W
	movlw	b'00001000'	; Polsador P4
	movwf	Polsador	; Ho copia a Polsador
	incf	Contador+3,f
	goto	NoP5_joc
NoP4_joc			; 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_joc	; 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_joc	; ADRESH < W
	movlw	b'00010000'	; Polsador P5
	movwf	Polsador	; Ho copia a Polsador
NoP5_joc
	return
EnviaR16			; Envia 16 bits a un registre de desplaçament
				; Els bits estan a les variables Sortida (bits menys significatius)
				; i Sortida+1
				; Al final de la funció, el valor de Sortida queda corromput
				; Si es vol conservar, cal copiar-lo a una altra variable
	bcf	Port,5		; S'assegura que Clock està desactivat
	bcf	Port,6		; S'assegura que Latch està desactivat
				; En cas contrari, els bits enviats es copiarien
				; immediatament a les sortides
	movf	Port,w		; Agafa el valor de Port
	movwf	PORTB		; I el posa al port B
	movlw	.16		; Número de bits a enviar
	movwf	Compta		; Variable per comptar els bits
BucleR16
	bcf	Port,4		; Desactiva Data. Si toca activar-ho, ja ho farem
	rlf	Sortida,f	; Fa sortir el bit de més a l'esquerra cap a C
				; i roda els altres a l'esquerra
	rlf	Sortida+1,f	; Fa sortir el bit de més a l'esquerra cap a C
				; i roda els altres a l'esquerra
	btfsc	STATUS,C	; Mira si el bit de l'esquerra era un 1
	bsf	Port,4		; Si era 1, activa Data
	movf	Port,w		; Agafa el valor de Port. El valor que ha canviat és Data
	movwf	PORTB		; I el posa al port B
	bsf	Port,5		; Activa Clock, forçant a llegir el bit
	movf	Port,w		; Agafa el valor de Port. El valor que ha canviat és Clock
	movwf	PORTB		; I el posa al port B
	bcf	Port,5		; Desactiva Clock
	movf	Port,w		; Agafa el valor de Port. El valor que ha canviat és Clock
	movwf	PORTB		; I el posa al port B
	decfsz	Compta,f	; Decrementa Compta
	goto	BucleR16	; Si Compta no és zero, repeteix el bucle
	bsf	Port,6		; Torna a activar Latch. Els valors es copiaran a la sortida del registre
	movf	Port,w		; Agafa el valor de Port. El valor que ha canviat és Latch
	movwf	PORTB		; I el posa al port B
	return
TocaNotaTresillo
	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 dóna l'amplada de tON
	bcf	PIR1,TMR2IF	; Desactiva el bit d'interrupció del Timer 2
	bsf	T2CON,TMR2ON	; Activa el Timer 2
				; No convé engegar el PWM fins que el Timer 2 no ha fet un cicle
	btfss	PIR1,TMR2IF	; Espera l'activació del bit d'interrupció del Timer 2
	goto	$-1
	bsf	STATUS,RP0	; Tria el banc 1
	bcf	TRISC,5		; Posem RC5 (sortida del PWM) com a sortida
	bcf	STATUS,RP0	; Tria el banc 0
	movlw	.85		; 1/3 de negra
	movwf	Retard2
	movlw	.1		; multiplica per 4 els 0,2s
	call	Rets		; Espera 0,8.
	bsf	STATUS,RP0	; Tria el banc 1
	bsf	TRISC,5		; Posem RC5 (sortida del PWM) com a entrada
				; Fem silenci
	bcf	STATUS,RP0	; Tria el banc 0
	movlw	.85		; 1/3 d'una negra
	movwf	Retard2
	movlw	.1
	call	Rets		; Espera 0,2 s
	return
TocaNotaCorcheapunto
	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 dóna l'amplada de tON
	bcf	PIR1,TMR2IF	; Desactiva el bit d'interrupció del Timer 2
	bsf	T2CON,TMR2ON	; Activa el Timer 2
				; No convé engegar el PWM fins que el Timer 2 no ha fet un cicle
	btfss	PIR1,TMR2IF	; Espera l'activació del bit d'interrupció del Timer 2
	goto	$-1
	bsf	STATUS,RP0	; Tria el banc 1
	bcf	TRISC,5		; Posem RC5 (sortida del PWM) com a sortida
	bcf	STATUS,RP0	; Tria el banc 0
	movlw	.1		; multiplica per 4 els 0,2 s
	call	Rets		; Espera 0,8.
	movlw	.128
	movwf	Retard2
	movlw	.1
	call	Rets
	bsf	STATUS,RP0	; Tria el banc 1
	bsf	TRISC,5		; Posem RC5 (sortida del PWM) com a entrada
				; Fem silenci
	bcf	STATUS,RP0	; Tria el banc 0
	movlw	.85		; 1/3 d'una negra
	movwf	Retard2
	movlw	.1
	call	Rets		; Espera 0,2 s
	return
TocaNotaBlanca
	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 dóna l'amplada de tON
	bcf	PIR1,TMR2IF	; Desactiva el bit d'interrupció del Timer 2
	bsf	T2CON,TMR2ON	; Activa el Timer 2
				; No convé engegar el PWM fins que el Timer 2 no ha fet un cicle
	btfss	PIR1,TMR2IF	; Espera l'activació del bit d'interrupció del Timer 2
	goto	$-1
	bsf	STATUS,RP0	; Tria el banc 1
	bcf	TRISC,5		; Posem RC5 (sortida del PWM) com a sortida
	bcf	STATUS,RP0	; Tria el banc 0
	movlw  .4		; multiplica per 4 els 0,2s
	call	Rets		; Espera 0,8.
	bsf	STATUS,RP0	; Tria el banc 1
	bsf	TRISC,5		; Posem RC5 (sortida del PWM) com a entrada
				; Fem silenci
	bcf	STATUS,RP0	; Tria el banc 0
	movlw  .1
	call	Rets		; Espera 0,2 s
	return
TocaNotaNegra
	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 dóna l'amplada de tON
	bcf	PIR1,TMR2IF	; Desactiva el bit d'interrupció del Timer 2
	bsf	T2CON,TMR2ON	; Activa el Timer 2
				; No convé engegar el PWM fins que el Timer 2 no ha fet un cicle
	btfss	PIR1,TMR2IF	; Espera l'activació del bit d'interrupció del Timer 2
	goto	$-1
	bsf	STATUS,RP0	; Tria el banc 1
	bcf	TRISC,5		; Posem RC5 (sortida del PWM) com a sortida
	bcf	STATUS,RP0	; Tria el banc 0
	movlw	.128
	movwf	Retard2
	movlw	.2
	call	Rets		; 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
	movlw	.128
	movwf	Retard2
	movlw	.1
	call	Rets		; Espera 0,2 s
	return
	end

 

 

Licencia de Creative Commons
This obra by Oriol Boix is licensed under a Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0 Unported License.