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 1

Aquest grup va plantejar tres nivells de joc predeterminats però també l'opció de fer-se el joc a mida. El següent gràfic mostra la seqüència que permet, amb els cinc polsadors, seleccionar els paràmetres del joc.

Selecció de modes de joc

Els nivells predeterminats són:

Nivell Colors Tirades
1 5 8
2 7 i apagat 6
3 7 i apagat 4

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
Polsador        	; Variable que cont un bit per a cada polsador per saber si està premut
Retard1         	; Variable per al bucle de retard
Retard2         	; Variable per al bucle de retard
Retard3         	; Variable per al bucle de retard
Port            	; Variable interna de la funció EnviaR16
Sortida:2       	; Variable on es guarda la combinació per la funció EnviaR16
Compta          	; Variable per comptar els bits a la funció EnviaR16
C1              	; Comptador del color del polsador 1
C2              	; Comptador del color del polsador 2
C3              	; Comptador del color del polsador 3
C4              	; Comptador del color del polsador 4
Co1             	; Color secret LED 1
Co2             	; Color secret LED 2
Co3:2           	; Color secret LED 3
Co4             	; Color secret LED 4
D1              	; Color del LED 1
D2              	; Color del LED 2
D3:2            	; Color del LED 3
D4              	; Color del LED 4
Comprova        	; Variable per distingir tots els modes de joc
Tirades        		; Comptador de les tirades durant la partida
ComptaReg       	; Comptador usat per l'adregament indirecte
So:2            	; Variable on fem els canvis de Sortida
Encerts         	; Variable per comprovar que es compleixen els dos bytes del tercer LED
Rand:2          	; Dos bytes on guardarem el valor aleatori
Auxrand:2       	; Variable auxiliar per a Random
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
Blanca          	; Diferents durades de notes
Negra
corpunto
semicor
cor
negrapunto
Visualita       	; Variable on guardem el que mostraran els LED
Visualit
CTirades        	; Nombre màxim de tirades de la partida
Conf            	; Variable on s'emmagatzema la configuració de la partida anterior
Colorins1       	; Variables per crear un color aleatori
Colorins2
Colorins3
Colorins4
CuantosColorins 	; Nmero de colors desitjats
ColorinsN       	; Valor del nombre aleatori
	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 resistncies 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 freqncia
    movlw   b'00100000'     	; Definim com volem les E/S del port C
    movwf   TRISC           	; RC5 (sortida del PWM) com a entrada
    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'00001000'     	; Activa el bit 3
    movwf   Visualit        	; Ho copia sobre la variable Visualit
    clrf    PORTC           	; Apaga els LED
    movlw   .10             	; Retard de 2 s
    call    Rets
    btfsc   PORTA,3         	; Mira si està desactivada l'entrada A3
                            	; Si està desactivada, no fa la instrucció segent
                            	; Fa la instrucció si l'entrada està activada
    goto    $-1             	; Si no està premut, espera
    btfss   PORTA,3         	; Mira si està activada l'entrada A3
                            	; Si està activada, no fa la instrucció segent
                            	; Fa la instrucció si l'entrada està desactivada
    goto    $-1             	; Si està premut, espera
    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
    movlw   b'00001001'     	; Activa el conversor A/D connectat a AN2
    movwf   ADCON0          	; Amb el resultat justificat per l'esquerra
    clrf    So
    clrf    So+1
    movf    So,w            	; Copia els valors de So i So+1 a Sortida i Sortida+1 perqu volem que inicialment siguin iguals
    movwf   Sortida
    movf    So+1,w
    movwf   Sortida+1       
    call    EnviaR16        	; Ho envia al registre per a que tots els LED estiguin apagats inicialmente
    movlw   Tirades		; Començament de Repe per a posar totems les variables a zero
    movwf   FSR
    movlw   .16
    movwf   ComptaReg
    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
Repe				; Inicialitza les variables a zero
    clrf    INDF
    decf    FSR,f
    decfsz  ComptaReg
    goto    Repe
    movlw   .6			; Es guarden les diferents durades de les notes
    movwf   Blanca
    movlw   .3
    movwf   Negra
    movlw   .1
    movwf   semicor
    movlw   .2
    movwf   corpunto
    movlw   .5
    movwf   negrapunto
    movlw   .2
    movwf   cor
