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 2

Aquest grup va plantejar quatre nivells de joc:

Nivell Colors Tirades Colors repetits Indicació de quins colors són encertats
1 5 3 No
2 7 5 No
3 7 5
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
Port			; Bits a enviar al port B
Compta			; Variable per comptar els bits
LED4			; Variable per comptar els cops que hem premut cada LED
LED3
LED2
LED1
VAR4			; Variables amb els colors aleatoris
VAR3
VAR2
VAR1
LEDact			; Variable per guardar el resultat a l'hora de comprar LED i VAR (variable auxiliar)
alet			; Variable per guardar el resultat de l'aleatori a l'hora de formar-lo (variable auxiliar)
Interm			; Variable equivalent a Sortida+1 però amb els monocroms encesos intermitents i fixes
Mode			; Variable per triar Mode de joc
Jugada			; Variable per comptar les tirades d'una partida
Comp			; Variable per comprovar si els 4 monocroms gros estan encesos
Rend			; Variable per a la rendició
Actual:2		; Variables per guardar el resultat que es mostra en els LED tricolor
			; Actual servirà per mostrar també el monocrom grocs fixos
punter:2		; punter per fer l'adreçament indirecte i marcar els LED
			; punter+1 per fer l'adreçament indirecte i marcar les VAR
Rand:2			; Dos bytes on guardarem el valor aleatori
Auxrand:2		; Variable auxiliar per a Random
Sortida:2		; Valors a enviar al registre de desplaçament
			; Sortida+1 correspon als bits del 8 al 15 i Sortida als bits del 0 al 7
			; Sortida+1				 	Sortida
			; R3 G3 B3 R2 G2 B2 R1 G1		B1 R0 G0 B0 M3 M2 M1 M0
Polsador		; Variable que conté un bit per a cada polsador per saber si està premut
Retard1			; Variables per al bucle de retard
Retard2
fix			; Comptador de colors encertats en la posició
nofix			; Comptador de colors encertats
Fix			; Variable amb els LED monocrom grocs encesos de manera continua
Tots			; Variable amb els LED monocrom grocs encesos tant de manera continua com intermitent
Ret1			; Variables de retard
Ret2
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
	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'00000100'
	movwf	ANSEL		; Posa AN2 com entrada analògica
	bcf	STATUS,RP0
	bcf	STATUS,RP1	; Tria el banc 0
	movlw	b'00001001'	; activa el conversor A/D connectat a AN2
	movwf	ADCON0		; amb el resultat justificat per l'esquerra
Reinici
	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
	clrf	PORTC		; Apaga els LED vermells
	clrf	LED4		; Posa a zero el comptador
	clrf	LED3		; Posa a zero el comptador
	clrf	LED2		; Posa a zero el comptador
	clrf	LED1		; Posa a zero el comptador
	clrf	Rend		; Posa a zero el comptador per a la Rendició
	clrf	Jugada		; Posa a zero el comptador de les jugades fetes
	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
	clrf	Sortida
	clrf	Sortida+1
	call	EnviaR16
	call	Rets
	call	Rets
	call	Rets
	call	Rets
	call	Rets
AZero
	movlw   b'00000001'	; Sempre que reiniciarem el joc o quan haguem arribat al 4 LED vermell, es començarà amb el primer LED
	movwf   Mode		
MJoc
	call	Rets
	movf	Mode,w
	movwf   PORTC
	btfsc   PORTA,3		; Mirem si s'ha premut el polsador, si no és el cas, mirem si toca començar la partida
	goto	Partida
	bcf	STATUS,C
	rlf	Mode,f		; Si s'havia premut el polsador encenem el següent LED (si és el 4t, tornem al 1r)
	btfsc   Mode,4
	goto	AZero
	goto	MJoc
Partida
	call	Rets
	call	Llegir		; Mirem si s'ha premut el primer polsador de la placa gran
	btfss	Polsador,4		
	goto	MJoc		; Si no s'ha premut continuem triant mode
	btfsc	Mode,0		; Mirem en quin mode ens trobem
	goto	Mode1
	btfsc	Mode,1		; Mirem en quin mode ens trobem
	goto	Mode2
	btfsc	Mode,2		; Mirem en quin mode ens trobem
	goto	Mode3
	btfsc	Mode,3		; Mirem en quin mode ens trobem
	goto	Mode4
Mode1
Aleatorinum11
	call	Random		; Cridem la funció Random per obtenir un valor aleatori
	movf	Rand,w		; Ho guardem a l'acumulador
	andlw   b'00000111'	; Ho multipliquem per tal d'agafar només els tres últims números que són els que ens interessen
	movwf   alet
	btfsc   STATUS,Z	; Comprovem que no siguin 0 tots tres, si ho són, agafem un altre número aleatori
	goto	Aleatorinum11
	movlw   b'00000110'
	xorwf	alet,w
	btfsc	STATUS,Z	; Comprovem que no sigui el color cian
	goto	Aleatorinum11
	movlw   b'00000111'
	xorwf	alet,w
	btfsc	STATUS,Z	; Comprovem que no sigui el color blanc
	goto	Aleatorinum11
	movf	alet,w
	movwf   VAR1		; Ho guardem a la variable1
