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 4

Aquest grup va plantejar quatre nivells de joc:

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

Aquest programa ocupava més que els 2 kB disponibles a la primera pàgina de la memòria de programa. Per això s'ha hagut de posar una part del programa a la segona pàgina. El programa és el següent:

#include <p16F690.inc>
	__config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
	cblock 0x20
Rand:2			; Dos bytes on guardarem el valor aleatori
Auxrand:2		; Variable auxiliar PER a Random
Retard1rand		; Variables de retard per a la generacio de colors aleatoris
Retard2rand		; Variables de retard per a la generacio de colors aleatoris
Retard3rand		; Variables de retard per a la generacio de colors aleatoris
Port			; Bits a enviar al port B
Sortida			; Valors a enviar al registre de desplaçament
Sortida2		; Sortida+1 correspon als bits del 8 al 15 iSortida als bits del 0 al 7
			; Sortida2
			; R3 G3 B3 R2 G2 B2 R1 G1B1 R0 G0 B0 M3 M2 M1 M0
Compta			; Variable per comptar els bitss'utilitza en el EnviaR16
Polsador		; Variable pel polsador
comptador0		; Hi han 4 comptadors, un per cada LED, laseva funcio es controlar quin color toca, cada cop que escanvii de color elcomptador
comptador1		; es decrementara fins que sigui zero llavorsli donarem el valor .6 de nou (hi ha 7 colors) perque tornial primer color
comptador2		; o sigui cada comptador te en cada moment el decimal correponent al color ences en aquest LED en concret
comptador3
Retard1			; variables que s'utilitzen en el bucle de retard
Retard2
Retard3
ValPR2			; Aquí hi guardarem el valor de PR2
ValCCPR1L		; Aquí hi guardarem el valor de CCPR1L
ValDC1B			; Aquí hi guardarem el valor de DC1B
ValCCP1CON		; Aquí hi guardarem el valor de CCP1CON
colors1			; com que quan la variable sortia i sortida2entren en el EnviaR16 queden corrompudes(no saps amb quinvalor te les
			; deixa), necessitem
colors2			; aquestes dos variables per controlar elsbits que activem a cada LED i d'aqui ho passarem a lesvariables Sortida i
			; Sortida2
			; Vaig canviar el nom de sortida+1 pel desortida2 en un intent desesperat quan no em funcionava el
codi0			; te el decimal corresponent al color guanyador del LED 0
codi1			; te el decimal corresponent al color guanyador del LED 1
codi2			; te el decimal corresponent al color guanyador del LED 2
codi3			; te el decimal corresponent al color guanyador del LED 3
guardat			; aquesta la faig per saber si es el primercop que pulso el pulsador1.. osigui per distingir entreguardar la bona o fercheck
Retardo2		; variables deretard en enencendre els LED grocs
Retardo1		; variables deretard en enencendre els LED grocs
mirar_apagat:2		; variable per a comprovar que cap LED esta apagat
passar_codi:2		; variables per passar de els 16 bits que tenen la combinacio a encendre a els decimals guardats a cada codi
varia			; ajuda a comptar els LED que haurem d'encendre intermitens
variafix		; ajuda a comptar els LED que haurem d'encendre fixos
fixos			; numero de LED monocroms que cal encendre fixos
intermitents		; numero de LED monocroms que cal encendre intermitents
polsadordigital		; variable pel polsador que canvia de nivell
Previ			; I una amb l'estat previ del polsadordigital
Visualit		; Una variable on guardem el que mostraran els LED que marquen el nivell
Comptait		; Una variable per comptar iteracions per filtrar els rebots del polsador digital
Retard1nivell	 	; variable per al retard del canvi de nivell
Combiguanyadora:2	; emmagatzema els bits que cal enviar per encendre la combinacio guanyadora
nivell1			; aquestes variables tenen l'ultim bit ences quan aquell nivell es l'ultim en el qual hem entrat
nivell2			; aquestes variables tenen l'ultim bit ences quan aquell nivell es l'ultim en el qual hem entrat
nivell3			; aquestes variables tenen l'ultim bit ences quan aquell nivell es l'ultim en el qual hem entrat
nivell4			; aquestes variables tenen l'ultim bit ences quan aquell nivell es l'ultim en el qual hem entrat
intentsnivell2		; comptador dels intents que portem en la partida. si arriba a 10 muerte.
intentsnivell4		; comptador dels intents que portem en la partida. si arriba a 10 muerte.
Retard1g 		; retard LED intermitents en guanyar
Retard2g  		; retard LED intermitents en guanyar
fracasado 		; al canviar de pagina emmagatzema cal, emmagatzema b'00000001' si fracasses i es 0 en cas contrari
	endc
	org 0
Inici
	bsf	STATUS,RP0	; Tria el banc 1
	movlw	0xFF		; Posa l'acumulador a FFh(tot uns)
	movwf	TRISA		; Posa tots els bits del portA com a entrada
	clrf	TRISB		; Posa tots els bits del portB com a sortida
	clrf	TRISC		; Posa tots els bits del portC com a sortida
	movlw	b'10000000'	; Configuració de Timer0
				; Com a temporitzador basat en rellotge
				; 000 - Factor d'escala de 2
				; I resistències de pull-up desactivades (valor per defecte)
	movwf	OPTION_REG	; Ho guarda
	movlw	b'00010000'
	movwf	ADCON1		; Posa el conversor a 1/8
	bcf	STATUS,RP0
	bsf	STATUS,RP1	; Tria el banc 2
	movlw	b'00000100'
	movwf	ANSEL		; Posa AN2 com entrada an
	bcf	STATUS,RP0
	bcf	STATUS,RP1	; Tria el banc 0
	clrf	Comptait		; Posa el comptador d'iteracions per al polsadordigital a valor zero
	clrf	Visualit	; Posa el comptador dels LED a valor zero
	clrf	Previ		; L'estat previ del polsador és no premut
	clrf	PORTC		; Aquest clear es perque inicialment no s'encenguin els LED vermells de la placa petita
	movlw	b'00001001'	; activa el conversor A/Dconnectat a AN2
	movwf	ADCON0		; amb el resultat justifi al'esquerra
	clrf	Port		; Posa a zero tots els bitsde la variable Port
	movf	Port,w
	movwf	PORTB		; I ho envia al port B
	movlw   d'6'
	movwf   comptador0	; donem el valor de 6 decimal alscomptadors perque tenim si colors
	movwf   comptador1
	movwf   comptador2	; donem el valor de 6 decimal alscomptadors perque tenim si colors
	movwf   comptador3
	movlw   d'0'
	movwf   guardat
	movlw   b'00000000'	; aqui diem que els LED estiguininicialment apagats (per si a cas)
	movwf   Sortida
	movwf   Sortida2
	movwf   colors1
	movwf   colors2
	clrf	varia
	clrf	variafix
	call	EnviaR16
	clrf	nivell1
	clrf	nivell2
	clrf	nivell3
	clrf	nivell4
				; Triar_Nivell1
Bucle_canvi_nivell
	call	Llegir
	movf	Polsador,w
	xorlw	b'00000001'
	btfsc	STATUS,Z
	goto	tria_nivells
				; lectura del polsador petit
	call	Llegirdigital
				; aqui comença a fer els canvis quan ja confirma que ha estat premut
	movlw	b'00000000'
	xorwf	Visualit,w
	btfsc	STATUS,Z
	goto	encennivell1
	movlw	b'00000001'
	xorwf	Visualit,w
	btfsc	STATUS,Z
	goto	encennivell2
	movlw	b'00000010'
	xorwf	Visualit,w
	btfsc	STATUS,Z
	goto	encennivell3
	movlw	b'00000100'
	xorwf	Visualit,w
	btfsc	STATUS,Z
	goto	encennivell4
	movlw	b'00001000'
	xorwf	Visualit,w
	btfsc	STATUS,Z
	goto	encennivell1
	goto	encenLEDnivell
encennivell1
	movlw	b'00000001'
	movwf	Visualit
	goto	encenLEDnivell
encennivell4
	movlw	b'00001000'
	movwf	Visualit
	goto	encenLEDnivell
encennivell3
	movlw	b'00000100'
	movwf	Visualit
	goto	encenLEDnivell
encennivell2
	movlw	b'00000010'
	movwf	Visualit
encenLEDnivell
	movf	Visualit,w	; Copia Visualit a l'acumulador
	movwf	PORTC		; I ho posa als LED
	goto	Bucle_canvi_nivell
tria_nivells			; aqui entra quan ja hem polsat el 5è de la placa gran
	movlw	b'00000001'
	xorwf	Visualit,w
	btfsc	STATUS,Z
	goto	NIVELL1
	movlw	b'00000010'
	xorwf	Visualit,w
	btfsc	STATUS,Z
	goto	NIVELL2
	movlw	b'00000100'
	xorwf	Visualit,w
	btfsc	STATUS,Z
	goto	NIVELL3
	movlw	b'00001000'
	xorwf	Visualit,w
	btfsc	STATUS,Z
	goto	NIVELL4
				; final del canvi de nivell:
NIVELL1				; entra a nivell 1 i prepara les variables per tal que quan arribi a inicia1 sàpiga el joc a quin nivell estem
	clrf	nivell1
	bsf	nivell1,0
	clrf	nivell2
	clrf	nivell3
	clrf	nivell4
	goto	INICIA1   	; inicia1 és on comença el joc i alla es distingeix a quin nivell estem
NIVELL2				; entra a nivell 2 i prepara les variables per tal que quan arribi a inicia1 sàpiga el joc a quin nivell estem
	clrf	intentsnivell2
	clrf	nivell2
	bsf	nivell2,0
	clrf	nivell1
	clrf	nivell3
	clrf	nivell4
	goto	INICIA1
NIVELL3 			; entra a nivell 3 i prepara les variables per tal que quan arribi a inicia1 sàpiga el joc a quin nivell estem
	clrf	nivell3
	bsf	nivell3,0
	clrf	nivell1
	clrf	nivell2
	clrf	nivell4
	goto	INICIA1
NIVELL4 			; entra a nivell 1 i prepara les variables per tal que quan arribi a inicia1 sàpiga el joc a quin nivell estem
	clrf	intentsnivell4
	clrf	nivell4
	bsf	nivell4,0
	clrf	nivell1
	clrf	nivell3
	clrf	nivell2
	goto	INICIA1
FRACAS 				; aqui arriba només quan s'han fallat els 10 intents en el nivell 2 i 4
	movlw   b'00000001'
	movwf   fracasado		; activem l'ultim bit de la variable fracasado
	clrf	intentsnivell2  	; netegem el comptador de nivells
	clrf	intentsnivell4
	bcf	Combiguanyadora,0  	 ; encenem la combi guanyadora per tal que el jugador la conegui
	bcf	Combiguanyadora,1
	bcf	Combiguanyadora,2
	bcf	Combiguanyadora,3
	movf	Combiguanyadora+1,w
	movwf   Sortida2
	movf	Combiguanyadora,w
	movwf   Sortida
	call	EnviaR16
	bsf	PCLATH,3	; activem el bit 3 de PCLATH
	goto	gameover	; anem a la funcio gameover que reprodueix la canço de fracas