ModeJoc
    call    Llegir          	; Llegeix els polsadors
    movf    Polsador,w
    xorlw   b'00010000'     	; Mira si s'ha premut el 5 
    btfsc   STATUS,Z        	; Si és el 5, va a Salta
    goto    Salta
    movf    Polsador,w
    xorlw   b'00000100'     	; Mira si s'ha premut el 3
    btfsc   STATUS,Z        	; Si és el 3, va a Mode1
    goto    Mode1
    movf    Polsador,w
    xorlw   b'00000010'     	; Mira si s'ha premut el 2
    btfsc   STATUS,Z        	; Si és el 2, va a Mode2
    goto    Mode2
    movf   Polsador,w
    xorlw   b'00000001'     	; Mira si s'ha premut el 1
    btfsc   STATUS,Z        	; Si és el 1, va a Mode3
    goto    Mode3
    movf    Polsador,w
    xorlw   b'00001000'     	; Mira si s'ha premut el 4
    btfss   STATUS,Z        	; Si és el 4, va a ModeJoc
    goto    ModeJoc
    call    Potenciometre	; Guarda el valor del potenciòmetre a Visualita
    movlw   b'11100000'		; SUencén el primer LED en blanc
    movwf   Sortida+1
    call    EnviaR16
    movf    Visualita,w		; Guarda el valor de Visualita a CTirades
    movwf   CTirades
    call    RetM
    call    Potenciometre	; Guarda el valor del potenciòmetre a Visualita
    movlw   b'11111100'		; SUencén el segon LED en blanc
    movwf   Sortida+1
    call    EnviaR16
    movf    Visualita,w	      
    xorlw   .1    	      	; Compara Visualita amb 1
    btfsc   STATUS,Z          	; Si són iguals, activa el bit quatre  de Comprova
    bsf     Comprova,4       	; Si està activat, no sona el brunzidor
    call    RetM
    call    Potenciometre	; Guarda el valor del potenciòmetre a Visualita
    movlw   b'11111111'		; SUencén el tercer LED en blanc
    movwf   Sortida+1
    movlw   b'10000000'
    movwf   Sortida
    call    EnviaR16
    movf    Visualita,w
    xorlw   .1    	   	; Compara Visualita amb 1
    btfsc   STATUS,Z       	; Si són iguals, activa el bit tres de Comprova
    bsf     Comprova,3		; Si està activat, inicia el mode multijugador i no va a aleatori
    call    RetM
    call    Potenciometre	; Guarda el valor del potenciòmetre a Visualita
    movlw   b'11111111'		; SUencén el quart LED en blanc
    movwf   Sortida+1
    movlw   b'11110000'
    movwf   Sortida
    call    EnviaR16
    movf    Visualita,w 	
    xorlw   .4   		; Compara Visualita amb 4
    btfsc   STATUS,Z       	; Si són iguals, va a Colors4 
    goto    Colors4  		
    movf    Visualita,w 	
    xorlw   .5    		; Compara Visualita amb 5
    btfsc   STATUS,Z       	; Si són iguals, va a Colors5
    goto    Colors5  		
    movf    Visualita,w 	
    xorlw   .6    		; Compara Visualita amb 6
    btfsc   STATUS,Z       	; Si són iguals, va a Colors6
    goto    Colors6  		
    movf    Visualita,w 	
    xorlw   .7    		; Compara Visualita amb 7
    btfsc   STATUS,Z       	; Si són iguals, va a Colors7
    goto    Colors7  		
    movf    Visualita,w 	
    xorlw   .8    		; Compara Visualita amb 8
    btfsc   STATUS,Z       	; Si són iguals, va a Colors8
    goto    Colors8  		
    goto    Bucle
Salta				; Manté la configuració de l'última partida
    clrf    So
    clrf    So+1
    call    EnviaR16		; Apaga tots els LED
    movf    Conf,w
    movwf   Comprova		; Guarda la configuració de la partida anterior a Comprova
    btfsc   Comprova,3		; Si el bit corresponent al mode multijugador està activat sUinicia la partida
    goto    Bucle
    btfsc   Comprova,0		; Sinó, va a l'aleatori corresponent
    goto    Colors4
    btfsc   Comprova,1
    goto    Colors5
    btfsc   Comprova,2
    goto    Colors6
    btfsc   Comprova,5
    goto    Colors7
    goto    Colors8
Mode1                           ; Mode amb 8 tirades i 5 colors
    movlw   b'00001000'
    movwf   CTirades
    goto    Colors5
Mode2                           ; Mode amb 6 tirades i 8 colors
    movlw   b'00000110'
    movwf   CTirades
    bsf     Comprova,4
    goto    Colors8
Mode3                           ; Mode amb 4 tirades i 8 colors
    movlw   b'00000100'
    movwf   CTirades
    bsf     Comprova,4
    goto    Colors8
Colors8				; Tots els colors possibles 
    btfsc   Comprova,3		; Comprova si està activat el bit corresponent al mode multijugador
    goto    Bucle		; Si està activat inicia la partida
    movlw   b'00001000'		; Indica el nmero de colors (8)
    call    RandomN		; Crida a la funció que genera un nmero aleatorique no supera el 7
    movwf   Colorins1		; Guarda el resultat a Colorins1
				; Repeteix la mateixa operació amb Colorins2,3 i 4
    movlw   b'00001000'
    call    RandomN		
    movwf   Colorins2
    movlw   b'00001000'
    call    RandomN	
    movwf   Colorins3
    movlw   b'00001000'
    call    RandomN
    movwf   Colorins4
    movf    Comprova,w		; Guarda la Configuració a Conf
    movwf   Conf
    goto    Aleatori		; Ho envia a Aleatori
Colors4
    bsf     Comprova,0		; Activa el bit 0 de Comprova que després limita els colors dels LED a lUhora dUescollir-los
    btfsc   Comprova,3		; Comprova si està activat el bit corresponent al mode multijugador
    goto    Bucle		; Si està activat inicia la partida
    movlw   b'00000100'		; Indica el nmero de colors (4)
    call    RandomN		; Crida a la funció que genera un nmero aleatorique no supera el 7
    movwf   Colorins1		; Guarda el resultat a Colorins1
				; Repeteix la mateixa operació amb Colorins2,3 i 4
    movlw   b'00000100'
    call    RandomN
    movwf   Colorins2
    movlw   b'00000100'
    call    RandomN
    movwf   Colorins3
    movlw   b'00000100'
    call    RandomN
    movwf   Colorins4
    movf    Comprova,w		; Guarda la Configuració a Conf
    movwf   Conf
    goto    Aleatori		; Ho envia a Aleatori
Colors5
    bsf     Comprova,1		; Activa el bit 1 de Comprova que després limita els colors dels LED a lUhora dUescollir-los
    btfsc   Comprova,3		; Comprova si està activat el bit corresponent al mode multijugador
    goto    Bucle		; Si està activat inicia la partida
    movlw   b'00000101'		; Indica el nmero de colors (5)
    call    RandomN		; Crida a la funció que genera un nmero aleatorique no supera el 7
    movwf   Colorins1		; Guarda el resultat a Colorins1
				; Repeteix la mateixa operació amb Colorins2,3 i 4
    movlw   b'00000101'
    call    RandomN
    movwf   Colorins2
    movlw   b'00000101'
    call    RandomN
    movwf   Colorins3
    movlw   b'00000101'
    call    RandomN
    movwf   Colorins4
    movf    Comprova,w		; Guarda la Configuració a Conf
    movwf   Conf
    goto    Aleatori		; Ho envia a Aleatori