Aleatorinum21
	call	Random
	movf	Rand,w
	andlw   b'00000111'
	movwf   alet
	btfsc   STATUS,Z
	goto	Aleatorinum21
	movf	alet,w
	xorwf   VAR1,w
	btfsc   STATUS,Z	; Comprovem que no sigui el mateix color que VAR1
	goto	Aleatorinum21
	movlw   b'00000110'
	xorwf	alet,w
	btfsc	STATUS,Z
	goto	Aleatorinum21
	movlw   b'00000111'
	xorwf	alet,w
	btfsc	STATUS,Z
	goto	Aleatorinum21
	movf	alet,w
	movwf   VAR2
Aleatorinum31
	call	Random
	movf	Rand,w
	andlw   b'00000111'
	movwf   alet
	btfsc   STATUS,Z
	goto	Aleatorinum31
	movf	alet,w
	xorwf   VAR1,w
	btfsc   STATUS,Z
	goto	Aleatorinum31
	movf	alet,w
	xorwf   VAR2,w
	btfsc   STATUS,Z
	goto	Aleatorinum31
	movlw   b'00000110'
	xorwf	alet,w
	btfsc	STATUS,Z
	goto	Aleatorinum31
	movlw   b'00000111'
	xorwf	alet,w
	btfsc	STATUS,Z
	goto	Aleatorinum31
	movf	alet,w
	movwf   VAR3
Aleatorinum41
	call	Random
	movf	Rand,w
	andlw   b'00000111'
	movwf   alet
	btfsc   STATUS,Z
	goto	Aleatorinum41
	movf	alet,w
	xorwf   VAR1,w
	btfsc   STATUS,Z
	goto	Aleatorinum41
	movf	alet,w
	xorwf   VAR2,w
	btfsc   STATUS,Z
	goto	Aleatorinum41
	movf	alet,w
	xorwf   VAR3,w
	btfsc   STATUS,Z
	goto	Aleatorinum41
	movlw   b'00000110'
	xorwf	alet,w
	btfsc	STATUS,Z
	goto	Aleatorinum41
	movlw   b'00000111'
	xorwf	alet,w
	btfsc	STATUS,Z
	goto	Aleatorinum41
	movf	alet,w
	movwf   VAR4
Bucle1
	call	Rets		
	call	Rendicio	; Cridem rendició per saber si s'ha donat l'ordre de rendir-se o no
	btfsc   Rend,0
	goto	Reinici
	movf	Jugada,w
	xorlw   b'00000011'	; Mirem que no sigui 4 (màxim 3 jugades)
	btfsc   STATUS,Z
	goto	Perdre		; Si era 4 se'ns han acabat les jugades 
	call	Llegir		; Llegeix els polsadors
	movf	Polsador,w
	xorlw	b'00010000'	; Mirem si s'ha premut l'1
	btfss	STATUS,Z	; Si és el 1, salta
	goto	si21		; No és l'1, mirem si es el 2
	incf	LED1,f		; Incrementa el valor del comptador
	movf	LED1,w
	xorlw	b'00000110'	; Si és 6 (límit 5 colors) el posem a zero
	btfsc	STATUS,Z
	clrf	LED1
	goto	Encendre1	; Encenem el LED tricolor
si21
	movf	Polsador,w
	xorlw	b'00001000'		
	btfss	STATUS,Z		
	goto	si31				
	incf	LED2,f			
	movf	LED2,w
	xorlw	b'00000110'
	btfsc	STATUS,Z
	clrf	LED2
	goto	Encendre1
si31
	movf	Polsador,w
	xorlw	b'00000100'	
	btfss	STATUS,Z	
	goto	si41	
	incf	LED3,f	
	movf	LED3,w
	xorlw	b'00000110'
	btfsc	STATUS,Z
	clrf	LED3
	goto	Encendre1
si41
	movf	Polsador,w
	xorlw	b'00000010'	
	btfss	STATUS,Z	
	goto	si51	
	incf	LED4,f
	movf	LED4,w
	xorlw	b'00000110'
	btfsc	STATUS,Z
	clrf	LED4
	goto	Encendre1
si51
	movlw   b'00000011'
	movwf   punter		; Posem punter a 3
	movf	Polsador,w
	xorlw	b'00000001'	; Mirem si s'ha premut el 5
	btfss	STATUS,Z	; Si és el 5, salta
	goto	Bucle1		; Si no s'ha premut tornem a Bucle1 per continuar mirant quin polsador és
	incf	Jugada,f	; Cada cop que torna al Bucle1, una nova jugada 
Comparar1
	movf	punter,w	
	movwf   punter+1	; Igualem punters
	movlw   LED4		; Copia la posició de la variable a l'acumulador
	addwf   punter,w	; Suma la variable(punter) amb l'acumulador i guarda el resultat a l'acumulador
	movwf   FSR		; Ho guarda al registre d'adreçament indirecte
	movf	INDF,w		; Guardem l'acumulador a l'adreça indirecta
	movwf   LEDact		; Copia el valor de l'acumulador a LEDact
	movlw   VAR4
	addwf   punter,w
	movwf   FSR
	movf	INDF,w
	xorwf   LEDact,w	; Funció exclusiva entre la variable i l'acumulador i guarda el resultat a l'acumulador
	btfsc   STATUS,Z	; Si no són iguals salta
	goto	Iguals1