fracas2				; bucle al que torna al acabar la canço que esta pendent de si pitgem el polsador petit per tal de permetre que es segueixi jugant
	btfsc   PORTA,3
	goto	fracas2
	goto	Bucle_canvi_nivell
CAMPIONS			; aqui entra un cop es guanya
	clrf	fracasado	; no activem la variable fracasado
	bsf	PCLATH,3	; activem el bit per a canvi de pagina
	goto	Hasganado	; anem a la funcio Hasganado de la pagina1 que triara el nivell on som i reproduirà la canço corresponent
campions2			; bucle al que es torna al acabar la canço, que encen de forma intermitent els LED verds i liles i els grocs
	btfss   PORTA,3		; anem comprovant si es pitja el polsador de la placa petita per seguir jugant
	; goto	Ret1g
	goto	Bucle_canvi_nivell
	bcf	Combiguanyadora,0
	bsf	Combiguanyadora,1
	bcf	Combiguanyadora,2
	bsf	Combiguanyadora,3
	bcf	Combiguanyadora,4
	bsf	Combiguanyadora,5
	bcf	Combiguanyadora,6
	bsf	Combiguanyadora,7
	bcf	Combiguanyadora+1,0
	bsf	Combiguanyadora+1,1
	bcf	Combiguanyadora+1,2
	bsf	Combiguanyadora+1,3
	bcf	Combiguanyadora+1,4
	bsf	Combiguanyadora+1,5
	bcf	Combiguanyadora+1,6
	bsf	Combiguanyadora+1,7
	movf	Combiguanyadora+1,w
	movwf   Sortida2
	movf	Combiguanyadora,w
	movwf   Sortida
	call	EnviaR16
Ret1g				; bucle per a l'intermitent
	btfss   PORTA,3
	goto	Bucle_canvi_nivell
	decfsz	Retard1g,f	; Decrementa la variable 1
				; si dóna zero, no es fa la instrucció següent
	goto	Ret1g		; Salta, excepte si el resultat ha estat zero
	decfsz	Retard2g,f	; Decrementa la variable 2
	goto	Ret1g		; Salta, excepte si el resultat ha estat zero
	bsf	Combiguanyadora,0
	bcf	Combiguanyadora,1
	bsf	Combiguanyadora,2
	bcf	Combiguanyadora,3
	bsf	Combiguanyadora,4
	bcf	Combiguanyadora,5
	bsf	Combiguanyadora,6
	bcf	Combiguanyadora,7
	bsf	Combiguanyadora+1,0
	bcf	Combiguanyadora+1,1
	bsf	Combiguanyadora+1,2
	bcf	Combiguanyadora+1,3
	bsf	Combiguanyadora+1,4
	bcf	Combiguanyadora+1,5
	bsf	Combiguanyadora+1,6
	bcf	Combiguanyadora+1,7
	movf	Combiguanyadora+1,w
	movwf   Sortida2
	movf	Combiguanyadora,w
	movwf   Sortida
	call	EnviaR16
Ret2g				; bucle per a fer intermitent
	btfss   PORTA,3
	goto	Bucle_canvi_nivell
	decfsz	Retard1g,f	; Decrementa la variable 1
				; si dóna zero, no es fa la instrucció següent
	goto	Ret2g		; Salta, excepte si el resultat ha estat zero
	decfsz	Retard2g,f	; Decrementa la variable 2
	goto	Ret2g		; Salta, excepte si el resultat ha estat zero
	goto	campions2	; Repetim-ho...
INICIA1				; en quant es pitja el 5e polsador de la placa gran va a generar la combinacio bona
Llegir_pols1			; va comprovant si es pitja o no
	call	Llegir
	movf	Polsador,w
	xorlw	b'00000001'
	btfsc	STATUS,Z
	goto	num_aleatori
	goto	Llegir_pols1
num_aleatori			; funcio que genera el nombre aleatori
	movf	TMR0,w		; Agafa el valor de TMR0
	movwf	Rand+1		; I el posa com a byte més significatiu de la llavor
	swapf	TMR0,w		; Agafa el valor permutat de TMR0
	movwf	Rand		; I el posa com a byte menys significatiu de la llavor
Generar_num
	call	Random		; Genera un valor aleatori
apagat3				; comprova si el LED3 esta apagat
	movf	Rand+1,w
	movwf   mirar_apagat
	bcf	mirar_apagat,0
	bcf	mirar_apagat,1
	bcf	mirar_apagat,2
	bcf	mirar_apagat,3
	bcf	mirar_apagat,4
	movf	mirar_apagat,w
	xorlw   b'00000000'
	btfsc   STATUS,Z
	goto	Generar_num	; si esta a apagat torna a generar una combinacio nova
apagat2				; si no ho estava va a mirar si el LED 2 esta apagat
	movf	Rand+1,w
	movwf   mirar_apagat
	bcf	mirar_apagat,0
	bcf	mirar_apagat,1
	bcf	mirar_apagat,5
	bcf	mirar_apagat,6
	bcf	mirar_apagat,7
	movf	mirar_apagat,w
	xorlw   b'00000000'
	btfsc   STATUS,Z
	goto	Generar_num	; si esta a apagat torna a generar una combinacio nova
apagat1				; si no ho estava va a mirar si el LED 1 esta apagat
	movf	Rand+1,w
	movwf   mirar_apagat
	movf	Rand,w
	movwf   mirar_apagat+1
	bcf	mirar_apagat,2
	bcf	mirar_apagat,3
	bcf	mirar_apagat,4
	bcf	mirar_apagat,5
	bcf	mirar_apagat,6
	bcf	mirar_apagat,7
	bcf	mirar_apagat+1,0
	bcf	mirar_apagat+1,1
	bcf	mirar_apagat+1,2
	bcf	mirar_apagat+1,3
	bcf	mirar_apagat+1,4
	bcf	mirar_apagat+1,5
	bcf	mirar_apagat+1,6
	movf	mirar_apagat,w
	xorlw   b'00000000'
	btfsc   STATUS,Z
	goto	apagat1_2
	goto	apagat0
apagat1_2
	movf	mirar_apagat+1,w
	xorlw   b'00000000'
	btfsc   STATUS,Z
	goto	Generar_num	; si esta a apagat torna a generar una combinacio nova
apagat0				; si no ho estava va a mirar si el LED 0 esta apagat
	movf	Rand,w
	movwf   mirar_apagat+1
	bcf	mirar_apagat+1,0
	bcf	mirar_apagat+1,1
	bcf	mirar_apagat+1,2
	bcf	mirar_apagat+1,3
	bcf	mirar_apagat+1,7
	movf	mirar_apagat+1,w
	xorlw   b'00000000'
	btfsc   STATUS,Z
	goto	Generar_num	; si esta a apagat torna a generar una combinacio nova
Cap_apagat			; aqui nomes entra si no hi ha cap d'apagat
	movf	Rand,w
	movwf   colors1		; guarda a les variables color1 i color2 la combinacio sense colors apagats
	movf	Rand+1,w
	movwf   colors2
	movlw	.5		; Retard de 1 s
	call	Rets
Passar_a_codi3  		; passem de dues variables amb la combinacio que cal enviar a EnviaR16 per encendre,
				; a tenir-ne 4, una per a cada LED, que coneixin el decimal atribuit a cada color (ens sera
				; útil per al check i per a el bucle que va canviant de colors al pitjar polsadors)
c3_6
	movf	colors2,w
	movwf   passar_codi+1
	bcf	passar_codi+1,0
	bcf	passar_codi+1,1
	bcf	passar_codi+1,2
	bcf	passar_codi+1,3
	bcf	passar_codi+1,4
	movf	passar_codi+1,w
	xorlw   b'11100000'
	btfss   STATUS,Z
	goto	c3_5
	movlw   .5
	movwf   codi3
	goto	Passar_a_codi2
c3_5
	movf	passar_codi+1,w
	xorlw   b'00100000'
	btfss   STATUS,Z
	goto	c3_4
	movlw   .4
	movwf   codi3
	goto	Passar_a_codi2
c3_4
	movf	passar_codi+1,w
	xorlw   b'01000000'
	btfss   STATUS,Z
	goto	c3_3
	movlw   .3
	movwf   codi3
	goto	Passar_a_codi2
c3_3
	movf	passar_codi+1,w
	xorlw   b'10000000'
	btfss   STATUS,Z
	goto	c3_2
	movlw   .2
	movwf   codi3
	goto	Passar_a_codi2
c3_2
	movf	passar_codi+1,w
	xorlw   b'01100000'
	btfss   STATUS,Z
	goto	c3_1
	movlw   .1
	movwf   codi3
	goto	Passar_a_codi2
c3_1
	movf	passar_codi+1,w
	xorlw   b'10100000'
	btfss   STATUS,Z
	goto	c3_0
	movlw   .0
	movwf   codi3
	goto	Passar_a_codi2
c3_0
	movlw   .6
	movwf   codi3
	goto	Passar_a_codi2
Passar_a_codi2
c2_6
	movf	colors2,w
	movwf   passar_codi+1
	bcf	passar_codi+1,0
	bcf	passar_codi+1,1
	bcf	passar_codi+1,5
	bcf	passar_codi+1,6
	bcf	passar_codi+1,7
	movf	passar_codi+1,w
	xorlw   b'00011100'
	btfss   STATUS,Z
	goto	c2_5
	movlw   .5
	movwf   codi2
	goto	Passar_a_codi1
c2_5
	movf	passar_codi+1,w
	xorlw   b'00000100'
	btfss   STATUS,Z
	goto	c2_4
	movlw   .4
	movwf   codi2
	goto	Passar_a_codi1
c2_4
	movf	passar_codi+1,w
	xorlw   b'00001000'
	btfss   STATUS,Z
	goto	c2_3
	movlw   .3
	movwf   codi2
	goto	Passar_a_codi1
c2_3
	movf	passar_codi+1,w
	xorlw   b'00010000'
	btfss   STATUS,Z
	goto	c2_2
	movlw   .2
	movwf   codi2
	goto	Passar_a_codi1
c2_2
	movf	passar_codi+1,w
	xorlw   b'00001100'
	btfss   STATUS,Z
	goto	c2_1
	movlw   .1
	movwf   codi2
	goto	Passar_a_codi1
c2_1
	movf	passar_codi+1,w
	xorlw   b'00010100'
	btfss   STATUS,Z
	goto	c2_0
	movlw   .0
	movwf   codi2
	goto	Passar_a_codi1
c2_0
	movlw   .6
	movwf   codi2
	goto	Passar_a_codi1
Passar_a_codi1
c1_6_1
	movf	colors2,w
	movwf   passar_codi+1
	bcf	passar_codi+1,2
	bcf	passar_codi+1,3
	bcf	passar_codi+1,4
	bcf	passar_codi+1,5
	bcf	passar_codi+1,6
	bcf	passar_codi+1,7
	movf	colors1,w
	movwf   passar_codi
	bcf	passar_codi,0
	bcf	passar_codi,1
	bcf	passar_codi,2
	bcf	passar_codi,3
	bcf	passar_codi,4
	bcf	passar_codi,5
	bcf	passar_codi,6
	movf	passar_codi+1,w
	xorlw   b'00000011'
	btfss   STATUS,Z
	goto	c1_5_1
	movf	passar_codi,w
	xorlw   b'10000000'
	btfss   STATUS,Z
	goto	c1_6_2
	movlw   .5
	movwf   codi1
	goto	Passar_a_codi0