Colors6
    bsf     Comprova,2		; Activa el bit 2 de Comprova que després limita els colors dels LED a lUhora dUescollir-los
    btfsc   Comprova,3		; Comprova si està activat el bit corresponent al mode multijugador
    goto    Bucle		; Si està activat inicia la partida
    movlw   b'00000110'		; Indica el nmero de colors (6)
    call    RandomN		; Crida a la funció que genera un nmero aleatorique no supera el 7
    movwf   Colorins1		; Guarda el resultat a Colorins1
				; Repeteix la mateixa operació amb Colorins2,3 i 4
    movlw   b'00000110'
    call    RandomN
    movwf   Colorins2
    movlw   b'00000110'
    call    RandomN
    movwf   Colorins3
    movlw   b'00000110'
    call    RandomN
    movwf   Colorins4
    movf    Comprova,w		; Guarda la Configuració a Conf
    movwf   Conf
    goto    Aleatori		; Ho envia a Aleatori
Colors7
    bsf     Comprova,5		; Activa el bit 5 de Comprova que després limita els colors dels LED a lUhora dUescollir-los
    btfsc   Comprova,3		; Comprova si està activat el bit corresponent al mode multijugador
    goto    Bucle		; Si està activat inicia la partida
    movlw   b'00000111'		; Indica el nmero de colors (7)
    call    RandomN		; Crida a la funció que genera un nmero aleatori que no supera el 7
    movwf   Colorins1		; Guarda el resultat a Colorins1
				; Repeteix la mateixa operació amb Colorins2,3 i 4
    movlw   b'00000111'
    call    RandomN
    movwf   Colorins2
    movlw   b'00000111'
    call    RandomN
    movwf   Colorins3
    movlw   b'00000111'
    call    RandomN
    movwf   Colorins4
    movf    Comprova,w		; Guarda la Configuració a Conf
    movwf   Conf
    goto    Aleatori		; Ho envia a Aleatori
Aleatori			; Crea la combinació secreta aleatòria comparant els valors de Colorins amb els números possibles (per exemple, si és 5: 0,1,2,3,4) 
				; I fa correspondre cada número a un color
    movlw   b'00000000'		; Compara el valor de Colorins1 amb cada nmero possible 
    xorwf   Colorins1,w
    btfsc   STATUS,Z
    bsf     Co1,7		; Si és 0, encén el primer LED de color blau
    movlw   b'00000001'
    xorwf   Colorins1,w
    btfsc   STATUS,Z
    bsf     Co1,6		; Si és 1, encén el primer LED de color verd
    movlw   b'00000010'
    xorwf   Colorins1,w
    btfsc   STATUS,Z
    bsf     Co1,5		; Si és 2, encén el primer LED de color vermell
    movlw   b'00000011'
    xorwf   Colorins1,w
    btfsc   STATUS,Z
    bsf     Co1,7		; Si és 3, encén el primer LED de color cian
    btfsc   STATUS,Z
    bsf     Co1,6
    movlw   b'00000100'
    xorwf   Colorins1,w
    btfsc   STATUS,Z
    bsf     Co1,7		; Si és 4, encén el primer LED de color Magenta
    btfsc   STATUS,Z
    bsf     Co1,5
    movlw   b'00000101'
    xorwf   Colorins1,w
    btfsc   STATUS,Z
    bsf     Co1,6		; Si és 5, encén el primer LED de color groc
    btfsc   STATUS,Z
    bsf     Co1,5
    movlw   b'00000110'
    xorwf   Colorins1,w
    btfsc   STATUS,Z
    bsf     Co1,5		; Si és 6, encén el primer LED de color blanc
    btfsc   STATUS,Z
    bsf     Co1,6
    btfsc   STATUS,Z
    bsf     Co1,7
				; Apagat en el cas de que sigui 7
    movlw   b'00000000'		; Repeteix el procés amb els LED 2,3,4
    xorwf   Colorins2,w
    btfsc   STATUS,Z
    bsf     Co3,1
    movlw   b'00000001'
    xorwf   Colorins2,w
    btfsc   STATUS,Z
    bsf     Co3,0
    movlw   b'00000010'
    xorwf   Colorins2,w
    btfsc   STATUS,Z
    bsf     Co3+1,7
    movlw   b'00000011'
    xorwf   Colorins2,w
    btfsc   STATUS,Z
    bsf     Co3,1
    btfsc   STATUS,Z
    bsf     Co3,0
    movlw   b'00000100'
    xorwf   Colorins2,w
    btfsc   STATUS,Z
    bsf     Co3,1
    btfsc   STATUS,Z
    bsf     Co3+1,7
    movlw   b'00000101'
    xorwf   Colorins2,w
    btfsc   STATUS,Z
    bsf     Co3,0
    btfsc   STATUS,Z
    bsf     Co3+1,7
    movlw   b'00000110'
    xorwf   Colorins2,w
    btfsc   STATUS,Z
    bsf     Co3,1
    btfsc   STATUS,Z
    bsf     Co3,0
    btfsc   STATUS,Z
    bsf     Co3+1,7
    movlw   b'00000000'
    xorwf   Colorins3,w
    btfsc   STATUS,Z
    bsf     Co2,4
    movlw   b'00000001'
    xorwf   Colorins3,w
    btfsc   STATUS,Z
    bsf     Co2,3
    movlw   b'00000010'
    xorwf   Colorins3,w
    btfsc   STATUS,Z
    bsf     Co2,2
    movlw   b'00000011'
    xorwf   Colorins3,w
    btfsc   STATUS,Z
    bsf     Co2,4
    btfsc   STATUS,Z
    bsf     Co2,3
    movlw   b'00000100'
    xorwf   Colorins3,w
    btfsc   STATUS,Z
    bsf     Co2,4
    btfsc   STATUS,Z
    bsf     Co2,2
    movlw   b'00000101'
    xorwf   Colorins3,w
    btfsc   STATUS,Z
    bsf     Co2,3
    btfsc   STATUS,Z
    bsf     Co2,2
    movlw   b'00000110'
    xorwf   Colorins3,w
    btfsc   STATUS,Z
    bsf     Co2,4
    btfsc   STATUS,Z
    bsf     Co2,3
    btfsc   STATUS,Z
    bsf     Co2,2
    movlw   b'00000000'
    xorwf   Colorins4,w
    btfsc   STATUS,Z
    bsf     Co4,6
    movlw   b'00000001'
    xorwf   Colorins4,w
    btfsc   STATUS,Z
    bsf     Co4,5
    movlw   b'00000010'
    xorwf   Colorins4,w
    btfsc   STATUS,Z
    bsf     Co4,4
    movlw   b'00000011'
    xorwf   Colorins4,w
    btfsc   STATUS,Z
    bsf     Co4,6
    btfsc   STATUS,Z
    bsf     Co4,5
    movlw   b'00000100'
    xorwf   Colorins4,w
    btfsc   STATUS,Z
    bsf     Co4,6
    btfsc   STATUS,Z
    bsf     Co4,4
    movlw   b'00000101'
    xorwf   Colorins4,w
    btfsc   STATUS,Z
    bsf     Co4,5
    btfsc   STATUS,Z
    bsf     Co4,4
    movlw   b'00000110'
    xorwf   Colorins4,w
    btfsc   STATUS,Z
    bsf     Co4,5
    btfsc   STATUS,Z
    bsf     Co4,6
    btfsc   STATUS,Z
    bsf     Co4,4
    goto    Fi