Noiguals1
	movf	punter+1,w
	btfsc   STATUS,Z	; Mirem que punter+1 no sigui 0
	call	Restaurar1	; Si ho és el posarem a 4, per decrementar-lo just després
	decf	punter+1,f	; Decrementar punter+1
	movf	punter,w	; Copiem punter a l'acumulador
	xorwf   punter+1,w	; Comparem punter+1 i punter
	btfsc   STATUS,Z	; Si són diferents salta
	goto	Tornar1		; Si són iguals va a la funció tornar, hem fet tota la volta
				; Ara compararem variables
	movlw   LED4		; Copia la posició de la variable a l'acumulador
	addwf   punter,w	; Suma la variable(punter) amb l'acumulador i guarda el resultat a l'acumulador
	movwf   FSR				
	movf	INDF,w			
	movwf   LEDact			
	movlw   VAR4		
	addwf   punter+1,w	; En aquest cas sumem punter+1 
	movwf   FSR
	movf	INDF,w
	xorwf   LEDact,w	
	btfsc   STATUS,Z	
	goto	Intermitent1	; Si són iguals va Intermitent1 (no es repeteixen colors a la combinació)
	goto	Noiguals1	; si no ho són, continua comprovant
Tornar1 
	movf	punter,w
	btfsc   STATUS,Z	; Mirem que el comptador no sigui 0
	goto	Alterna1	; Si és 0 mostra
	decf	punter,f	; Sinó decrementa punter
	goto	Comparar1	; I tornem a comparar
Intermitent1
	movlw   LED4		; Tindrem en compte la possibilitat de colors repetits en la proposta de solució				
	addwf   punter+1,w		
	movwf   FSR				
	movf	INDF,w			
	movwf   LEDact			
	movlw   VAR4		
	addwf   punter+1,w
	movwf   FSR
	movf	INDF,w
	xorwf   LEDact,w	
	btfsc   STATUS,Z	
	goto	Tornar1			
	movlw   b'00000000'	; Encenem intermitentment el LED monocrom groc que toqui
	xorwf   punter,w
	btfsc   STATUS,Z
	bsf	Interm,0
	movlw   b'00000001'
	xorwf   punter,w
	btfsc   STATUS,Z
	bsf	Interm,1
	movlw   b'00000010'
	xorwf   punter,w
	btfsc   STATUS,Z
	bsf	Interm,2
	movlw   b'00000011'
	xorwf   punter,w
	btfsc   STATUS,Z
	bsf	Interm,3
	goto	Tornar1
Alterna1
	movf	Interm,w	; Copiar la variable Interm, que conté la posició dels LED de Sortida més el marcats, a l'acumulador
	movwf   Sortida		; Copiar Interm a Sortida
	movf	Actual+1,w	; El mateix per a Sortida+1
	movwf   Sortida+1
	call	EnviaR16
	call	Rets
	movf	Actual,w	; Copiar la variable actual, que conté la posició dels LED de Sortida, a l'acumulador
	movwf   Sortida		; Copiar Actual a Sortida
	movf	Actual+1,w	; El mateix per a Sortida+1
	movwf   Sortida+1
	call	EnviaR16	; Ho enviem als LED
	clrf	Comp
	call	Encerts		; Mirem si s'han encertat la combinació
	movlw   b'00001111'
	xorwf   Comp
	btfsc   STATUS,Z
	goto	Guanyar		; Anem a Guanyar
	call	Rets
	call	Llegir
	movf	Polsador,w
	btfsc   STATUS,Z	; Si no hi ha cap polsador premut, alternem, sinó anem al bucle
	goto	Alterna1
	goto	Bucle1
Iguals1						
	movf	punter,w
	xorlw   d'0'
	btfsc   STATUS,Z
	call	AC03		; Activa Actual i Interm segons el monocrom groc que toqui
	movf	punter,w
	xorlw   d'1'
	btfsc   STATUS,Z
	call	AC13
	movf	punter,w
	xorlw   d'2'
	btfsc   STATUS,Z
	call	AC23
	movf	punter,w
	xorlw   d'3'
	btfsc   STATUS,Z
	call	AC33
	movf	punter,w
	btfsc   STATUS,Z
	goto	Alterna1
	decf	punter,f
	goto	Comparar1	; Si no és 0, continuem comprovant
Encendre1
	movf	LED1,w		; Fem que mostri el LED1 movent els bits de LED a la sortida que pertoca
	movwf   Sortida
	bcf	STATUS,C
	rlf	Sortida, f	; Anem desplaçant de posició primer Sortida i després Sortida+1 perquè no es trepitgin
	rlf	Sortida+1,f	; En total ho farem tres vegades, per moure els tres bits de LED
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	movf	LED2,w
	iorwf   Sortida,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	movf	LED3,w
	iorwf   Sortida,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	movf	LED4,w
	iorwf   Sortida,f
	bcf	STATUS,C
	rlf	Sortida, f	; Aquest cop seran quatre, pels quatre monocroms grocs
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	movf	Sortida,w
	movwf   Actual		; Ho guardem a Actual, Actual+1 i Interm per tal que no se'ns esborri la informació 
	movf	Sortida,w
	movwf   Interm
	movf	Sortida+1,w
	movwf   Actual+1
	call	Rets		; Espera 1 s
	call	EnviaR16
	goto	Bucle1		; I repetim-ho...