c1_6_2
	movlw   .6
	movwf   codi1
	goto	Passar_a_codi0
c1_5_1
	movf	passar_codi+1,w
	xorlw   b'00000000'
	btfss   STATUS,Z
	goto	c1_4_1
	movlw   .4
	movwf   codi1
	goto	Passar_a_codi0
c1_4_1
	movf	passar_codi+1,w
	xorlw   b'00000001'
	btfss   STATUS,Z
	goto	c1_3_1
	movf	passar_codi,w
	xorlw   b'10000000'
	btfss   STATUS,Z
	goto	c1_4_2
	movlw   .1
	movwf   codi1
	goto	Passar_a_codi0
c1_4_2
	movlw   .3
	movwf   codi1
	goto	Passar_a_codi0
c1_3_1
	movf	passar_codi,w
	xorlw   b'10000000'
	btfss   STATUS,Z
	goto	c1_3_2
	movlw   .0
	movwf   codi1
	goto	Passar_a_codi0
c1_3_2
	movlw   .2
	movwf   codi1
	goto	Passar_a_codi0
Passar_a_codi0
c0_6
	movf	colors1,w
	movwf   passar_codi
	bcf	passar_codi,0
	bcf	passar_codi,1
	bcf	passar_codi,2
	bcf	passar_codi,3
	bcf	passar_codi,7
	movf	passar_codi,w
	xorlw   b'01110000'
	btfss   STATUS,Z
	goto	c0_5
	movlw   .5
	movwf   codi0
	goto	mirarnivell3_4
c0_5
	movf	passar_codi,w
	xorlw   b'00010000'
	btfss   STATUS,Z
	goto	c0_4
	movlw   .4
	movwf   codi0
	goto	mirarnivell3_4
c0_4
	movf	passar_codi,w
	xorlw   b'00100000'
	btfss   STATUS,Z
	goto	c0_3
	movlw   .3
	movwf   codi0
	goto	mirarnivell3_4
c0_3
	movf	passar_codi,w
	xorlw   b'01000000'
	btfss   STATUS,Z
	goto	c0_2
	movlw   .2
	movwf   codi0
	goto	mirarnivell3_4
c0_2
	movf	passar_codi,w
	xorlw   b'00110000'
	btfss   STATUS,Z
	goto	c0_1
	movlw   .1
	movwf   codi0
	goto	mirarnivell3_4
c0_1
	movf	passar_codi,w
	xorlw   b'01010000'
	btfss   STATUS,Z
	goto	c0_0
	movlw   .0
	movwf   codi0
	goto	mirarnivell3_4
c0_0
	movlw   .6
	movwf   codi0
	goto	mirarnivell3_4
mirarnivell3_4   		; si estem a nivell 3 o quatre ja hem acabat amb la generacio de colors, ja que en podem tenir repetits
	movf	nivell3,w
	xorlw   b'00000001'
	btfsc   STATUS,Z
	goto	Cap_apagat_ni_repetit
	movf	nivell4,w
	xorlw   b'00000001'
	btfsc   STATUS,Z
	goto	Cap_apagat_ni_repetit
Repetits   			; s'encarrega de que no hi hagi colors repetits en els dos primers nivells
	movf	codi0,w
	xorwf   codi1,w
	btfsc   STATUS,Z
	goto	Generar_num	; si n'hi ha de repetits torna a generar una combi nova i repeteix tot
	movf	codi0,w
	xorwf   codi2,w
	btfsc   STATUS,Z
	goto	Generar_num	; si n'hi ha de repetits torna a generar una combi nova i repeteix tot
	movf	codi0,w
	xorwf   codi3,w
	btfsc   STATUS,Z
	goto	Generar_num	; si n'hi ha de repetits torna a generar una combi nova i repeteix tot
	movf	codi1,w
	xorwf   codi2,w
	btfsc   STATUS,Z
	goto	Generar_num	; si n'hi ha de repetits torna a generar una combi nova i repeteix tot
	movf	codi1,w
	xorwf   codi3,w
	btfsc   STATUS,Z
	goto	Generar_num	; si n'hi ha de repetits torna a generar una combi nova i repeteix tot
	movf	codi2,w
	xorwf   codi3,w
	btfsc   STATUS,Z
	goto	Generar_num	; si n'hi ha de repetits torna a generar una combi nova i repeteix tot
Cap_apagat_ni_repetit		; s'ha acabat la generacio de valors.
	movf	colors1,w
	movwf   Combiguanyadora
	movwf   Sortida
	movf	colors2,w
	movwf   Combiguanyadora+1
	movwf   Sortida2
	bcf	Sortida,0
	bcf	Sortida,1
	bcf	Sortida,2
	bcf	Sortida,3
	; call	EnviaR16	; encenem la combi guanyadora, aixo es per nosaltres, per anar comprovant,
				; aquesta linia cal anul·larla en el joc definitiu
Prebucle
	; call	Llegir
	; movf	Polsador,w
	; xorlw   b'00000001'
	; btfsc   STATUS,Z
	; goto	apagarLED	; al polsar el 5e LED s'apaga i iniciem la partida
	; goto	Prebucle
apagarLED
	movlw   b'00000000'
	movwf   Sortida
	movwf   Sortida2
	movwf   colors1
	movwf   colors2
	call	EnviaR16	; apaguem la combi
	movlw   .5
	call	Rets
	movlw   .6		; posem tots els comptadors que van emmmagatzemant el color de cada LED a apagats
	movwf   comptador0
	movwf   comptador1
	movwf   comptador2
	movwf   comptador3
	goto	Bucle
Bucle				; inici de la partida!
	bcf	colors1,0
	bcf	colors1,1
	bcf	colors1,2
	bcf	colors1,3
	btfss   PORTA,3		; si es pitja el polsador de la placa petita, ens hem rendit i se'ns mostra la combi guanyadora
	goto	Mostraguanyadora
	call	Llegir		; Llegeix els polsadors
	movf	Polsador,w
	xorlw	b'00010000'	; Mirem si s'ha premut el 5
	btfsc	STATUS,Z	; Si no és el 5, salta
	goto	LED3		; No cal comentar mes perque laresta d'apartats fan el mateix
	movf	Polsador,w
	xorlw   b'00001000'
	btfsc   STATUS,Z
	goto	LED2
	movf	Polsador,w
	xorlw	b'00000100'
	btfsc	STATUS,Z
	goto	LED1
	movf	Polsador,w
	xorlw   b'00000010'
	btfsc   STATUS,Z
	goto	LED0
	movf	Polsador,w
	xorlw   b'00000001'
	btfsc	STATUS,Z
	goto	quincheck	; al polsar el 5e LED es passa a comprovar resultats
	goto	Bucle		; si no es pitja res es torna a repetir el bucle i mirar tot
quincheck			; depenent del nivell va a check 1 (nivell1) o check 2 (nivell2,3,4)
	movlw   b'00000001'
	xorwf   nivell1,w
	btfsc   STATUS,Z
	goto	Check1

	movlw   b'00000001'
	xorwf   nivell2,w
	btfsc   STATUS,Z
	goto	Check2
	movlw   b'00000001'
	xorwf   nivell3,w
	btfsc   STATUS,Z
	goto	Check2
	movlw   b'00000001'
	xorwf   nivell4,w
	btfsc   STATUS,Z
	goto	Check2
	goto	Bucle		; no hauria de entrar mai aqui ja que sempre estem en un nivell o un altre
Check1				; a cada LED encen el LED corresponent intermitent fix o apagat
	bcf	colors1,0
	bcf	colors1,1
	bcf	colors1,2
	bcf	colors1,3
	clrf	varia
	clrf	variafix
				; primer pas, comptar posicions
colorposicio0
	movf	codi0,w
	xorwf   comptador0,w
	btfss	STATUS,Z
	goto	colorposicio1
	bsf	variafix,0
colorposicio1
	movf	codi1,w
	xorwf   comptador1,w
	btfss	STATUS,Z
	goto	colorposicio2
	bsf	variafix,1
colorposicio2
	movf	codi2,w
	xorwf   comptador2,w
	btfss	STATUS,Z
	goto	colorposicio3
	bsf	variafix,2
colorposicio3
	movf	codi3,w
	xorwf   comptador3,w
	btfss	STATUS,Z
	goto	colorNOposicio0
	bsf	variafix,3
	movlw   b'00001111'
	xorwf   variafix,w
	btfsc   STATUS,Z
	goto	CAMPIONS
colorNOposicio0
	movf	codi0,w
	xorwf   comptador0,w
	btfsc	STATUS,Z
	goto	colorNOposicio1
	movf	codi0,w
	xorwf   comptador1,w
	btfsc   STATUS,Z
	goto	varia1
	movf	codi0,w
	xorwf   comptador2,w
	btfsc   STATUS,Z
	goto	varia2
	movf	codi0,w
	xorwf   comptador3,w
	btfsc   STATUS,Z
	goto	varia3
	goto	colorNOposicio1
varia1
	bsf	varia,1
	goto	colorNOposicio1
varia2
	bsf	varia,2
	goto	colorNOposicio1
varia3
	bsf	varia,3
	goto	colorNOposicio1
colorNOposicio1
	movf	codi1,w
	xorwf   comptador1,w
	btfsc	STATUS,Z
	goto	colorNOposicio2
	movf	codi1,w
	xorwf   comptador0,w
	btfsc   STATUS,Z
	goto	varia11
	movf	codi1,w
	xorwf   comptador2,w
	btfsc   STATUS,Z
	goto	varia22
	movf	codi1,w
	xorwf   comptador3,w
	btfsc   STATUS,Z
	goto	varia33
	goto	colorNOposicio2
varia11
	bsf	varia,0
	goto	colorNOposicio2
varia22
	bsf	varia,2
	goto	colorNOposicio2
varia33
	bsf	varia,3
	goto	colorNOposicio2
colorNOposicio2
	movf	codi2,w
	xorwf   comptador2,w
	btfsc	STATUS,Z
	goto	colorNOposicio3
	movf	codi2,w
	xorwf   comptador0,w
	btfsc   STATUS,Z
	goto	varia111
	movf	codi2,w
	xorwf   comptador1,w
	btfsc   STATUS,Z
	goto	varia222
	movf	codi2,w
	xorwf   comptador3,w
	btfsc   STATUS,Z
	goto	varia333
	goto	colorNOposicio3
varia111
	bsf	varia,0
	goto	colorNOposicio3
varia222
	bsf	varia,1
	goto	colorNOposicio3
varia333
	bsf	varia,3
	goto	colorNOposicio3
colorNOposicio3
	movf	codi3,w
	xorwf   comptador3,w
	btfsc	STATUS,Z
	goto	encendre
	movf	codi3,w
	xorwf   comptador0,w
	btfsc   STATUS,Z
	goto	varia1111
	movf	codi3,w
	xorwf   comptador1,w
	btfsc   STATUS,Z
	goto	varia2222
	movf	codi3,w
	xorwf   comptador2,w
	btfsc   STATUS,Z
	goto	varia3333
	goto	encendre
varia1111
	bsf	varia,0
	goto	encendre