Bucle   			; S'inicia la partida
    clrf    Encerts         	; Posem Encerts,So i So+1 a 0 cada cop que es comença el bucle
    clrf    So
    clrf    So+1
    call    Llegir         	; Llegeix els polsadors
    movf    Polsador,w
    xorlw   b'00000001'    	; Mira si s'ha premut el 1 (polsador lliure que serveix per comprovar)
    btfsc   STATUS,Z       	; Si és el 1, va a Confirmar
    goto    Confirmar
    movf    Polsador,w
    xorlw   b'00000010'    	; Mira si s'ha premut el 2 (corresponent al LED 4)
    btfsc   STATUS,Z       	; Si és el 2, va a Led4
    goto    Led4
    movf    Polsador,w
    xorlw   b'00000100'    	; Mira si s'ha premut el 3 (corresponent al LED 3)
    btfsc   STATUS,Z       	; Si és el 2, va a Led3
    goto    Led3
    movf    Polsador,w
    xorlw   b'00001000'    	; Mira si s'ha premut el 4 (corresponent al LED 2)
    btfsc   STATUS,Z       	; Si és el 2, va a Led2
    goto    Led2
    movf    Polsador,w
    xorlw   b'00010000'    	; Mira si s'ha premut el 5 (corresponent al LED 1)
    btfsc   STATUS,Z       	; Si és el 2, va a Led1
    goto    Led1
    goto    Bucle           	; Torna a començar si no s'ha premut cap
Led1
    incf    C1,f            	; Incrementa el comptador cada cop que és premut
    movlw   .1              	; Mira si val 1, llavors el posarem Blau
    xorwf   C1,w
    btfsc   STATUS,Z
    goto    Blau1
    movlw   .2              	; Mira si val 2, llavors el posarem Verd
    xorwf   C1,w
    btfsc   STATUS,Z
    goto    Verd1
    movlw   .3              	; Mira si val 3, llavors el posarem Vermell
    xorwf   C1,w
    btfsc   STATUS,Z
    goto    Vermell1
    movlw   .4              	; Mira si val 4, llavors el posarem Cian
    xorwf   C1,w
    btfsc   STATUS,Z
    goto    Cian1
    movlw   .5              	; Mira si val 5, llavors el posarem Magenta
    xorwf   C1,w
    btfsc   STATUS,Z
    goto    Magenta1
    movlw   .6              	; Mira si val 6, llavors el posarem Groc
    xorwf   C1,w
    btfsc   STATUS,Z
    goto    Groc1
    movlw   .7              	; Mira si val 7, llavors el posarem Blanc
    xorwf   C1,w
    btfsc   STATUS,Z
    goto    Blanc1
    movlw   .8              	; Mira si val 8, llavors el posarem Negre
    xorwf   C1,w
    btfsc   STATUS,Z
    goto    Negre1
				; I així successivament per a cada Led, que tindrà el seu mini-bucle per triar color.
Led2
    incf    C2,f
    movlw   .1
    xorwf   C2,w
    btfsc   STATUS,Z
    goto    Blau2
    movlw   .2
    xorwf   C2,w
    btfsc   STATUS,Z
    goto    Verd2
    movlw   .3
    xorwf   C2,w
    btfsc   STATUS,Z
    goto    Vermell2
    movlw   .4              	
    xorwf   C2,w
    btfsc   STATUS,Z
    goto    Cian2
    movlw   .5              	
    xorwf   C2,w
    btfsc   STATUS,Z
    goto    Magenta2
    movlw   .6              	
    xorwf   C2,w
    btfsc   STATUS,Z
    goto    Groc2
    movlw   .7              	
    xorwf   C2,w
    btfsc   STATUS,Z
    goto    Blanc2
    movlw   .8              	
    xorwf   C2,w
    btfsc   STATUS,Z
    goto    Negre2