Mode2
Aleatorinum1
	call	Random	
	movf	Rand,w	
	andlw   b'00000111' 
	btfsc   STATUS,Z	
	goto	Aleatorinum1
	movwf   VAR1	
Aleatorinum2
	call	Random
	movf	Rand,w
	andlw   b'00000111'
	movwf   alet
	btfsc   STATUS,Z
	goto	Aleatorinum2
	movf	alet,w
	xorwf   VAR1,w	
	btfsc   STATUS,Z
	goto	Aleatorinum2
	movf	alet,w
	movwf   VAR2
Aleatorinum3
	call	Random
	movf	Rand,w
	andlw   b'00000111'
	movwf   alet
	btfsc   STATUS,Z
	goto	Aleatorinum3
	movf	alet,w
	xorwf   VAR1,w	
	btfsc   STATUS,Z
	goto	Aleatorinum3
	movf	alet,w
	xorwf   VAR2,w	
	btfsc   STATUS,Z
	goto	Aleatorinum3
	movf	alet,w
	movwf   VAR3
Aleatorinum4
	call	Random
	movf	Rand,w
	andlw   b'00000111'
	movwf   alet
	btfsc   STATUS,Z
	goto	Aleatorinum4
	movf	alet,w
	xorwf   VAR1,w
	btfsc   STATUS,Z
	goto	Aleatorinum4
	movf	alet,w
	xorwf   VAR2,w
	btfsc   STATUS,Z
	goto	Aleatorinum4
	movf	alet,w
	xorwf   VAR3,w	
	btfsc   STATUS,Z
	goto	Aleatorinum4
	movf	alet,w
	movwf   VAR4
	goto Bucle3		; Bucle mode 2 i mode 3 són iguals pel que fa a Bucles de polsadors i verificació
Mode3
	call Aleatorinum13
	call Aleatorinum23
	call Aleatorinum33
	call Aleatorinum43
Bucle3				; Funcionament semblat al del mode 1
	call	Rets
	call	Rendicio
	btfsc   Rend,0
	goto	Reinici
	movf	Jugada,w
	xorlw   b'00000101'	; Mirem que no sigui 6 (màxim 5 jugades)
	btfsc   STATUS,Z
	goto	Perdre				
	call	Llegir		
	movf	Polsador,w
	xorlw	b'00010000'	
	btfss	STATUS,Z	
	goto	si23	
	incf	LED1,f	
	movf	LED1,w
	xorlw	b'00001000'	; Límit del comptador a 8, disposarem de 7 colors
	btfsc	STATUS,Z
	clrf	LED1
	goto	Encendre3
si23
	movf	Polsador,w
	xorlw	b'00001000'	
	btfss	STATUS,Z	
	goto	si33	
	incf	LED2,f	
	movf	LED2,w
	xorlw	b'00001000'
	btfsc	STATUS,Z
	clrf	LED2
	goto	Encendre3
si33
	movf	Polsador,w
	xorlw	b'00000100'	
	btfss	STATUS,Z	
	goto	si43	
	incf	LED3,f	
	movf	LED3,w
	xorlw	b'00001000'
	btfsc	STATUS,Z
	clrf	LED3
	goto	Encendre3
si43
	movf	Polsador,w
	xorlw	b'00000010'	
	btfss	STATUS,Z	
	goto	si53	
	incf	LED4,f	
	movf	LED4,w
	xorlw	b'00001000'
	btfsc	STATUS,Z
	clrf	LED4
	goto	Encendre3
si53
	movlw   b'00000011'
	movwf   punter	
	movf	Polsador,w
	xorlw	b'00000001'	
	btfss	STATUS,Z	
	goto	Bucle3
	incf	Jugada,f  
Comparar3
	movf	punter,w	
	movwf   punter+1	
	movlw   LED4		
	addwf   punter,w	
	movwf   FSR		
	movf	INDF,w	
	movwf   LEDact	
	movlw   VAR4
	addwf   punter,w
	movwf   FSR
	movf	INDF,w
	xorwf   LEDact,w 
	btfsc   STATUS,Z 
	goto	Iguals3
Noiguals3
	movf	punter+1,w
	btfsc   STATUS,Z	
	call	Restaurar3  
	decf	punter+1,f  
	movf	punter,w   
	xorwf   punter+1,w  
	btfsc   STATUS,Z	
	goto	Tornar3	
	movlw   LED4		
	addwf   punter,w	
	movwf   FSR		
	movf	INDF,w	
	movwf   LEDact	
	movlw   VAR4		
	addwf   punter+1,w
	movwf   FSR
	movf	INDF,w
	xorwf   LEDact,w	
	btfsc   STATUS,Z	
	goto	Intermitent3 
	goto	Noiguals3	
Tornar3
	movf	punter,w
	btfsc   STATUS,Z  
	goto	Alterna3	
	decf	punter,f   
	goto	Comparar3	