varia2222
	bsf	varia,1
	goto	encendre
varia3333
	bsf	varia,2
	goto	encendre
Check2				; sense indicar posicions
	incf	intentsnivell2,f		; incrementa en 1 els intents cada cop que entra a check
	incf	intentsnivell4,f
	bcf	colors1,0
	bcf	colors1,1
	bcf	colors1,2
	bcf	colors1,3
	clrf	fixos
	clrf	intermitents
	clrf	varia
	clrf	variafix
				; primer pas, comptar posicions
codi_0
	movf	codi0,w
	xorwf   comptador0,w
	btfsc	STATUS,Z
	goto	codi_1_A
	movf	codi0,w
	xorwf   comptador1,w
	btfsc	STATUS,Z
	goto	codi_1_B
	movf	codi0,w
	xorwf   comptador2,w
	btfsc	STATUS,Z
	goto	codi_1_C
	movf	codi0,w
	xorwf   comptador3,w
	btfsc	STATUS,Z
	goto	codi_1_D
	goto	codi_1_E
codi_1_A
	call	FIX
	movf	codi1,w
	xorwf   comptador1,w
	btfsc	STATUS,Z
	goto	A_1_1
	movf	codi1,w
	xorwf   comptador2,w
	btfsc	STATUS,Z
	goto	A_1_2
	movf	codi1,w
	xorwf   comptador3,w
	btfsc	STATUS,Z
	goto	A_1_3
	goto	codi_2_D
A_1_1
	call	FIX
	goto	codi_2_A
A_1_2
	call	INTERMITENT
	goto	codi_2_B
A_1_3
	call	INTERMITENT
	goto	codi_2_C
codi_1_B
	call	INTERMITENT
	movf	codi1,w
	xorwf   comptador0,w
	btfsc	STATUS,Z
	goto	B_1_0
	movf	codi1,w
	xorwf   comptador2,w
	btfsc	STATUS,Z
	goto	B_1_2
	movf	codi1,w
	xorwf   comptador3,w
	btfsc	STATUS,Z
	goto	B_1_3
	goto	codi_2_G
B_1_0
	call	INTERMITENT
	goto	codi_2_A
B_1_2
	call	INTERMITENT
	goto	codi_2_E
B_1_3
	call	INTERMITENT
	goto	codi_2_F
codi_1_C
	call	INTERMITENT
	movf	codi1,w
	xorwf   comptador1,w
	btfsc	STATUS,Z
	goto	C_1_1
	movf	codi1,w
	xorwf   comptador0,w
	btfsc	STATUS,Z
	goto	C_1_0
	movf	codi1,w
	xorwf   comptador3,w
	btfsc	STATUS,Z
	goto	C_1_3
	goto	codi_2_I
C_1_0
	call	INTERMITENT
	goto	codi_2_B
C_1_1
	call	FIX
	goto	codi_2_E
C_1_3
	call	INTERMITENT
	goto	codi_2_H
codi_1_D
	call	INTERMITENT
	movf	codi1,w
	xorwf   comptador1,w
	btfsc	STATUS,Z
	goto	D_1_1
	movf	codi1,w
	xorwf   comptador0,w
	btfsc	STATUS,Z
	goto	D_1_0
	movf	codi1,w
	xorwf   comptador2,w
	btfsc	STATUS,Z
	goto	D_1_2
	goto	codi_2_J
D_1_0
	call	INTERMITENT
	goto	codi_2_C
D_1_1
	call	FIX
	goto	codi_2_F
D_1_2
	call	INTERMITENT
	goto	codi_2_H
codi_1_E
	movf	codi1,w
	xorwf   comptador1,w
	btfsc	STATUS,Z
	goto	E_1_1
	movf	codi1,w
	xorwf   comptador0,w
	btfsc	STATUS,Z
	goto	E_1_0
	movf	codi1,w
	xorwf   comptador2,w
	btfsc	STATUS,Z
	goto	E_1_2
	movf	codi1,w
	xorwf   comptador3,w
	btfsc	STATUS,Z
	goto	E_1_3
	goto	codi_2_I
E_1_0
	call	INTERMITENT
	goto	codi_2_D
E_1_1
	call	FIX
	goto	codi_2_G
E_1_2
	call	INTERMITENT
	goto	codi_2_I
E_1_3
	call	INTERMITENT
	goto	codi_2_J
codi_2_A
	movf	codi2,w
	xorwf   comptador2,w
	btfsc	STATUS,Z
	goto	A_2_2
	movf	codi2,w
	xorwf   comptador3,w
	btfsc	STATUS,Z
	goto	A_2_3
	goto	codi_3_C
A_2_2
	call	FIX
	goto	codi_3_A
A_2_3
	call	INTERMITENT
	goto	codi_3_B
codi_2_B
	movf	codi2,w
	xorwf   comptador1,w
	btfsc	STATUS,Z
	goto	B_2_1
	movf	codi2,w
	xorwf   comptador3,w
	btfsc	STATUS,Z
	goto	B_2_3
	goto	codi_3_E
B_2_1
	call	INTERMITENT
	goto	codi_3_A
B_2_3
	call	INTERMITENT
	goto	codi_3_D
codi_2_C
	movf	codi2,w
	xorwf   comptador2,w
	btfsc	STATUS,Z
	goto	C_2_2
	movf	codi2,w
	xorwf   comptador1,w
	btfsc	STATUS,Z
	goto	C_2_1
	goto	codi_3_F
C_2_1
	call	INTERMITENT
	goto	codi_3_B
C_2_2
	call	FIX
	goto	codi_3_D
codi_2_D
	movf	codi2,w
	xorwf   comptador2,w
	btfsc	STATUS,Z
	goto	D_2_2
	movf	codi2,w
	xorwf   comptador1,w
	btfsc	STATUS,Z
	goto	D_2_1
	movf	codi2,w
	xorwf   comptador3,w
	btfsc	STATUS,Z
	goto	D_2_3
	goto	codi_3_G
D_2_1
	call	INTERMITENT
	goto	codi_3_C
D_2_2
	call	FIX
	goto	codi_3_E
D_2_3
	call	INTERMITENT
	goto	codi_3_F
codi_2_E
	movf	codi2,w
	xorwf   comptador0,w
	btfsc	STATUS,Z
	goto	E_2_0
	movf	codi2,w
	xorwf   comptador3,w
	btfsc	STATUS,Z
	goto	E_2_3
	goto	codi_3_I
E_2_0
	call	INTERMITENT
	goto	codi_3_A
E_2_3
	call	INTERMITENT
	goto	codi_3_H
codi_2_F
	movf	codi2,w
	xorwf   comptador2,w
	btfsc	STATUS,Z
	goto	F_2_2
	movf	codi2,w
	xorwf   comptador0,w
	btfsc	STATUS,Z
	goto	F_2_0
	goto	codi_3_F
F_2_0
	call	INTERMITENT
	goto	codi_3_B
F_2_2
	call	FIX
	goto	codi_3_H
codi_2_G
	movf	codi2,w
	xorwf   comptador2,w
	btfsc	STATUS,Z
	goto	G_2_2
	movf	codi2,w
	xorwf   comptador0,w
	btfsc	STATUS,Z
	goto	G_2_0
	movf	codi2,w
	xorwf   comptador3,w
	btfsc	STATUS,Z
	goto	G_2_3
	goto	codi_3_K
G_2_0
	call	INTERMITENT
	goto	codi_3_C
G_2_2
	call	FIX
	goto	codi_3_I
G_2_3
	call	INTERMITENT
	goto	codi_3_J
codi_2_H
	movf	codi2,w
	xorwf   comptador0,w
	btfsc	STATUS,Z
	goto	H_2_0
	movf	codi2,w
	xorwf   comptador1,w
	btfsc	STATUS,Z
	goto	H_2_1
	goto	codi_3_L
H_2_0
	call	INTERMITENT
	goto	codi_3_D
H_2_1
	call	INTERMITENT
	goto	codi_3_H
codi_2_I
	movf	codi2,w
	xorwf   comptador0,w
	btfsc	STATUS,Z
	goto	I_2_0
	movf	codi2,w
	xorwf   comptador1,w
	btfsc	STATUS,Z
	goto	I_2_1
	movf	codi2,w
	xorwf   comptador3,w
	btfsc	STATUS,Z
	goto	I_2_3
	goto	codi_3_K
I_2_0
	call	INTERMITENT
	goto	codi_3_E
I_2_1
	call	INTERMITENT
	goto	codi_3_I
I_2_3
	call	INTERMITENT
	goto	codi_3_L
codi_2_J
	movf	codi2,w
	xorwf   comptador2,w
	btfsc	STATUS,Z
	goto	J_2_2
	movf	codi2,w
	xorwf   comptador0,w
	btfsc	STATUS,Z
	goto	J_2_0
	movf	codi2,w
	xorwf   comptador1,w
	btfsc	STATUS,Z
	goto	J_2_1
	goto	codi_3_K
J_2_0
	call	INTERMITENT
	goto	codi_3_J
J_2_1
	call	INTERMITENT
	goto	codi_3_I
J_2_2
	call	FIX
	goto	codi_3_L
codi_3_A
	movf	codi3,w
	xorwf   comptador3,w
	btfsc	STATUS,Z
	call	FIX
	goto	RESULTAT
codi_3_B
	movf	codi3,w
	xorwf   comptador2,w
	btfsc	STATUS,Z
	call	INTERMITENT
	goto	RESULTAT
codi_3_C
	movf	codi3,w
	xorwf   comptador3,w
	btfsc	STATUS,Z
	goto	codi_3_C_3
	movf	codi3,w
	xorwf   comptador2,w
	btfsc	STATUS,Z
	goto	codi_3_C_2
	goto	RESULTAT
codi_3_C_2
	call	INTERMITENT
	goto	RESULTAT
codi_3_C_3
	call	FIX
	goto	RESULTAT
codi_3_D
	movf	codi3,w
	xorwf   comptador1,w
	btfsc	STATUS,Z
	call	INTERMITENT
	goto	RESULTAT
codi_3_E
	movf	codi3,w
	xorwf   comptador3,w
	btfsc	STATUS,Z
	goto	codi_3_E_3
	movf	codi3,w
	xorwf   comptador1,w
	btfsc	STATUS,Z
	goto	codi_3_E_1
	goto	RESULTAT
codi_3_E_1
	call	INTERMITENT
	goto	RESULTAT
codi_3_E_3
	call	FIX
	goto	RESULTAT
codi_3_F
	movf	codi3,w
	xorwf   comptador2,w
	btfsc	STATUS,Z
	goto	codi_3_F_1
	movf	codi3,w
	xorwf   comptador1,w
	btfsc	STATUS,Z
	goto	codi_3_F_1
	goto	RESULTAT
codi_3_F_1
	call	INTERMITENT
	goto	RESULTAT
codi_3_G
	movf	codi3,w
	xorwf   comptador3,w
	btfsc	STATUS,Z
	goto	codi_3_G_3
	movf	codi3,w
	xorwf   comptador1,w
	btfsc	STATUS,Z
	goto	codi_3_G_1
	movf	codi3,w
	xorwf   comptador2,w
	btfsc	STATUS,Z
	goto	codi_3_G_1
	goto	RESULTAT