Led3
    incf    C3,f
    movlw   .1
    xorwf   C3,w
    btfsc   STATUS,Z
    goto    Blau3
    movlw   .2
    xorwf   C3,w
    btfsc   STATUS,Z
    goto    Verd3
    movlw   .3
    xorwf   C3,w
    btfsc   STATUS,Z
    goto    Vermell3
    movlw   .4              	
    xorwf   C3,w
    btfsc   STATUS,Z
    goto    Cian3
    movlw   .5              	
    xorwf   C3,w
    btfsc   STATUS,Z
    goto    Magenta3
    movlw   .6              	
    xorwf   C3,w
    btfsc   STATUS,Z
    goto    Groc3
    movlw   .7              	
    xorwf   C3,w
    btfsc   STATUS,Z
    goto    Blanc3
    movlw   .8              	
    xorwf   C3,w
    btfsc   STATUS,Z
    goto    Negre3
Led4
    incf    C4,f
    movlw   .1
    xorwf   C4,w
    btfsc   STATUS,Z
    goto    Blau4
    movlw   .2
    xorwf   C4,w
    btfsc   STATUS,Z
    goto    Verd4
    movlw   .3
    xorwf   C4,w
    btfsc   STATUS,Z
    goto    Vermell4
    movlw   .4              	
    xorwf   C4,w
    btfsc   STATUS,Z
    goto    Cian4
    movlw   .5              	
    xorwf   C4,w
    btfsc   STATUS,Z
    goto    Magenta4
    movlw   .6              	
    xorwf   C4,w
    btfsc   STATUS,Z
    goto    Groc4
    movlw   .7              	
    xorwf   C4,w
    btfsc   STATUS,Z
    goto    Blanc4
    movlw   .8              	
    xorwf   C4,w
    btfsc   STATUS,Z
    goto    Negre4
				; A les segents funcions activem i desactivem els diferents bits de la variable del color del LED corresponent
Blau1
    bcf     D1,5
    bcf     D1,6
    bsf     D1,7
    goto    Fi
Blau2
    bsf     D2,4
    bcf     D2,2
    bcf     D2,3
    goto    Fi
Blau3
    bcf     D3,0
    bsf     D3,1
    bcf     D3+1,7
    goto    Fi
Blau4
    bcf     D4,4
    bcf     D4,5
    bsf     D4,6
    goto    Fi

Verd1
    bcf     D1,7
    bsf     D1,6
    bcf     D1,5
    goto    Fi
Verd2
    bcf     D2,2
    bsf     D2,3
    bcf     D2,4
    goto    Fi
Verd3
    bcf     D3,1
    bsf     D3,0
    bcf     D3+1,7
    goto    Fi
Verd4
    bcf     D4,4
    bsf     D4,5
    bcf     D4,6
    goto    Fi
Vermell1
    bsf     D1,5
    bcf     D1,6
    bcf     D1,7
    goto    Fi
Vermell2
    bsf     D2,2
    bcf     D2,3
    bcf     D2,4
    goto    Fi
Vermell3
    bcf     D3,0
    bcf     D3,1
    bsf     D3+1,7
    goto    Fi
Vermell4
    bcf     D4,6
    bcf     D4,5
    bsf     D4,4
    goto    Fi
				; Si està activat el bit 0 de Comprova (sUhan escolit 4 colors), es posa a zero el comptador i torna a començar
Cian1
    bcf     D1,5
    bsf     D1,6
    bsf     D1,7
    btfsc   Comprova,0
    clrf    C1
    goto    Fi
Cian2
    bsf     D2,4
    bcf     D2,2
    bsf     D2,3
    btfsc   Comprova,0
    clrf    C2
    goto    Fi
Cian3
    bsf     D3,0
    bsf     D3,1
    bcf     D3+1,7
    btfsc   Comprova,0
    clrf    C3
    goto    Fi
Cian4
    bcf     D4,4
    bsf     D4,5
    bsf     D4,6
    btfsc   Comprova,0
    clrf    C4
    goto    Fi
				; Si està activat el bit 1 de Comprova (sUhan escolit 5 colors), es posa a zero el comptador i torna a començar
Magenta1
    bsf     D1,5
    bcf     D1,6
    bsf     D1,7
    btfsc   Comprova,1
    clrf    C1
    goto    Fi
Magenta2
    bsf     D2,4
    bsf     D2,2
    bcf     D2,3
    btfsc   Comprova,1
    clrf    C2
    goto    Fi
Magenta3
    bcf     D3,0
    bsf     D3,1
    bsf     D3+1,7
    btfsc   Comprova,1
    clrf    C3
    goto    Fi
Magenta4
    bsf     D4,4
    bcf     D4,5
    bsf     D4,6
    btfsc   Comprova,1
    clrf    C4
    goto    Fi
				; Si està activat el bit 2 de Comprova (sUhan escolit 6 colors), es posa a zero el comptador i torna a començar	
Groc1
    bsf     D1,5
    bsf     D1,6
    bcf     D1,7
    btfsc   Comprova,2
    clrf    C1
    goto    Fi
Groc2
    bcf     D2,4
    bsf     D2,3
    bsf     D2,2
    btfsc   Comprova,2
    clrf    C2
    goto    Fi
Groc3
    bcf     D3,1
    bsf     D3,0
    bsf     D3+1,7
    btfsc   Comprova,2
    clrf    C3
    goto    Fi