Intermitent3
	movlw   LED4		
	addwf   punter+1,w	
	movwf   FSR		
	movf	INDF,w	
	movwf   LEDact	
	movlw   VAR4		
	addwf   punter+1,w
	movwf   FSR
	movf	INDF,w
	xorwf   LEDact,w	
	btfsc   STATUS,Z	
	goto	Tornar3	
	movlw   b'00000000'	
	xorwf   punter,w
	btfsc   STATUS,Z
	bsf	Interm,0
	movlw   b'00000001'
	xorwf   punter,w
	btfsc   STATUS,Z
	bsf	Interm,1
	movlw   b'00000010'
	xorwf   punter,w
	btfsc   STATUS,Z
	bsf	Interm,2
	movlw   b'00000011'
	xorwf   punter,w
	btfsc   STATUS,Z
	bsf	Interm,3
	goto	Tornar3
Alterna3
	movf	Interm,w			
	movwf   Sortida			
	movf	Actual+1,w		
	movwf   Sortida+1
	call	EnviaR16
	call	Rets
	movf	Actual,w			
	movwf   Sortida			
	movf	Actual+1,w		
	movwf   Sortida+1
	call	EnviaR16			
	clrf	Comp
	call	Encerts
	movlw   b'00001111'
	xorwf   Comp
	btfsc   STATUS,Z
	goto	Guanyar	
	call	Rets
	call	Llegir
	movf	Polsador,w
	btfsc   STATUS,Z			
	goto	Alterna3
	goto	Bucle3
Iguals3
	movf	punter,w
	xorlw   d'0'
	btfsc   STATUS,Z
	call	AC03
	movf	punter,w
	xorlw   d'1'
	btfsc   STATUS,Z
	call	AC13
	movf	punter,w
	xorlw   d'2'
	btfsc   STATUS,Z
	call	AC23
	movf	punter,w
	xorlw   d'3'
	btfsc   STATUS,Z
	call	AC33
	movf	punter,w
	btfsc   STATUS,Z
	goto	Alterna3
	decf	punter,f
	goto	Comparar3			
Encendre3
	movf	LED1,w	
	movwf   Sortida
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	movf	LED2,w
	iorwf   Sortida,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	movf	LED3,w
	iorwf   Sortida,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	movf	LED4,w
	iorwf   Sortida,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	movf	Sortida,w
	movwf   Actual
	movf	Sortida,w
	movwf   Interm
	movf	Sortida+1,w
	movwf   Actual+1
	call	Rets		
	call	EnviaR16
	goto	Bucle3		
Mode4
	call Aleatorinum13	; El mode 4 té una combinació de 7 colors amb la opció de repetir-ne, per tant és com el mode 3
	call Aleatorinum23
	call Aleatorinum33
	call Aleatorinum43
Bucle4 
	call	Rets
	call	Rendicio
	btfsc   Rend,0
	goto	Reinici
	movf	Jugada,w
	xorlw   b'00001010'	; Mirem que no sigui 11 (màxim 10 jugades)
	btfsc   STATUS,Z
	goto	Perdre	
	call	Llegir		
	movf	Polsador,w
	xorlw	b'00010000'	
	btfss	STATUS,Z	
	goto	si24	
	incf	LED1,f	
	movf	LED1,w
	xorlw	b'00001000'
	btfsc	STATUS,Z
	clrf	LED1
	goto	Encendre4
si24
	movf	Polsador,w
	xorlw	b'00001000'	
	btfss	STATUS,Z	
	goto	si34	
	incf	LED2,f	
	movf	LED2,w
	xorlw	b'00001000'
	btfsc	STATUS,Z
	clrf	LED2
	goto	Encendre4
si34
	movf	Polsador,w
	xorlw	b'00000100'	
	btfss	STATUS,Z	
	goto	si44	
	incf	LED3,f	
	movf	LED3,w
	xorlw	b'00001000'
	btfsc	STATUS,Z
	clrf	LED3
	goto	Encendre4
si44
	movf	Polsador,w
	xorlw	b'00000010'	
	btfss	STATUS,Z	
	goto	si54	
	incf	LED4,f	
	movf	LED4,w
	xorlw	b'00001000'
	btfsc	STATUS,Z
	clrf	LED4
	goto	Encendre4
si54
	clrf	fix		; Posem a 0 fix, que serà el comptador de LED correctes
	clrf	nofix		; Posem a 0 nofix, que serà el comptador de LED amb el color correte i la posició incorrecta
	movlw   b'00000000'		
	movwf   Fix		; Posem Fix a zero
	movlw   b'00000000'		
	movwf   Tots		; Posem Tots a zero	
	movlw   b'00000011'
	movwf   punter		; Posem punter a 3
	movf	Polsador,w
	xorlw	b'00000001'	; Mirem si s'ha premut el 5
	btfss	STATUS,Z	; Si és el 5, salta
	goto	Bucle4
	incf	Jugada,f	; Cada cop que torna al Bucle, una nova jugada 
Comparar4			; Essencialment la comprovació és similar a la dels altres modes
	movf	punter,w	
	movwf   punter+1	
	movlw   LED4		
	addwf   punter,w	
	movwf   FSR		
	movf	INDF,w	
	movwf   LEDact	
	movlw   VAR4
	addwf   punter,w
	movwf   FSR
	movf	INDF,w
	xorwf   LEDact,w 
	btfsc   STATUS,Z 
	goto	Iguals4