codi_3_G_1
	call	INTERMITENT
	goto	RESULTAT
codi_3_G_3
	call	FIX
	goto	RESULTAT
codi_3_H
	movf	codi3,w
	xorwf   comptador0,w
	btfsc	STATUS,Z
	call	INTERMITENT
	goto	RESULTAT
codi_3_I
	movf	codi3,w
	xorwf   comptador3,w
	btfsc	STATUS,Z
	goto	codi_3_I_3
	movf	codi3,w
	xorwf   comptador0,w
	btfsc	STATUS,Z
	goto	codi_3_I_0
	goto	RESULTAT
codi_3_I_0
	call	INTERMITENT
	goto	RESULTAT
codi_3_I_3
	call	FIX
	goto	RESULTAT
codi_3_J
	movf	codi3,w
	xorwf   comptador0,w
	btfsc	STATUS,Z
	goto	codi_3_I_0
	movf	codi3,w
	xorwf   comptador2,w
	btfsc	STATUS,Z
	goto	codi_3_I_0
	goto	RESULTAT
codi_3_K
	movf	codi3,w
	xorwf   comptador3,w
	btfsc	STATUS,Z
	goto	codi_3_G_3
	movf	codi3,w
	xorwf   comptador0,w
	btfsc	STATUS,Z
	goto	codi_3_G_1
	movf	codi3,w
	xorwf   comptador2,w
	btfsc	STATUS,Z
	goto	codi_3_G_1
	goto	RESULTAT
codi_3_L
	movf	codi3,w
	xorwf   comptador0,w
	btfsc	STATUS,Z
	goto	codi_3_I_0
	movf	codi3,w
	xorwf   comptador1,w
	btfsc	STATUS,Z
	goto	codi_3_I_0
	goto	RESULTAT
FIX				; cada cop que es cridada incrementa fixos en 1
	incf	fixos,f
	return
INTERMITENT			; cada cop que es cridada incremeenta intermitents en 1
	incf	intermitents,f
	return
RESULTAT			; envia a la funcio que cal depenent de quants fixos i quants intermitents cal encendre
	movf	fixos,w
	xorlw   .4
	btfsc	STATUS,Z
	goto	tots_fixos
	movf	fixos,w
	xorlw   .3
	btfsc	STATUS,Z
	goto	tres_fixos
	movf	fixos,w
	xorlw   .2
	btfsc	STATUS,Z
	goto	dos_fixos
	movf	fixos,w
	xorlw   .1
	btfsc	STATUS,Z
	goto	un_fix
	goto	cap_fix
tots_fixos			; encen tots 4 fixos
	movlw   b'00001111'
	movwf   variafix
	goto	CAMPIONS
	goto	encendre
tres_fixos			; encen 3 fixos
	movlw   b'00000111'
	movwf   variafix
	movf	intermitents,w
	xorlw   .1
	btfsc	STATUS,Z
	goto	tres_fixos_un_int
	goto	encendre
tres_fixos_un_int		; tres fix i un int
	movlw   b'00001000'
	movwf   varia
	goto	encendre
dos_fixos	; dos fixos
	movlw   b'00000011'
	movwf   variafix
	movf	intermitents,w
	xorlw   .2
	btfsc	STATUS,Z
	goto	dos_fixos_dos_int
	movf	intermitents,w
	xorlw   .1
	btfsc	STATUS,Z
	goto	dos_fixos_un_int
	goto	encendre
dos_fixos_dos_int  ;dos fixos i un int
	movlw   b'00001100'
	movwf   varia
	goto	encendre
dos_fixos_un_int		; dos fixos i un int
	movlw   b'00000100'
	movwf   varia
	goto	encendre
un_fix				; un fix i va mirant quants int
	movlw   b'00000001'
	movwf   variafix
	movf	intermitents,w
	xorlw   .3
	btfsc   STATUS,Z
	goto	un_fix_tres_int
	movf	intermitents,w
	xorlw   .2
	btfsc	STATUS,Z
	goto	un_fix_dos_int
	movf	intermitents,w
	xorlw   .1
	btfsc	STATUS,Z
	goto	un_fix_un_int
	goto	encendre
un_fix_tres_int
	movlw   b'00001110'
	movwf   varia
	goto	encendre
un_fix_dos_int
	movlw   b'00000110'
	movwf   varia
	goto	encendre
un_fix_un_int
	movlw   b'00000010'
	movwf   varia
	goto	encendre
cap_fix				; cap fix i va mirant quants int
	movf	intermitents,w
	xorlw   .4
	btfsc   STATUS,Z
	goto	tots_int
	movf	intermitents,w
	xorlw   .3
	btfsc	STATUS,Z
	goto	cap_fix_tres_int
	movf	intermitents,w
	xorlw   .2
	btfsc	STATUS,Z
	goto	cap_fix_dos_int
	movf	intermitents,w
	xorlw   .1
	btfsc	STATUS,Z
	goto	cap_fix_un_int
	goto	encendre
tots_int			; tots int
	movlw   b'00001111'
	movwf   varia
	goto	encendre
cap_fix_tres_int
	movlw   b'00000111'
	movwf   varia
	goto	encendre
cap_fix_dos_int
	movlw   b'00000011'
	movwf   varia
	goto	encendre
cap_fix_un_int
	movlw   b'00000001'
	movwf   varia
	goto	encendre
encendre			; encen el que calgui
	call	incrementaintents
	movf	colors2,w
	movwf   Sortida2
	movf	variafix,w
	xorwf   colors1,f	; uneix colors1 amb varia
	movf	varia,w
	xorwf   colors1,f
	movf	colors1,w
	movwf   Sortida
	call	EnviaR16
Ret1_unint			; bucle pels intermitens
	decfsz  Retardo1,f
	goto	Ret1_unint
	decfsz  Retardo2,f
	goto	Ret1_unint
	movf	varia,w
	xorwf   colors1,f
	movf	colors1,w
	movwf   Sortida
	movf	colors2,w
	movwf   Sortida2
	call	EnviaR16
	btfss   PORTA,3
	goto	Mostraguanyadora
Ret2un				; bucle pels intermitens
	decfsz	Retardo1,f	; Decrementa la variable 1
				; si dóna zero, no es fa lainstrucció següent
	goto	Ret2un		; Salta, excepte si elresultat ha estat zero
	decfsz	Retardo2,f	; Decrementa la variable 2
	goto	Ret2un		; Salta, excepte si elresultat ha estat zero
	call	Llegir
	movf	Polsador,w
	btfss	STATUS,Z
	goto	Bucle
	goto	Ret1_unint	; Repetim-ho...
				; és per encendre els LED de colors i canviar-ne els colors al pitjar els corresponents polsadors:
LED3
s6
	movf	comptador3,w	; mirem el valor del comptador, sies 6 vol dir que toca el primer color, si no es 6 saltara capa s5
	xorlw   d'6'		; i aixi successivament fins quetrobi el seu valor i en modifiqui el color del LED
	btfss   STATUS,Z
	goto	s5		; si es 6, aquest pas no el fara,si no es 6 anira a s5
	bsf	colors2,7	; aqui modifiquem tan sols els bits que volem per aconseguir el color desitjat al LED3 (les variables
				; colors2 i colors1 es
	bsf	colors2,6	; com si fossin la sortida i sortida+1 a l'exemple d'internet (per si voleu veure els colors que s'encenen a
				; la taula aquella)
	bsf	colors2,5
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador3,1	; decrementem el comptadorper a que la proxima vegada que premem el polsador vagi cap aun altre color
	call	EnviaR16	; enviem
	call	Rets		; Retard
	goto	Bucle		; cap al bucle fins que es premiun altre polsador
s5
	movf	comptador3,w	; No cal comentar res mes perquees tot igual fins al final,l'unic que anirem canviant seraels bits que activem
	xorlw   d'5'		; quan arribem a la s0 li donaremun altre cop el valor al comptador
	btfss   STATUS,Z
	goto	s4
	bcf	colors2,7
	bcf	colors2,6
	bsf	colors2,5
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador3,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
s4
	movf	comptador3,w
	xorlw   .4
	btfss   STATUS,Z
	goto	s3
	bcf	colors2,7
	bsf	colors2,6
	bcf	colors2,5
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador3,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
s3
	movf	comptador3,w
	xorlw   .3
	btfss   STATUS,Z
	goto	s2
	bsf	colors2,7
	bcf	colors2,6
	bcf	colors2,5
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador3,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
s2
	movf	comptador3,w
	xorlw   .2
	btfss   STATUS,Z
	goto	s1
	bcf	colors2,7
	bsf	colors2,6
	bsf	colors2,5
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador3,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
s1
	movf	comptador3,w
	xorlw   .1
	btfss   STATUS,Z
	goto	s0
	bsf	colors2,7
	bcf	colors2,6
	bsf	colors2,5
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador3,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
s0
	movf	comptador3,w
	xorlw   .0
	btfss   STATUS,Z
	goto	Bucle
	bsf	colors2,7
	bsf	colors2,6
	bcf	colors2,5
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	call	EnviaR16	; Ho envia al registre
	movlw   .6		; li donem el valor de 6 decimal al
comptador
	movwf   comptador3
	call	Rets
	goto	Bucle
LED2
g6
	movf	comptador2,w
	xorlw   d'6'
	btfss   STATUS,Z
	goto	g5
	bsf	colors2,4
	bsf	colors2,3
	bsf	colors2,2
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador2,1
	call	EnviaR16
	call	Rets
	goto	Bucle
g5
	movf	comptador2,w
	xorlw   d'5'
	btfss   STATUS,Z
	goto	g4
	bcf	colors2,4
	bcf	colors2,3
	bsf	colors2,2
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador2,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
g4
	movf	comptador2,w
	xorlw   .4
	btfss   STATUS,Z
	goto	g3
	bcf	colors2,4
	bsf	colors2,3
	bcf	colors2,2
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador2,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
g3
	movf	comptador2,w
	xorlw   .3
	btfss   STATUS,Z
	goto	g2
	bsf	colors2,4
	bcf	colors2,3
	bcf	colors2,2
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador2,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
g2
	movf	comptador2,w
	xorlw   .2
	btfss   STATUS,Z
	goto	g1
	bcf	colors2,4
	bsf	colors2,3
	bsf	colors2,2
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador2,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
g1
	movf	comptador2,w
	xorlw   .1
	btfss   STATUS,Z
	goto	g0
	bsf	colors2,4
	bcf	colors2,3
	bsf	colors2,2
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador2,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
g0
	movf	comptador2,w
	xorlw   .0
	btfss   STATUS,Z
	goto	Bucle
	bsf	colors2,4
	bsf	colors2,3
	bcf	colors2,2
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	call	EnviaR16	; Ho envia al registre
	movlw   .6
	movwf   comptador2
	call	Rets
	goto	Bucle
LED1
b6
	movf	comptador1,w
	xorlw   d'6'
	btfss   STATUS,Z
	goto	b5
	bsf	colors2,1
	bsf	colors2,0
	bsf	colors1,7
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador1,f
	call	EnviaR16
	call	Rets
	goto	Bucle
b5
	movf	comptador1,w
	xorlw   d'5'
	btfss   STATUS,Z
	goto	b4
	bcf	colors2,1
	bcf	colors2,0
	bsf	colors1,7
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador1,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
b4
	movf	comptador1,w
	xorlw   .4
	btfss   STATUS,Z
	goto	b3
	bcf	colors2,1
	bsf	colors2,0
	bcf	colors1,7
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador1,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
b3
	movf	comptador1,w
	xorlw   .3
	btfss   STATUS,Z
	goto	b2
	bsf	colors2,1
	bcf	colors2,0
	bcf	colors1,7
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador1,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
b2
	movf	comptador1,w
	xorlw   .2
	btfss   STATUS,Z
	goto	b1
	bcf	colors2,1
	bsf	colors2,0
	bsf	colors1,7
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador1,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
b1
	movf	comptador1,w
	xorlw   .1
	btfss   STATUS,Z
	goto	b0
	bsf	colors2,1
	bcf	colors2,0
	bsf	colors1,7
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador1,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
b0
	movf	comptador1,w
	xorlw   .0
	btfss   STATUS,Z
	goto	Bucle
	bsf	colors2,1
	bsf	colors2,0
	bcf	colors1,7
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	call	EnviaR16	; Ho envia al registre
	movlw   .6
	movwf   comptador1
	call	Rets
	goto	Bucle
LED0
h6
	movf	comptador0,w
	xorlw   d'6'
	btfss   STATUS,Z
	goto	h5
	bsf	colors1,6
	bsf	colors1,5
	bsf	colors1,4
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador0,1
	call	EnviaR16
	call	Rets
	goto	Bucle
h5
	movf	comptador0,w
	xorlw   d'5'
	btfss   STATUS,Z
	goto	h4
	bcf	colors1,6
	bcf	colors1,5
	bsf	colors1,4
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador0,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
h4
	movf	comptador0,w
	xorlw   .4
	btfss   STATUS,Z
	goto	h3
	bcf	colors1,6
	bsf	colors1,5
	bcf	colors1,4
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador0,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
h3
	movf	comptador0,w
	xorlw   .3
	btfss   STATUS,Z
	goto	h2
	bsf	colors1,6
	bcf	colors1,5
	bcf	colors1,4
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador0,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
h2
	movf	comptador0,w
	xorlw   .2
	btfss   STATUS,Z
	goto	h1
	bcf	colors1,6
	bsf	colors1,5
	bsf	colors1,4
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador0,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
h1
	movf	comptador0,w
	xorlw   .1
	btfss   STATUS,Z
	goto	h0
	bsf	colors1,6
	bcf	colors1,5
	bsf	colors1,4
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	decf	comptador0,1
	call	EnviaR16	; Ho envia al registre
	call	Rets
	goto	Bucle
h0
	movf	comptador0,w
	xorlw   .0
	btfss   STATUS,Z
	goto	Bucle
	bsf	colors1,6
	bsf	colors1,5
	bcf	colors1,4
	movf	colors2,w
	movwf   Sortida2
	movf	colors1,w
	movwf   Sortida
	call	EnviaR16	; Ho envia al registre
	movlw   .6
	movwf   comptador0
	call	Rets
	goto	Bucle
EnviaR16			; Envia 16 bits a un registre de desplaçament
				; Els bits estan a lesvariables Sortida (bits menys significatius)
				; i Sortida+1
				; Al final de la funció, elvalor de Sortida queda corromput
				; Si es vol conservar, calcopiar-lo a una altra variable
	bcf	Port,5		; S'assegura que Clock estàdesactivat
	bcf	Port,6		; S'assegura que Latch estàdesactivat
				; En cas contrari, els bitsenviats es copiarien
				; immediatament a lessortides
	movf	Port,w		; Agafa el valor de Port
	movwf	PORTB		; I el posa al port B
	movlw	.16		; Número de bits a enviar
	movwf	Compta		; Variable per comptar elsbits
BucleR16
	bcf	Port,4		; Desactiva Data. Si toca activar-ho, ja ho farem
	rlf	Sortida,f	; Fa sortir el bit de més a l'esquerra cap a C
				; i roda els altres a l'esquerra
	rlf	Sortida2,f	; Fa sortir el bit de més a l'esquerra cap a C
				; i roda els altres a l'esquerra
	btfsc	STATUS,C	; Mira si el bit del'esquerra era un 1
	bsf	Port,4		; Si era 1, activa Data
	movf	Port,w		; Agafa el valor de Port. El valor que ha canviat és Data
	movwf	PORTB		; I el posa al port B
	bsf	Port,5		; Activa Clock, forçant a llegir el bit
	movf	Port,w		; Agafa el valor de Port. El valor que ha canviat és Clock
	movwf	PORTB		; I el posa al port B
	bcf	Port,5		; Desactiva Clock
	movf	Port,w		; Agafa el valor de Port. El valor que ha canviat és Clock
	movwf	PORTB		; I el posa al port B
	decfsz	Compta,f	; Decrementa Compta
	goto	BucleR16	; Si Compta no és zero,repeteix el bucle
	bsf	Port,6		; Torna a activar Latch. Els valors es copiaran a la sortida del registre
	movf	Port,w		; Agafa el valor de Port. El valor que ha canviat és Latch
	movwf	PORTB		; I el posa al port B
	return
Llegir
	clrf	Polsador	; Si aquest valor no escanvia és que no hi ha cap polsador premut
	nop			; espera un microsegon
	nop			; espera un microsegon
	nop			; espera un microsegon
	nop			; espera un microsegon
	nop			; espera un microsegon, en total 5
	bsf	ADCON0,GO	; Inicia la conversió
	btfsc	ADCON0,GO	; Quan el bit sigui 0 la conversió haurà acabat
	goto	$-1		; repetim la línia fins que deixi de ser 0
				; Comparació P1
	movlw	.220		; Límit superior de P1
	subwf	ADRESH,w	; W = ADRESH - W
	btfsc	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP1		; ADRESH >= W
	movlw	.200		; Límit inferior de P1
	subwf	ADRESH,w	; W = ADRESH - W
	btfss	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP1		; ADRESH < W
	movlw	b'00000001'	; Polsador P1
	movwf	Polsador	; Ho copia a Polsador
	goto	NoP5
NoP1				; Comparació P2
	movlw	.194		; Límit superior de P2
	subwf	ADRESH,w	; W = ADRESH - W
	btfsc	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP2		; ADRESH >= W
	movlw	.174		; Límit inferior de P2
	subwf	ADRESH,w	; W = ADRESH - W
	btfss	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP2		; ADRESH < W
	movlw	b'00000010'	; Polsador P2
	movwf	Polsador	; Ho copia a Polsador
	goto	NoP5
NoP2				; Comparació P3
	movlw	.163		; Límit superior de P3
	subwf	ADRESH,w	; W = ADRESH - W
	btfsc	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP3		; ADRESH >= W
	movlw	.143		; Límit inferior de P3
	subwf	ADRESH,w	; W = ADRESH - W
	btfss	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP3		; ADRESH < W
	movlw	b'00000100'	; Polsador P3
	movwf	Polsador	; Ho copia a Polsador
	goto	NoP5
NoP3				; Comparació P4
	movlw	.90		; Límit superior de P4
	subwf	ADRESH,w	; W = ADRESH - W
	btfsc	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP4		; ADRESH >= W
	movlw	.70		; Límit inferior de P4
	subwf	ADRESH,w	; W = ADRESH - W
	btfss	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP4		; ADRESH < W
	movlw	b'00001000'	; Polsador P4
	movwf	Polsador	; Ho copia a Polsador
	goto	NoP5
NoP4				; Comparació P5
	movlw	.55		; Límit superior de P5
	subwf	ADRESH,w	; W = ADRESH - W
	btfsc	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP5		; ADRESH >= W
	movlw	.35		; Límit inferior de P5
	subwf	ADRESH,w	; W = ADRESH - W
	btfss	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP5		; ADRESH < W
	movlw	b'00010000'	; Polsador P5
	movwf	Polsador	; Ho copia a Polsador
NoP5
	return
Rets				; Funció de retard d'1 s
Bucles
	decfsz	Retard1,f
	goto	Bucles
	decfsz	Retard2,f
	goto	Bucles
	return
Random
	clrf	Auxrand		; Posa a zero les variables auxiliars
	clrf	Auxrand+1	; Posa a zero les variables auxiliars
				; Rand+1:	15 14 13 12 11 10  9  8
				; Rand:		7  6  5  4  3  2  1  0
	rlf	Rand+1,w	; Roda a l'esquerra i deixa el resultat a W
				; Rand+1:	15 14 13 12 11 10  9  8
				; W:		14 13 12 11 10  9  8  X
	xorwf	Rand+1,w	; Fa un xor amb l'original i deixa el resultat a W
	movwf	Auxrand+1	; El bit de l'esquerra serà la xor del 14 i el 15
				;
	swapf	Rand+1,f	; Permuta els nibbles
				; Rand+1:	11 10  9  8 15 14 13 12
				; Rand:		7  6  5  4  3  2  1  0
	swapf	Rand,w		; Guarda els nibbles permutats a W
	movwf	Auxrand		; Auxrand:	3  2  1  0  7  6  5  4
	bcf	STATUS,C	; Entrarem un zero
	rlf	Auxrand,f	; Hem rodat a l'esquerra, ara el bit 3 és a C
	btfsc	STATUS,C	; Si C és zero no fem res
	bsf	Auxrand,0	; Si C és 1, activem el bit de la dreta
				; Auxrand:	2  1  0  7  6  5  4  3
				; Rand+1:	11 10  9  8 15 14 13 12
				; Rand:		7  6  5  4  3  2  1  0
	movf	Auxrand,w	; Copia Auxrand a W
	xorwf	Rand+1,w	; El bit de la dreta de W serà la xor de 3 i 12
	swapf	Rand+1,f	; Ho torna a deixar com estava
				; Rand+1:	15 14 13 12 11 10  9  8
				; Rand:		7  6  5  4  3  2  1  0
	andlw	b'00000001'	; Posa w a zero excepte el bit de la dreta
	rlf	Auxrand+1,f	; Agafem el bit de l'esquerra i el posem a C
				; Aquest bit era la xor del 14 i el 15
	rlf	Rand,f		; Rodem Rand a l'esquerra entrant el bit que volem per la dreta
	xorwf	Rand,f		; Li fem UNA xor amb W que afecta només al bit de la dreta
	rlf	Rand+1,f	; Rodem Rand+1 a l'esquerra entrant el bit que ha sortit de Rand
	return
Retsrand			; Funció de retard de 0,2 W s
	movwf	Retard3rand
Buclesrand
	decfsz	Retard1rand,f
	goto	Bucles
	decfsz	Retard2rand,f
	goto	Bucles
	decfsz	Retard3rand,f
	goto	Bucles
	return
Llegirdigital
	movlw	b'00000001'
	movwf	polsadordigital	; Activem polsador abans de comprovar
	btfsc	PORTA,3		; Mira si està desactivada l'entrada A3
				; Si desactivat (premut), no fa la instrucció següent
	clrf	polsadordigital	; Si no està premut, desactiva polsador
	movf	Previ,w		; Copia Previ a l'acumulador
	xorwf	polsadordigital,w	; Compara Previ amb Polsador, si són iguals s'activa Z
	btfsc	STATUS,Z	; Si són iguals va a Final
	goto	Esborra
	incf	Comptait,f	; Si són iguals, incrementa el valor de Comptait
	movf	Comptait,w	; Copia Comptait a l'acumulador
	xorlw	.4		; Comprova si val 4, si ho val s'activa Z
	btfss	STATUS,Z	; Si val 4 no fa la instrucció següent
	goto	Final		; Si no era 4 va a Final
	movf	polsadordigital,w	; Copia Polsador a W, si val 0 s'activa Z
	btfsc	STATUS,Z	; Si Polsador valia 1 (Z=0) no fa la instrucció següent
	goto	Invert		; Si no està premut, ja estem
	return
Mostraguanyadora		; encen la combinacio bona i va mirant si polsem el polsador de la placa peque
	bcf	Combiguanyadora,0
	bcf	Combiguanyadora,1
	bcf	Combiguanyadora,2
	bcf	Combiguanyadora,3
	movf	Combiguanyadora+1,w
	movwf   Sortida2
	movf	Combiguanyadora,w
	movwf   Sortida
	call	EnviaR16
	btfss   PORTA,3
	goto	Mostraguanyadora
	goto	Bucle_canvi_nivell
Invert				; pertany a lllegirdigital
	movf	Previ,w		; Copia Previ a l'acumulador
	xorlw	b'00000001'	; Inverteix el valor
	movwf	Previ		; I ho guarda a Previ
Esborra				; pertany a lllegirdigital
	clrf	Comptait	; Posa el comptador d'iteracions a valor zero
Final				; Funció de retard 1 ms
	nop
	decfsz	Retard1nivell,f
	goto	Final
	goto	Bucle_canvi_nivell		; Repetim-ho...
incrementaintents		; va mirant que no ens passem del tope d'intents
	movf	nivell3,w
	xorlw   b'00000001'
	btfsc   STATUS,Z
	return
	movlw   d'10'
	xorwf   intentsnivell4,w
	btfsc	STATUS,Z
	goto	FRACAS
	movlw   d'10'
	xorwf   intentsnivell2,w
	btfsc	STATUS,Z
	goto	FRACAS
	return
	org 0x800 		; canvi de pagina
Hasganado			; tria la canço que reprodueix quan guanyes
	movlw	b'00000001'
	xorwf	Visualit,w
	btfsc	STATUS,Z
	goto	granjapepito
	movlw	b'00000010'
	xorwf	Visualit,w
	btfsc	STATUS,Z
	goto	simpsons
	movlw	b'00000100'
	xorwf	Visualit,w
	btfsc	STATUS,Z
	goto	caribe
	movlw	b'00001000'
	xorwf	Visualit,w
	btfsc	STATUS,Z
	goto	imperio
granjapepito			; nivell1
	bsf	STATUS,RP0	; Tria el banc 1
	movlw	b'00100000'	; Definim com volem les E/S del port C
	movwf	TRISC		; RC5 (sortida del PWM) com a entrada
	bcf	STATUS,RP0	; Tria el banc 0
	movlw	b'00001100'	; Configura el PWM, bits P1M (bits 7-6) a 00 mode senzill
				; DC1B = 00 (bits 5-4) els dos bits de menys pes són 0
				; CCP1M = 11xx en mode senzill els bit 0 i 1 no afecten
	movwf	ValCCP1CON	; Ho guarda per fer-ho servir més tard
	movwf	CCP1CON		; Ho posa com a configuració del PWM
	movlw	b'00000011'	; Configura el Timer 2
				; bits T2KCPS (bits 1-0) a 11 prescalat de 16
				; bit 2 (TMR2ON) a 0, Timer aturat
				; Postscaler TOUTPS (bits 6-3) no afecten al PWM
	movwf	T2CON		; Ho posa com a configuració del Timer 2
	call	Sol
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Sol
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Sol
	call	TocaNota4	; Toca la nota configurada
	call	TocaNota4	; Toca la nota configurada
	call	Re
	call	TocaNota4	; Toca la nota configurada
	call	TocaNota4
	call	Mi
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Mi
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Re
	call	TocaNota3	; Toca la nota configurada
	call	RetM
	call	Si
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Si
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	La
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	La
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Sol
	call	TocaNota3	; Toca la nota configurada
	call	RetM
	bcf	PCLATH,3
	goto	campions2
simpsons
	bsf	STATUS,RP0	; Tria el banc 1
	movlw	b'00100000'	; Definim com volem les E/S del port C
	movwf	TRISC		; RC5 (sortida del PWM) com a entrada
	bcf	STATUS,RP0	; Tria el banc 0
	clrf	PORTC		; Desactiva les sortides del port C
	movlw	b'00001100'	; Configura el PWM, bits P1M (bits 7-6) a 00 mode senzill
				; DC1B = 00 (bits 5-4) els dos bits de menys pes són 0
				; CCP1M = 11xx en mode senzill els bit 0 i 1 no afecten
	movwf	ValCCP1CON	; Ho guarda per fer-ho servir més tard
	movwf	CCP1CON		; Ho posa com a configuració del PWM
	movlw	b'00000011'	; Configura el Timer 2
				; bits T2KCPS (bits 1-0) a 11 prescalat de 16
				; bit 2 (TMR2ON) a 0, Timer aturat
				; Postscaler TOUTPS (bits 6-3) no afecten al PWM
	movwf	T2CON		; Ho posa com a configuració del Timer 2
	call	Fa
	call	TocaNota3	; Toca la nota configurada
	call	RetM
	call	La
	call	TocaNota2	; Toca la nota configurada
	call	RetM
	call	Si
	call	TocaNota2	; Toca la nota configurada
	call	RetM
	call	Reagud
	call	TocaNota2	; Toca la nota configurada
	call	Doagud
	call	TocaNota3	; Toca la nota configurada
	call	RetM
	call	La
	call	TocaNota2	; Toca la nota configurada
	call	RetM
	call	Fa
	call	TocaNota2	; Toca la nota configurada
	call	RetM
	call	Re
	call	TocaNota2	; Toca la nota configurada
	call	Sigrave
	call	TocaNota2	; Toca la nota configurada
	call	Miniret
	call	RetC
	call	Sigrave
	call	TocaNota2	; Toca la nota configurada
	call	Miniret
	call	RetC
	call	Sigrave
	call	TocaNota2	; Toca la nota configurada
	call	Miniret
	call	RetC
	call	Do
	call	TocaNota3	; Toca la nota configurada
	call	RetM
	call	RetM
	call	RetM
	call	RetM
	call	Sigrave
	call	TocaNota2	; Toca la nota configurada
	call	Miniret
	call	RetC
	call	Sigrave
	call	TocaNota2	; Toca la nota configurada
	call	Miniret
	call	RetC
	call	Sigrave
	call	TocaNota2	; Toca la nota configurada
	call	Miniret
	call	RetC
	call	Do
	call	TocaNota2	; Toca la nota configurada
	call	Mi
	call	TocaNota3	; Toca la nota configurada
	call	RetM
	call	Fa
	call	TocaNota2	; Toca la nota configurada
	call	Miniret
	call	RetC
	call	Fa
	call	TocaNota2	; Toca la nota configurada
	call	Miniret
	call	RetC
	call	Fa
	call	TocaNota2	; Toca la nota configurada
	call	Miniret
	call	RetC
	call	Fa
	call	TocaNota2	; Toca la nota configurada
	call	RetM
	bcf	PCLATH,3
	goto	campions2
caribe				; nivelll3
	bsf	STATUS,RP0	; Tria el banc 1
	movlw	b'00100000'	; Definim com volem les E/S del port C
	movwf	TRISC		; RC5 (sortida del PWM) com a entrada
	bcf	STATUS,RP0	; Tria el banc 0
	movlw	b'00001100'	; Configura el PWM, bits P1M (bits 7-6) a 00 mode senzill
				; DC1B = 00 (bits 5-4) els dos bits de menys pes són 0
				; CCP1M = 11xx en mode senzill els bit 0 i 1 no afecten
	movwf	ValCCP1CON	; Ho guarda per fer-ho servir més tard
	movwf	CCP1CON		; Ho posa com a configuració del PWM
	movlw	b'00000011'	; Configura el Timer 2
				; bits T2KCPS (bits 1-0) a 11 prescalat de 16
				; bit 2 (TMR2ON) a 0, Timer aturat
				; Postscaler TOUTPS (bits 6-3) no afecten al PWM
	movwf	T2CON		; Ho posa com a configuració del Timer 2
	call	Do
	call	TocaNota4	; Toca la nota configurada
	call	Mib
	call	TocaNota4	; Toca la nota configurada
	call	Fa
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Fa
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Fa
	call	TocaNota4	; Toca la nota configurada
	call	Sol
	call	TocaNota4	; Toca la nota configurada
	call	Lab
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Lab
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Lab
	call	TocaNota4	; Toca la nota configurada
	call	Sib
	call	TocaNota4	; Toca la nota configurada
	call	Sol
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Sol
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Fa
	call	TocaNota4	; Toca la nota configurada
	call	Mib
	call	TocaNota4	; Toca la nota configurada
	call	Miniret
	call	RetC
	call	Mib
	call	TocaNota4	; Toca la nota configurada
	call	Fa
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	RetM
	call	Do
	call	TocaNota4	; Toca la nota configurada
	call	Mib
	call	TocaNota4	; Toca la nota configurada
	call	Fa
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Fa
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Fa
	call	TocaNota4	; Toca la nota configurada
	call	Sol
	call	TocaNota4	; Toca la nota configurada
	call	Lab
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Lab
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Lab
	call	TocaNota4	; Toca la nota configurada
	call	Sib
	call	TocaNota4	; Toca la nota configurada
	call	Sol
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Sol
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Fa
	call	TocaNota4	; Toca la nota configurada
	call	Mib
	call	TocaNota4	; Toca la nota configurada
	call	Fa
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	RetM
	call	Do
	call	TocaNota4	; Toca la nota configurada
	call	Mib
	call	TocaNota4	; Toca la nota configurada
	call	Fa
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Fa
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Fa
	call	TocaNota4	; Toca la nota configurada
	call	Lab
	call	TocaNota4	; Toca la nota configurada
	call	Sib
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Sib
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Sib
	call	TocaNota4	; Toca la nota configurada
	call	Doagud
	call	TocaNota4	; Toca la nota configurada
	call	Dosostagud
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Dosostagud
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Doagud
	call	TocaNota4	; Toca la nota configurada
	call	Sib
	call	TocaNota4	; Toca la nota configurada
	call	Doagud
	call	TocaNota4	; Toca la nota configurada
	call	Fa
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	RetM
	call	Fa
	call	TocaNota4	; Toca la nota configurada
	call	Sol
	call	TocaNota4	; Toca la nota configurada
	call	Lab
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Lab
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Sib
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Doagud
	call	TocaNota4	; Toca la nota configurada
	call	Fa
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	RetM
	call	Fa
	call	TocaNota4	; Toca la nota configurada
	call	Lab
	call	TocaNota4	; Toca la nota configurada
	call	Sol
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Sol
	call	TocaNota4	; Toca la nota configurada
	call	RetM
	call	Fa
	call	TocaNota4	; Toca la nota configurada
	call	Mi
	call	TocaNota4	; Toca la nota configurada
	call	Fa
	call	TocaNota3	; Toca la nota configurada
	call	RetM
	bcf	PCLATH,3
	goto	campions2
imperio				; nivell4
	bsf	STATUS,RP0	; Tria el banc 1
	movlw	b'00100000'	; Definim com volem les E/S del port C
	movwf	TRISC		; RC5 (sortida del PWM) com a entrada
	bcf	STATUS,RP0	; Tria el banc 0
	movlw	b'00001100'	; Configura el PWM, bits P1M (bits 7-6) a 00 mode senzill
				; DC1B = 00 (bits 5-4) els dos bits de menys pes són 0
				; CCP1M = 11xx en mode senzill els bit 0 i 1 no afecten
	movwf	ValCCP1CON	; Ho guarda per fer-ho servir més tard
	movwf	CCP1CON		; Ho posa com a configuració del PWM
	movlw	b'00000011'	; Configura el Timer 2
				; bits T2KCPS (bits 1-0) a 11 prescalat de 16
				; bit 2 (TMR2ON) a 0, Timer aturat
				; Postscaler TOUTPS (bits 6-3) no afecten al PWM
	movwf	T2CON		; Ho posa com a configuració del Timer 2
	call	Sol
	call	TocaNota3	; Toca la nota configurada
	call	RetM
	call	Sol
	call	TocaNota3	; Toca la nota configurada
	call	RetM
	call	Sol
	call	TocaNota3	; Toca la nota configurada
	call	RetM
	call	Reb
	call	TocaNota3	; Toca la nota configurada
	call	Sib
	call	TocaNota2	; Toca la nota configurada
	call	Sol
	call	TocaNota3	; Toca la nota configurada
	call	RetM
	call	Reb
	call	TocaNota3	; Toca la nota configurada
	call	Sib
	call	TocaNota2	; Toca la nota configurada
	call	Sol
	call	TocaNota3	; Toca la nota configurada
	call	RetM
	call	RetM		; Espera 0,2 s
	call	RetM		; Espera 0,2 s
	call	RetM		; Espera 0,2 s
	call	Reagud
	call	TocaNota3	; Toca la nota configurada
	call	RetM
	call	Reagud
	call	TocaNota3	; Toca la nota configurada
	call	RetM
	call	Reagud
	call	TocaNota3	; Toca la nota configurada
	call	RetM
	call	Mibagudo
	call	TocaNota3	; Toca la nota configurada
	call	Sib
	call	TocaNota2	; Toca la nota configurada
	call	Fasost
	call	TocaNota3	; Toca la nota configurada
	call	RetM
	call	Reb
	call	TocaNota3	; Toca la nota configurada
	call	Sib
	call	TocaNota2	; Toca la nota configurada
	call	Sol
	call	TocaNota3	; Toca la nota configurada
	call	RetM		; Espera 0,2 s
	bcf	PCLATH,3
	goto	campions2
gameover
	bsf	STATUS,RP0	; Tria el banc 1
	movlw	b'00100000'	; Definim com volem les E/S del port C
	movwf	TRISC		; RC5 (sortida del PWM) com a entrada
	bcf	STATUS,RP0	; Tria el banc 0
	movlw	b'00001100'	; Configura el PWM, bits P1M (bits 7-6) a 00 mode senzill
				; DC1B = 00 (bits 5-4) els dos bits de menys pes són 0
				; CCP1M = 11xx en mode senzill els bit 0 i 1 no afecten
	movwf	ValCCP1CON	; Ho guarda per fer-ho servir més tard
	movwf	CCP1CON		; Ho posa com a configuració del PWM
	movlw	b'00000011'	; Configura el Timer 2
				; bits T2KCPS (bits 1-0) a 11 prescalat de 16
				; bit 2 (TMR2ON) a 0, Timer aturat
				; Postscaler TOUTPS (bits 6-3) no afecten al PWM
	movwf	T2CON		; Ho posa com a configuració del Timer 2
	call	Doagud
	call	TocaNota3	; Toca la nota configurada
	call	RetM
	call	Sol
	call	TocaNota3
	call	RetM
	call	Mi
	call	TocaNota3
	call	La
	call	TocaNota2
	call	Si
	call	TocaNota2
	call	La
	call	TocaNota2
	call	Lab
	call	TocaNota2
	call	Sib
	call	TocaNota2
	call	Lab
	call	TocaNota2
	call	Sol
	call	TocaNota3	; Toca la nota configurada
	call	RetM
	bcf	PCLATH,3
	goto	fracas2
TocaNota2
	movf	ValPR2,w	; Valor de PR2 per a la nota desitjada
	bsf	STATUS,RP0	; Tria el banc 1
	bsf	TRISC,5		; Posem RC5 (sortida del PWM) com a entrada
	movwf	PR2		; Ho posem com a comparació al Timer 2
	bcf	STATUS,RP0	; Tria el banc 0
	movf	ValCCP1CON,w	; Agafa la configuració de CCP1CON
	andlw	b'11001111'	; Posa els bits que corresponen a DC1B a zero per precaució
	movwf	ValCCP1CON	; I ho torna a guardar
	swapf	ValDC1B,w	; Agafa el valor que ha d'anar a DC1B
				; I el guarda, permutat, a W
				; Els dos bits han de quedar a les posicions 4-5
	andlw	b'00110000'	; Posa els altres sis bits a zero per precaució
	iorwf	ValCCP1CON,w	; I ho afegeix a CCP1CON
	movwf	CCP1CON		; Ho posa com a configuració del PWM
	movf	ValCCPR1L,w	; Valor de CCPR1L
	movwf	CCPR1L		; Registre que ens 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
	call	RetM		; Espera 0,2 s
	bsf	STATUS,RP0	; Tria el banc 1
	bsf	TRISC,5		; Posem RC5 (sortida del PWM) com a entrada
				; Fem silenci
	bcf	STATUS,RP0	; Tria el banc 0
	return
TocaNota4
	movf	ValPR2,w	; Valor de PR2 per a la nota desitjada
	bsf	STATUS,RP0	; Tria el banc 1
	bsf	TRISC,5		; Posem RC5 (sortida del PWM) com a entrada
	movwf	PR2		; Ho posem com a comparació al Timer 2
	bcf	STATUS,RP0	; Tria el banc 0
	movf	ValCCP1CON,w	; Agafa la configuració de CCP1CON
	andlw	b'11001111'	; Posa els bits que corresponen a DC1B a zero per precaució
	movwf	ValCCP1CON	; I ho torna a guardar
	swapf	ValDC1B,w	; Agafa el valor que ha d'anar a DC1B
				; I el guarda, permutat, a W
				; Els dos bits han de quedar a les posicions 4-5
	andlw	b'00110000'	; Posa els altres sis bits a zero per precaució
	iorwf	ValCCP1CON,w	; I ho afegeix a CCP1CON
	movwf	CCP1CON		; Ho posa com a configuració del PWM
	movf	ValCCPR1L,w	; Valor de CCPR1L
	movwf	CCPR1L		; Registre que ens 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
	call	Miniret2
	call	Miniret
	call	Miniret2
	call	Miniret
	call	Miniret2	; Espera 0,2 s
	bsf	STATUS,RP0	; Tria el banc 1
	bsf	TRISC,5		; Posem RC5 (sortida del PWM) com a entrada
				; Fem silenci
	bcf	STATUS,RP0	; Tria el banc 0
	return
TocaNota3
	movf	ValPR2,w	; Valor de PR2 per a la nota desitjada
	bsf	STATUS,RP0	; Tria el banc 1
	bsf	TRISC,5		; Posem RC5 (sortida del PWM) com a entrada
	movwf	PR2		; Ho posem com a comparació al Timer 2
	bcf	STATUS,RP0	; Tria el banc 0
	movf	ValCCP1CON,w	; Agafa la configuració de CCP1CON
	andlw	b'11001111'	; Posa els bits que corresponen a DC1B a zero per precaució
	movwf	ValCCP1CON	; I ho torna a guardar
	swapf	ValDC1B,w	; Agafa el valor que ha d'anar a DC1B
				; I el guarda, permutat, a W
				; Els dos bits han de quedar a les posicions 4-5
	andlw	b'00110000'	; Posa els altres sis bits a zero per precaució
	iorwf	ValCCP1CON,w	; I ho afegeix a CCP1CON
	movwf	CCP1CON		; Ho posa com a configuració del PWM
	movf	ValCCPR1L,w	; Valor de CCPR1L
	movwf	CCPR1L		; Registre que ens 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
	call	RetM		; Espera 0,2 s
	call	RetM		; Espera 0,2 s
	bsf	STATUS,RP0	; Tria el banc 1
	bsf	TRISC,5		; Posem RC5 (sortida del PWM) com a entrada
				; Fem silenci
	bcf	STATUS,RP0	; Tria el banc
	return
Sigrave
	movlw	.250		; Valor que correspon aproximadament a la nota
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.130		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	return
Do
	movlw	.238		; Valor que correspon aproximadament a la nota
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.119		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	return
Re
	movlw	.212		; Valor que correspon aproximadament a la nota
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.106		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	return
Reb
	movlw	.200		; Valor que correspon aproximadament a la nota
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.100		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	return
Mi
	movlw	.189		; Valor que correspon aproximadament a la nota
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.89		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	return
Mib
	movlw	.200		; Valor que correspon aproximadament a la nota
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.100		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	return
Fa
	movlw	.178		; Valor que correspon aproximadament a la nota
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.89		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	return
Fasost
	movlw	.168		; Valor que correspon aproximadament a la nota
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.84		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	return
Sol
	movlw	.158		; Valor que correspon aproximadament a la nota
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.79		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	return
La
	movlw	.141		; Valor que correspon aproximadament a la nota
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.71		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.0		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	return
Lab
	movlw	.149		; Valor que correspon aproximadament a la nota
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.75		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.0		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	return
Si
	movlw	.126		; Valor que correspon aproximadament a la nota
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.63		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	return
Sib
	movlw	.133		; Valor que correspon aproximadament a la nota
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.67		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.0		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	return
Doagud
	movlw	.118		; Valor que correspon aproximadament a la nota
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.59		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.0		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	return
Dosostagud
	movlw	.113		; Valor que correspon aproximadament a la nota
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.56		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.0		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	return
Reagud
	movlw	.107		; Valor que correspon aproximadament a la nota
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.53		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	return
Mibagudo
	movlw	.100		; Valor que correspon aproximadament a la nota
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.50		; Valor que correspon a un cicle del 50 %
	movwf	ValCCPR1L	; Valor de CCPR1L
	movlw	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	return
RetM				; Funció de retard de 0,2 s
	decfsz	Retard1,f
	goto	RetM
	decfsz	Retard2,f
	goto	RetM
	return
Miniret
	call	RetC
	call	RetC
	call	RetC
	call	RetC
	call	RetC
	call	RetC
	call	RetC
	call	RetC
	return
Miniret2
	call	Miniret
	call	Miniret
	call	Miniret
	call	Miniret
	call	Miniret
	call	Miniret
	call	Miniret
	return
RetC
	decfsz	Retard3,f
	goto	RetC
	return
	end

 

 

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