Groc4
    bsf     D4,5
    bsf     D4,4
    bcf     D4,6
    btfsc   Comprova,2
    clrf    C4
    goto    Fi
				; Si està activat el bit 5 de Comprova (s'han escolit 7 colors), es posa a zero el comptador i torna a començar
Blanc1
    bsf     D1,5
    bsf     D1,6
    bsf     D1,7
    btfsc   Comprova,5
    clrf    C1
    goto    Fi
Blanc2
    bsf     D2,4
    bsf     D2,2
    bsf     D2,3
    btfsc   Comprova,5
    clrf    C2
    goto    Fi
Blanc3
    bsf     D3,0
    bsf     D3,1
    bsf     D3+1,7
    btfsc   Comprova,5
    clrf    C3
    goto    Fi
Blanc4
    bsf     D4,4
    bsf     D4,5
    bsf     D4,6
    btfsc   Comprova,5
    clrf    C4
    goto    Fi
				; Posa a zero el comptador per a que torni a començar
Negre1
    bcf     D1,5
    bcf     D1,6
    bcf     D1,7
    clrf    C1
    goto    Fi
Negre2
    bcf     D2,4
    bcf     D2,2
    bcf     D2,3
    clrf    C2
    goto    Fi
Negre3
    bcf     D3,0
    bcf     D3,1
    bcf     D3+1,7
    clrf    C3
    goto    Fi
Negre4
    bcf     D4,4
    bcf     D4,5
    bcf     D4,6
    clrf    C4
    goto    Fi
Confirmar   			; Comprova si s'han encertat els colors i sUencenen els LED grocs coresponents en el cas que s'hagin encertat
    btfsc   Comprova,3   	; Si està activat el bit 3 de Comprova (mode multijugador) va a Copiar
    goto    Copiar
    movf    Co1,w           	; Copia el valor del color secret del LED 1 a l'acumulador
    xorwf   D1,w            	; Compara el valor de l'acumulador amb el color coresponent 
    btfsc   STATUS,Z
    bsf     So,3            	; Si són iguals, activa el LED groc 4
    movf    Co2,w           	; Copia el valor del color secret del LED 2 a l'acumulador
    xorwf   D2,w            	; Compara el valor de l'acumulador amb el color coresponent 
    btfsc   STATUS,Z
    bsf     So,2            	; Si són iguals, activa el LED groc 3
    movf    Co3,w           	; Copia el valor del color secrert del LED 3 a l'acumulador
    xorwf   D3,w            	; Compara el valor de l'acumulador amb el color coresponent 
    btfsc   STATUS,Z
    bsf     Encerts,0       	; Si són iguals, s'activa el primer bit de Encerts
    movf    Co3+1,w         	; Copia el valor del color secret del LED 3 a l'acumulador
    xorwf   D3+1,w          	; Compara el valor de l'acumulador amb el color coresponent
    btfsc   STATUS,Z
    bsf     Encerts,1       	; Si són iguals, s'activa el segon bit de Encerts
    movlw   b'00000011'     	; Copia el valor
    xorwf   Encerts,w       	; Compara el valor amb Encerts
    btfsc   STATUS,Z
    bsf     So,1            	; Si són iguals, activa el LED groc 2
    movf    Co4,w           	; Copia el valor del color del LED 4 a l'acumulador
    xorwf   D4,w            	; Compara el valor de l'acumulador amb el color coresponent 
    btfsc   STATUS,Z
    bsf     So,0            	; Si són iguals, activa el LED groc 1
    incf    Tirades,f		; Incrementa el nmero de tirades
    btfss   So,0		; Si està activat el LED groc 1 salta	
    goto    Fi			; Sinó va a Fi
    btfss   So,1		; Si està activat el LED groc 2 salta
    goto    Fi			; Sinó va a Fi
    btfss   So,2		; Si està activat el LED groc 3 salta
    goto    Fi			; Sinó va a Fi
    btfss   So,3		; Si està activat el LED groc 4 salta
    goto    Fi			; Sinó va a Fi
    goto    FinalBo		; Si estan tots els LED grocs encesos (ha encertat la combinació secreta), va a FinalBo
Copiar				; Només entra en el mode multijugador i guarda els colors dels LED a la combinació secreta 			
    movf    D1,w
    movwf   Co1
    movf    D2,w
    movwf   Co2
    movf    D3,w
    movwf   Co3
    movf    D3+1,w
    movwf   Co3+1
    movf    D4,w
    movwf   Co4
    clrf    D1			; Un cop guardats es posen a zero per a que s'apaguin
    clrf    D2
    clrf    D3
    clrf    D3+1
    clrf    D4
    movf    Comprova,w		; Guarda la configuració de la partida a Conf
    movwf   Conf
    bcf     Comprova,3		; Desactiva el bit 3 de Comprova per a que no torni a entrar a Copiar
Fi  				
    movf    CTirades,w		; Compara el número de tirades màxim (CTirades) amb les que s'han jugat fins el moment (Tirades)
    xorwf   Tirades,w
    btfsc   STATUS,Z
    goto    FinalDolent		; Si són iguals (no ha encertat la combinació secreta en el nmero màxim de tirades), va a FinalDolent
    call    EncendreLeds	; Encén els LED
    movf    Tirades,w		; Mostra als LED vermells el número de tirades jugades fins el moment
    movwf   PORTC
    call    Rets            	
    goto    Bucle           	; Torna a començar
FinalBo
    clrf    Tirades		; Posa a zero Tirades
    movlw   b'01000000'		; Encén els LED de color verd
    movwf   D1
    movlw   b'00001000'
    movwf   D2
    movlw   b'00000001'
    movwf   D3
    movlw   b'00000000'
    movwf   D3+1
    movlw   b'00100000'
    movwf   D4
    call    EncendreLeds
    bcf     STATUS,RP0
    bsf     STATUS,RP1    	; Tria el banc 2
    movlw   b'00000001'
    movwf   ANSEL        	; Posa AN0 com entrada analògica
    bcf     STATUS,RP0
    bcf     STATUS,RP1    	; Tria el banc 0
    movlw   b'00000001'    	; Activa el conversor A/D connectat a AN0
    movwf   ADCON0        	; Amb el resultat justificat per l'esquerra
    btfss   Comprova,4		; Comprova si està activat el bit 4 de Comprova
    call    Campeones		; Si no està activat sona el brunzidor
    goto    Inici		; Torna a començar (nova partida)
FinalDolent
    clrf    Tirades		; Posa a zero Tirades
    movf    Co1,w		; Encén els LED amb la combinació secreta
    movwf   D1
    movf    Co2,w
    movwf   D2
    movf    Co3,w
    movwf   D3
    movf    Co3+1,w
    movwf   D3+1
    movf    Co4,w
    movwf   D4
    call    EncendreLeds
    btfss   Comprova,4		; Comprova si està activat el bit 4 de Comprova
    call    Marcha_funebre	; Si no està activat sona el brunzidor
    goto    Inici		; Torna a començar (nova partida)
RandomN				; Crea un valor aleatori menor o igual al número que hi ha guardat a l'acumulador a l'hora de cridar la funció
    movwf   CuantosColorins	; Guarda el valor de l'acumulador (número de colors escollit) a CuantosColorins
RandomN1
    call    Random		; S'obtenen dos nombres aleatoris: Rand i Rand+1
    movlw   b'00000111'		; Fa la funció and entre Rand+1 i l'acumulador (b'00000111')
    andwf   Rand+1,w
    movwf   ColorinsN		; Guarda el resultat a ColorinsN	
    subwf   CuantosColorins,w	; Li resta al valor obtingut el número de colors escollit (Cuantos Colorins)
    btfsc   STATUS,Z		; Si el resultat és zero (activa el bit Z), torna a generar un altre número aleatori (el que tenim és major que el número màxim de colors)
    goto    RandomN1		
    btfss   STATUS,C		; Si el resultat és menor que zero (activa el bit C), guarda el valor obtingut abans de la resta (ColorinsN) a l'acumulador
    goto    RandomN1		; Sinó, torna a generar un altre número aleatori
    movf    ColorinsN,w
    return
Potenciometre
    bcf     STATUS,RP0
    bsf     STATUS,RP1    	; Tria el banc 2
    movlw   b'00000001'
    movwf   ANSEL        	; Posa AN0 com entrada analògica
    bcf     STATUS,RP0
    bcf     STATUS,RP1    	; Tria el banc 0
    movlw   b'00000001'    	; activa el conversor A/D connectat a AN0
    movwf   ADCON0        	; amb el resultat justificat per l'esquerra
    movlw   b'00000000'    	; Activa el bit 3
    movwf   Visualita    	; Ho copia sobre la variable Visualit
Bucle2
    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
    swapf   ADRESH,w    	; Copia els bits superiors a l'acumulador
    movwf   Visualita        	; Ho copia a la variable Retard2
    movwf   PORTC        	; Copia el resultat sobre els LED
    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'00001000'    	; Activa el bit 3
    movlw   .10            	; Retard de 2 s
    call    Rets
    btfsc   PORTA,3            	; Mira si està activada l'entrada A3
    goto    Potenciometre       ; Si està premut, espera
    movlw   b'00001001'    	; Activa el conversor A/D connectat a AN2
    movwf   ADCON0         	; Amb el resultat justificat per l'esquerra
    movf    Visualita,w 	; Copia valor pot a acu
    andlw   b'00001111' 	; Fa AND amb el valor de l'acumulador (Visualita) per a que es mantinguin els dels LED
    movwf   Visualita   	; Copia el resultat a Visualita
    clrf    PORTC
    return
EncendreLeds			; Copia els valors dels colors de cada LED a So i So+1 i a Sortida i Sortida+1 respectivament, i encén els LED
    movf    D1,w            	
    iorwf   So+1,f          	
    movf    D2,w            	
    iorwf   So+1,f          	
    movf    D3,w            	
    iorwf   So+1,f          	
    movf    D3+1,w          	
    iorwf   So,f            	
    movf    D4,w            	
    iorwf   So,f            	
    movf    So+1,w
    movwf   Sortida+1
    movf    So,w
    movwf   Sortida
    call    EnviaR16
    return
Campeones
    call    Sol
    movf    corpunto,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Sol
    movf    semicor,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Sol
    movf    Blanca,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Mi
    movf    Negra,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Mi
    movf    corpunto,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Mi
    movf    semicor,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Mi
    movf    Blanca,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Do
    movf    Negra,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Do
    movf    Negra,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Re
    movf    Negra,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Re
    movf    Negra,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Sol
    movf    Negra,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Sol
    movf    Negra,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Mi
    movf    Blanca,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    return
Marcha_funebre
    call    Re
    movf    Blanca,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Re
    movf    negrapunto,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Re
    movf    semicor,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Re
    movf    Blanca,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Fa
    movf    negrapunto,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Mi
    movf    semicor,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Mi
    movf    negrapunto,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Re
    movf    semicor,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Re
    movf    negrapunto,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Re
    movf    semicor,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    call    Re
    movf    Blanca,w
    movwf   Retard3
    call    TocaNota        	; Toca la nota configurada
    return
Llegir  			; Funció aïllada que llegeix els polsadors
    clrf    Polsador    	; Si aquest valor no es canvia és que no hi ha cap polsador premut
    nop                 	; espera un microsegon
    nop                 	; espera un microsegon
    nop                 	; espera un microsegon
    nop                 	; espera un microsegon
    nop                 	; espera un microsegon, en total 5
    bsf     ADCON0,GO   	; Inicia la conversió
    btfsc   ADCON0,GO  		; Quan el bit sigui 0 la conversió haurà acabat
    goto    $-1         	; Repetim la línia fins que deixi de ser 0
                       		; Comparació P1
    movlw   .220       		; Límit superior de P1
    subwf   ADRESH,w   		; W = ADRESH - W
    btfsc   STATUS,C   		; C = 1 si ADRESH >= W
    goto    NoP1        	; ADRESH >= W
    movlw   .200       		; Límit inferior de P1
    subwf   ADRESH,w   		; W = ADRESH - W
    btfss   STATUS,C   		; C = 1 si ADRESH >= W
    goto    NoP1        	; ADRESH < W
    movlw   b'00000001'    	; Polsador P1
    movwf   Polsador   		; Ho copia a Polsador
    goto    NoP5
NoP1    			; Comparació P2
    movlw   .194       		; Límit superior de P2
    subwf   ADRESH,w   		; W = ADRESH - W
    btfsc   STATUS,C   		; C = 1 si ADRESH >= W
    goto    NoP2        	; ADRESH >= W
    movlw   .174       		; Límit inferior de P2
    subwf   ADRESH,w   		; W = ADRESH - W
    btfss   STATUS,C   		; C = 1 si ADRESH >= W
    goto    NoP2        	; ADRESH < W
    movlw   b'00000010'    	; Polsador P2
    movwf   Polsador   		; Ho copia a Polsador
    goto    NoP5
NoP2     			; Comparació P3
    movlw   .163       		; Límit superior de P3
    subwf   ADRESH,w   		; W = ADRESH - W
    btfsc   STATUS,C   		; C = 1 si ADRESH >= W
    goto    NoP3        	; ADRESH >= W
    movlw   .143       		; Límit inferior de P3
    subwf   ADRESH,w   		; W = ADRESH - W
    btfss   STATUS,C   		; C = 1 si ADRESH >= W
    goto    NoP3        	; ADRESH < W
    movlw   b'00000100'    	; Polsador P3
    movwf   Polsador   		; Ho copia a Polsador
    goto    NoP5
NoP3     			; Comparació P4
    movlw   .90        		; Límit superior de P4
    subwf   ADRESH,w   		; W = ADRESH - W
    btfsc   STATUS,C   		; C = 1 si ADRESH >= W
    goto    NoP4        	; ADRESH >= W
    movlw   .70        		; Límit inferior de P4
    subwf   ADRESH,w   		; W = ADRESH - W
    btfss   STATUS,C   		; C = 1 si ADRESH >= W
    goto    NoP4        	; ADRESH < W
    movlw   b'00001000'    	; Polsador P4
    movwf   Polsador   		; Ho copia a Polsador
    goto    NoP5
NoP4      			; Comparació P5
    movlw   .55        		; Límit superior de P5
    subwf   ADRESH,w   		; W = ADRESH - W
    btfsc   STATUS,C   		; C = 1 si ADRESH >= W
    goto    NoP5        	; ADRESH >= W
    movlw   .35        		; Límit inferior de P5
    subwf   ADRESH,w   		; W = ADRESH - W
    btfss   STATUS,C   		; C = 1 si ADRESH >= W
    goto    NoP5        	; ADRESH < W
    movlw   b'00010000'    	; Polsador P5
    movwf   Polsador   		; Ho copia a Polsador
NoP5
    return
EnviaR16                	; Envia 16 bits a un registre de desplaAament
                       		; 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 - PER AIXÒ HEM CREAT So i So+1
    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 mHs 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, forAant 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    		; 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
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
Rets                    	; Funció de retard 
    movwf   Retard3
Bucles
    decfsz  Retard1,f
    goto    Bucles
    decfsz  Retard2,f
    goto    Bucles
    return
Ret10ms
    decfsz  Retard1,f
    goto    Ret10ms
    decfsz  Retard2,f
    goto    Ret10ms
    return
TocaNota
    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 comparacis 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    Rets1           	; 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
    call    Ret10ms
    return
Rets1                    	; Funció de retard
    movlw   .30
    movwf   Retard2
Bucles1
    decfsz  Retard1,f
    goto    Bucles1
    decfsz  Retard2,f
    goto    Bucles1
    decfsz  Retard3,f
    goto    Bucles1
    return
RetM                    	; Funció de retard 
    decfsz  Retard1,f
    goto    RetM
    decfsz  Retard2,f
    goto    RetM
    return
				; Configuració de les diferents notes
Sol
    movlw        .158        	
    movwf        ValPR2         
    movlw        .79            
    movwf        ValCCPR1L      
    movlw        .2            	
    movwf        ValDC1B        
    return
Fa
    movlw        .178           
    movwf        ValPR2         
    movlw        .89            
    movwf        ValCCPR1L      
    movlw        .2            
    movwf        ValDC1B       
    return
Mi
    movlw        .189         
    movwf        ValPR2    
    movlw        .95         
    movwf        ValCCPR1L      
    movlw        .0           
    movwf        ValDC1B      
    return
Re
    movlw        .212           
    movwf        ValPR2        
    movlw        .106          
    movwf        ValCCPR1L    
    movlw        .2            
    movwf        ValDC1B        
    return
Do
    movlw        .238           
    movwf        ValPR2        
    movlw        .119          
    movwf        ValCCPR1L      
    movlw        .2            	
    movwf        ValDC1B        
    return
    end

 

 

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