Noiguals4
	movf	punter+1,w
	btfsc   STATUS,Z	
	call	Restaurar4  
	decf	punter+1,f  
	movf	punter,w	
	xorwf   punter+1,w  
	btfsc   STATUS,Z	
	goto	Tornar4	
	movlw   LED4		
	addwf   punter,w	
	movwf   FSR		
	movf	INDF,w	
	movwf   LEDact	
	movlw   VAR4		
	addwf   punter+1,w
	movwf   FSR
	movf	INDF,w
	xorwf   LEDact,w	
	btfsc   STATUS,Z	
	goto	Intermitent4 
	goto	Noiguals4	
Tornar4
	movf	punter,w
	btfsc   STATUS,Z  
	goto	Alterna4	
	decf	punter,f   
	goto	Comparar4	
Intermitent4
	movlw   LED4		
	addwf   punter+1,w  
	movwf   FSR		
	movf	INDF,w	
	movwf   LEDact	
	movlw   VAR4		
	addwf   punter+1,w
	movwf   FSR
	movf	INDF,w
	xorwf   LEDact,w	
	btfsc   STATUS,Z	
	goto	Tornar4	
	incf	nofix,f		; Incrementem el comptador corresponent als colors encertats amb posició incorrecta
	bsf	STATUS,C	; Posem els bits d'entrada a 1 per tal que poguem assegurar que entrem un 1
	rlf	Tots, f		; Movem un bit cap a la dreta a Tots (entrarà un 1)
	goto	Tornar4
Alterna4
	movf	fix,w		; Copiem fix a l'acumulador
	xorlw   d'1'		; El comparem amb 1
	btfsc   STATUS,Z	; Si no és 1, salta
	call	F34
	movf	fix,w		; Copiem fix a l'acumulador
	xorlw   d'2'		; El comparem amb 2
	btfsc   STATUS,Z	; Si no és 2, salta
	call	F24
	movf	fix,w		; Copiem fix a l'acumulador
	xorlw   d'3'		; El comparem amb 3
	btfsc   STATUS,Z	; Si no és 3, salta
	call	F14
	movf	fix,w
	addwf   nofix,f		; COMPTE! ara nofix és la suma de fix i nofix (màxim 4)
	movf	nofix,w		; Copiem nofix a l'acumulador i fem el mateix que en el cas anterior
	xorlw   d'1'				
	btfsc   STATUS,Z			
	call	NF34
	movf	nofix,w			
	xorlw   d'2'				
	btfsc   STATUS,Z			
	call	NF24
	movf	nofix,w			
	xorlw   d'3'				
	btfsc   STATUS,Z			
	call	NF14
	movf	Fix,w		; Copiem Fix a l'acumulador
	andlw   b'00001111'	; Seleccionem només els 4 últims bits (els altres quedaran a 0)
	addwf   Actual,f	; Sumem Actual i acumulador i ho guardem a Actual
	movf	Tots,w		; Copiem Tots a l'acumulador
	andlw   b'00001111'	; Seleccionem només els 4 últims bits (els altres quedaran a 0)
	addwf   Interm,f	; Sumem Actual i acumulador i ho guardem a Interm
Encen
	movf	Interm,w				
	movwf   Sortida				
	movf	Actual+1,w				
	movwf   Sortida+1
	call	EnviaR16
	call	Rets
	movf	Actual,w			
	movwf   Sortida			
	movf	Actual+1,w		
	movwf   Sortida+1
	call	EnviaR16			
	clrf	Comp
	call	Encerts
	movlw   b'00001111'
	xorwf   Comp
	btfsc   STATUS,Z
	goto	Guanyar	
	call	Rets
	call	Llegir
	movf	Polsador,w
	btfsc   STATUS,Z			
	goto	Encen
	goto	Bucle4
Iguals4
	incf	fix,f		; Incrementem el comptador dels LED totalment correctes
	bsf	STATUS,C	; Posem tots els bits d'entrada a 1
	rlf	Tots, f		; Entra un 1 per la dreta
	bsf	STATUS,C
	rlf	Fix, f
	goto	Tornar4
Encendre4
	movf	LED1,w	
	movwf   Sortida
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	movf	LED2,w
	iorwf   Sortida,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	movf	LED3,w
	iorwf   Sortida,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	movf	LED4,w
	iorwf   Sortida,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	movf	Sortida,w
	movwf   Actual
	movf	Sortida,w
	movwf   Interm
	movf	Sortida+1,w
	movwf   Actual+1
	call	Rets		
	call	EnviaR16
	goto	Bucle4		
Perdre				; Toca la música de perdre
	call	MostrarAleatori ; I mostra l'aleatori
	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	TocaCorxera	; 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	TocaCorxera	; Toca la nota configurada
	movlw	.118		; Valor que correspon aproximadament a do3
	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	TocaCorxeraPunt ; Toca la nota configurada
	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	TocaSemi	; Toca la nota configurada
	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	TocaNegra	; 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	TocaCorxera	; 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	TocaCorxera	; Toca la nota configurada
	movlw	.149		; Valor que correspon aproximadament a lab3
	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	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaCorxera	; Toca la nota configurada
	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	TocaSemi	; 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	TocaSemi	; Toca la nota configurada
	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	TocaNegra	; 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	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaCorxera	; 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	TocaCorxera	; Toca la nota configurada
	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	TocaCorxera	; 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	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaSemi	; Toca la nota configurada
	movlw	.133		; Valor que correspon aproximadament a sib4
	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	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaSemi	; 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	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaNegra	; Toca la nota configurada
	movlw	.133		; Valor que correspon aproximadament a sib4
	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	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaCorxera	; Toca la nota configurada
	movlw	.149		; Valor que correspon aproximadament a lab4
	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	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaCorxera	; Toca la nota configurada
	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	TocaCorxera	; Toca la nota configurada
	movlw	.200		; Valor que correspon aproximadament a mib3
	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
	call	TocaSemi	; Toca la nota configurada
	movlw	.212		; Valor que correspon aproximadament a re3
	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
	call	TocaSemi	; Toca la nota configurada
	movlw	.238		; Valor que correspon aproximadament a do3
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.19		; 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	TocaNegra	; Toca la nota configurada
	goto	Reinici
Guanyar
	movlw	.238		; Valor que correspon aproximadament a do3
	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
	call	TocaCorxera	; Toca la nota configurada
	movlw	.224		; Valor que correspon aproximadament a reb3
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.112		; 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	TocaCorxera	; Toca la nota configurada
	movlw	.200		; Valor que correspon aproximadament a mib3
	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
	call	TocaCorxeraPunt	; Toca la nota configurada
	movlw	.149		; Valor que correspon aproximadament a lab3
	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	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaSemi	; Toca la nota configurada
	movlw	.149		; Valor que correspon aproximadament a lab3
	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	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaNegra	; Toca la nota configurada
	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	TocaCorxera	; 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	TocaCorxera	; Toca la nota configurada
	movlw	.224		; Valor que correspon aproximadament a reb3
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.112		; 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	TocaCorxera	; Toca la nota configurada
	movlw	.200		; Valor que correspon aproximadament a mib3
	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
	call	TocaSemi	; 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	TocaSemi	; Toca la nota configurada
	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	TocaNegra	; Toca la nota configurada
	movlw	.238		; Valor que correspon aproximadament a do3
	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
	call	TocaCorxera	; Toca la nota configurada
	movlw	.224		; Valor que correspon aproximadament a reb3
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.112		; 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	TocaCorxera	; Toca la nota configurada
	movlw	.200		; Valor que correspon aproximadament a mib3
	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
	call	TocaCorxera	; Toca la nota configurada
	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	TocaSemi	; Toca la nota configurada
	movlw	.149		; Valor que correspon aproximadament a lab3
	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	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaSemi	; Toca la nota configurada
	movlw	.133		; Valor que correspon aproximadament a sib3
	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	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaNegra	; Toca la nota configurada
	movlw	.149		; Valor que correspon aproximadament a lab3
	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	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaCorxera	; Toca la nota configurada
	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	TocaCorxera	; Toca la nota configurada
	movlw	.200		; Valor que correspon aproximadament a mib3
	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
	call	TocaCorxera	; 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	TocaSemi	; Toca la nota configurada
	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	TocaSemi	; Toca la nota configurada
	movlw	.149		; Valor que correspon aproximadament a lab3
	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	.2		; Valor dels bits de menys pes del CCP
	movwf	ValDC1B		; Valor de DC1B
	call	TocaNegra	; Toca la nota configurada
	goto	Reinici
Restaurar1
	movlw   b'00000100'
	movwf   punter+1	; Posem punter+1 a 4
	return
Restaurar3
	movlw   b'00000100'
	movwf   punter+1	
	return
Restaurar4
	movlw   b'00000100'
	movwf   punter+1	
	return
AC03
	bsf	Actual,0
	bsf	Interm,0
	return
AC13
	bsf	Actual,1
	bsf	Interm,1
	return
AC23
	bsf	Actual,2
	bsf	Interm,2
	return
AC33
	bsf	Actual,3
	bsf	Interm,3
	return
NF14
	bcf	STATUS,C	; Posem a 0 tots els bits d'entrada
	rlf	Tots, f		; Correm un bit cap a la dreta i entra un 0
	return
NF24
	bcf	STATUS,C
	rlf	Tots, f
	bcf	STATUS,C
	rlf	Tots, f
	return
NF34
	bcf	STATUS,C
	rlf	Tots, f
	bcf	STATUS,C
	rlf	Tots, f
	bcf	STATUS,C
	rlf	Tots, f
	return
F14
	bcf	STATUS,C
	rlf	Fix, f
	return
F24
	bcf	STATUS,C
	rlf	Fix, f
	bcf	STATUS,C
	rlf	Fix, f
	return
F34
	bcf	STATUS,C
	rlf	Fix, f
	bcf	STATUS,C
	rlf	Fix, f
	bcf	STATUS,C
	rlf	Fix, f
	return
Encerts				; Mira si s'han encertat la combinació
	movf	Actual,w	; Agafem Actual que conté els LED monocrom encesos de manera fixa
	andlw   b'00001111'	; Concretament agafem els 4 últims bits que són els dels LED monocrom
	movwf   Comp		; Ho guardem a Comp
	return
Aleatorinum13
	call	Random		; Cridem la funció Random per obtenir un valor aleatori
	movf	Rand,w		; Ho guardem a l'acumulador
	andlw   b'00000111'	; Ho multipliquem per tal d'agafar només els tres últims números que són els que ens interessen
	movwf   alet
	btfsc   STATUS,Z	; Comprovem que no siguin 0 tots tres, si ho són, agafem un altre número aleatori
	goto	Aleatorinum13
	movf	alet,w
	movwf   VAR1		; Ho guardem a la variable1
	return
Aleatorinum23
	call	Random	
	movf	Rand,w	
	andlw   b'00000111' 
	movwf   alet	
	btfsc   STATUS,Z	
	goto	Aleatorinum23
	movf	alet,w
	movwf   VAR2
	return
Aleatorinum33
	call	Random
	movf	Rand,w
	andlw   b'00000111'
	movwf   alet
	btfsc   STATUS,Z
	goto	Aleatorinum33
	movf	alet,w
	movwf   VAR3
	return
Aleatorinum43
	call	Random
	movf	Rand,w
	andlw   b'00000111'
	movwf   alet
	btfsc   STATUS,Z
	goto	Aleatorinum43
	movf	alet,w
	movwf   VAR4
	return
MostrarAleatori
	incf	Rend,f		; Incrementa la variable Rend
	movf	VAR1,w
	movwf   Sortida
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	movf	VAR2,w
	iorwf   Sortida,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	movf	VAR3,w
	iorwf   Sortida,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	movf	VAR4,w
	iorwf   Sortida,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	bcf	STATUS,C
	rlf	Sortida, f
	rlf	Sortida+1,f
	call	Rets		
	call	EnviaR16
	call	Rets
	call	Rets
	call	Rets
	call	Rets
	call	Rets
	return
Rendicio
	btfsc   PORTA,3		; Mirem si s'ha premut el polsador de la placa verda
	return			; Si no és el cas, ja està				
	call	MostrarAleatori	; Si s'ha premut, mostra l'aleatori
				; Toca música
	movlw	.212		; Valor que correspon aproximadament a re3
	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
	call	TocaCorxera	; Toca la nota configurada
	movlw	.224		; Valor que correspon aproximadament a reb3
	movwf	ValPR2		; Ho posem com a valor de PR2
	movlw	.112		; 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	TocaCorxera	; Toca la nota configurada
	movlw	.238		; Valor que correspon aproximadament a do3
	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
	call	TocaCorxera	; Toca la nota configurada
	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ó P5
	movlw	.220		; Límit superior de P5
	subwf	ADRESH,w	; W = ADRESH - W
	btfsc	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP5		; ADRESH >= W
	movlw	.200		; 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'00000001'	; Polsador P5
	movwf	Polsador	; Ho copia a Polsador
	goto	NoP1
NoP5				; Comparació P4
	movlw	.194		; Límit superior de P4
	subwf	ADRESH,w	; W = ADRESH - W
	btfsc	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP4		; ADRESH >= W
	movlw	.174		; 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'00000010'	; Polsador P4
	movwf	Polsador	; Ho copia a Polsador
	goto	NoP1
NoP4				; 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	NoP1
NoP3				; Comparació P2
	movlw	.90		; Límit superior de P2
	subwf	ADRESH,w	; W = ADRESH - W
	btfsc	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP2		; ADRESH >= W
	movlw	.70		; 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'00001000'	; Polsador P2
	movwf	Polsador	; Ho copia a Polsador
	goto	NoP1
NoP2				; Comparació P1
	movlw	.55		; Límit superior de P1
	subwf	ADRESH,w	; W = ADRESH - W
	btfsc	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP1		; ADRESH >= W
	movlw	.35		; 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'00010000'	; Polsador P1
	movwf	Polsador	; Ho copia a Polsador
NoP1
	return
Rets				; Funció de retard de 0,2 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
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  
TocaSemi
	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	.104
	call	Retm		; 
	movlw	.52
	call	Retm		; Espera 0,12 segons en total
	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	.52		; Silenci de 40 ms
	call	Retm
	return
TocaCorxera
	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	.208
	call	Retm
	movlw	.104
	call	Retm		; Espera 0,24 segons en total
	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	.52		; Silenci de 40 ms
	call	Retm
	return
TocaCorxeraPunt
	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	.208
	call	Retm
	movlw	.208
	call	Retm
	movlw	.52
	call	Retm		; Espera 0,36 segons en total
	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	.52			
	call	Retm		; Silenci de 40 ms
	return
TocaNegra
	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	.208
	call	Retm
	movlw	.208
	call	Retm
	movlw	.208			
	call	Retm		; Esperem 0,48 segons en total
	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	.52
	call	Retm		; Silenci de 40 ms
	return
Retm				; Funció de retard de milisegons
	movwf	Ret2
Bucles2
	decfsz	Ret1,f
	goto	Bucles2
	decfsz	Ret2,f
	goto	Bucles2
	return
	end

 

 

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