Programació en mpasm del PIC 16F690

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

Dau electrònic

Programa del grup 1

El programa del grup 1 té present la posició del potenciòmetre per escollir entre dos modes de funcionament. En un dels modes, quan es prem el polsador mostra una seqüència als nou LED i després presenta el número que ha triat aleatòriament. En l'altre mode, la seqüencia dura més i va acompanyada d'una melodia. La melodia triada és una part de la canço "La Cucaracha".

El programa d'aquest grup é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
MostraMida	; Mostra de la mida
n1		; Variable que es guarda el número aleatori
n2		; Variable per quan el número aleatori sigui '10000000','01000000' o '00000000'
V1		; Variable per la seqüència lluminosa
V3		; Variable per la seqüència lluminosa
V5		; Variable per la seqüència lluminosa
V7		; Variable per la seqüència lluminosa
V9		; Variable per la seqüència lluminosa
Retard1		; Variable per retardar
Retard2		; Variable per retardar
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
Llargada
	endc
	org 0
Inici					; comentaris OK
	movlw		b'11111111'
	movwf		Retard1
	movwf		Retard2
	call		RetM
	call		RetM		; Retards necessaris perquè sinó no espera al Bucle4 fins
					; que apretem el polsador
	bsf		STATUS,RP0	; Tria el banc 1
	movlw		b'00100000'	; Definim com volem les E/S del port C
	movwf		TRISC		; RC5 (sortida del PWM) com a entrada
	bcf		STATUS,RP0	; Tria el banc 0
	movlw		b'00001100'	; Configura el PWM, bits P1M (bits 7-6) a 00 mode senzill
					; DC1B = 00 (bits 5-4) els dos bits de menys pes són 0
					; CCP1M = 11xx en mode senzill els bit 0 i 1 no afecten
	movwf		ValCCP1CON	; Ho guarda per fer-ho servir més tard
	movwf		CCP1CON		; Ho posa com a configuració del PWM
	movlw		b'00000011'	; Configura el Timer 2
					; bits T2KCPS (bits 1-0) a 11 prescalat de 16
					; bit 2 (TMR2ON) a 0, Timer aturat
					; Postscaler TOUTPS (bits 6-3) no afecten al PWM
	movwf		T2CON		; Ho posa com a configuració del Timer 2
	bsf		STATUS,RP0	; Tria el banc 1
	clrf		TRISC		; Posa tots els bits del port C com a sortida
	clrf		TRISB		; Posa tots els bits del port B com a sortida
	bcf		STATUS,RP0	; Tria el banc 0
	movlw		b'01000000'	; posa el numero binari '01000000' a l'acumulador
	movwf		V7		; i ho posa a la variable V7
	movlw		b'10010000'	; posa el numero binari '10010000' a l'acumulador
	movwf		V1		; i ho posa a la variable V1
	movlw		b'01010000'	; posa el numero binari '01010000' a l'acumulador
	movwf		V9		; i ho posa a la variable V9
	movlw		b'10000000'	; posa el numero binari '10000000' a l'acumulador
	movwf		V3		; i ho posa a la variable V3
	movlw		b'00100000'	; posa el numero binari '00100000' a l'acumulador
	movwf		V5		; i ho posa a la variable V5
	movwf		n1		; a la variable n1
	movwf		n2		; i a la variable n2
	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
	movlw		b'00010000'	; Posa el conversor a 1/8 de la freqüència
	movwf		ADCON1		; Copia W a la configuració del conversor A/D
	bcf		STATUS,RP0
	bsf		STATUS,RP1	; Tria el banc 2
	movlw		0xFF		; Posa l'acumulador a FFh (tot uns)
	movwf		ANSEL		; Configura AN0-AN7 com entrades analògiques
	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
Bucle4					; Bucle que s'utilitza quan encara no ha sortit cap número
	clrf		PORTC		; posa tots els bits del PORTC a 0
	clrf		PORTB		; posa tots els bits del PORTB a 0
	rrf		n1,f		; Fa rodar els bits de la variable n1 cap a la dreta,
					; el bit de la dreta passa al bit de l'arrossegament
					; i el de l'arrossegament passa al bit de l'esquerra
	btfsc		PORTA,3		; si el polsador no està pitjat fa la següent,
					; sino es salta una instrucció
	goto		Bucle4
	goto		Bucle		; torna a Bucle4 fins que no es pitja el polsador.
					; Quan es pitja va a Seq
Bucle					; Bucle que decideix si  la seqüencia es farà amb música o sense.
	bsf		ADCON0,GO	; Inicia la conversió
	btfsc		ADCON0,GO	; Quan el bit sigui 0 la conversió haurà acabat
	goto		$-1		; repetim la línia fins que deixi de ser 1
	swapf		ADRESH,w	; Permuta els nibbles dels bits superiors
	btfsc		ADRESH,7
	goto		Seq1		; si el Bit 7 està activat fa la seqüencia amb música.
					; Si no ho està la fa sense música
	goto		Seq2
numero1					; Bucle que ensenya el número 1 als LED grocs
	rrf		n1,f		; Fa rodar els bits de la variable n1 cap a la dreta,
					; el bit de la dreta passa al bit de l'arrossegament
					; i el de l'arrossegament passa al bit de l'esquerra
	clrf		PORTC		; posa tots els bits del PORTC a 0
	movlw		b'00100000'	; posa el numero binari '00100000' a l'acumulador
	movwf		PORTB		; i ho posa al port B
	btfsc		PORTA,3		; si el polsador no està pitjat fa la següent,
					; sino es salta una instrucció
	goto		numero1
	goto		Bucle		; torna a numero1 fins que no es pitja el polsador.
					; Quan es pitja va a Seq
numero2					; Bucle que ensenya el número 2 als LED grocs
	rrf		n1,f		; Fa rodar els bits de la variable n1 cap a la dreta,
					; el bit de la dreta passa al bit de l'arrossegament
					; i el de l'arrossegament passa al bit de l'esquerra
	clrf		PORTC		; posa tots els bits del PORTC a 0
	movlw		b'00010000'	; posa el numero binari '00010000' a l'acumulador
	movwf		PORTB		; i ho posa al port B
	btfsc		PORTA,3		; si el polsador no està pitjat fa la següent,
					; sino es salta una instrucció
	goto		numero2
	goto		Bucle		; torna a numero2 fins que no es pitja el polsador.
					; Quan es pitja va a Seq
numero3					; Bucle que ensenya el número 3 als LED grocs
	rrf		n1,f		; Fa rodar els bits de la variable n1 cap a la dreta,
					; el bit de la dreta passa al bit de l'arrossegament
					; i el de l'arrossegament passa al bit de l'esquerra
	clrf		PORTC		; posa tots els bits del PORTC a 0
	movlw		b'00110000'	; posa el numero binari '00110000' a l'acumulador
	movwf		PORTB		; i ho posa al port B
	btfsc		PORTA,3		; si el polsador no està pitjat fa la següent,
					; sino es salta una instrucció
	goto		numero3
	goto		Bucle		; torna a numero3 fins que no es pitja el polsador.
					; Quan es pitja va a Seq
numero4					; Bucle que ensenya el número4 als LED grocs
	rrf		n1,f		; Fa rodar els bits de la variable n1 cap a la dreta,
					; el bit de la dreta passa al bit de l'arrossegament
					; i el de l'arrossegament passa al bit de l'esquerra
	clrf		PORTC		; posa tots els bits del PORTC a 0
	movlw		b'00010000'	; posa el numero binari '00010000' a l'acumulador
	movwf		PORTB		; i ho posa al port B
	nop				; El posem perquè tots els LED tinguin la mateixa intensitat
	nop				; El posem perquè tots els LED tinguin la mateixa intensitat
	nop				; El posem perquè tots els LED tinguin la mateixa intensitat
	nop				; El posem perquè tots els LED tinguin la mateixa intensitat
	movlw		b'11000000'	; posa el número binari '11000000' a l'acumulador
	movwf		PORTB		; i ho posa al port B
	btfsc		PORTA,3		; si el polsador no està pitjat fa la següent,
					; sino es salta una instrucció
	goto		numero4
	goto		Bucle		; torna a numero4 fins que no es pitja el polsador.
					; Quan es pitja va a Seq
numero5					; Bucle que ensenya el número5 als LED grocs
	rrf		n1,f		; Fa rodar els bits de la variable n1 cap a la dreta,
					; el bit de la dreta passa al bit de l'arrossegament
					; i el de l'arrossegament passa al bit de l'esquerra
	clrf		PORTC		; posa tots els bits del PORTC a 0
	movlw		b'00110000'	; posa el numero binari '00110000' a l'acumulador
	movwf		PORTB		; i ho posa al port B
	nop				; El posem perquè tots els LED tinguin la mateixa intensitat
	nop				; El posem perquè tots els LED tinguin la mateixa intensitat
	nop				; El posem perquè tots els LED tinguin la mateixa intensitat
	nop				; El posem perquè tots els LED tinguin la mateixa intensitat
	movlw		b'11000000'	; posa el numero binari '11000000' a l'acumulador
	movwf		PORTB		; i ho posa al port B
	btfsc		PORTA,3		; si el polsador no està pitjat fa la següent,
					; sino es salta una instrucció
	goto		numero5
	goto		Bucle		; torna a numero5 fins que no es pitja el polsador.
					; Quan es pitja va a Seq
numero6					; Bucle que ensenya el número6 als LED grocs
	rrf		n1,f		; Fa rodar els bits de la variable n1 cap a la dreta,
					; el bit de la dreta passa al bit de l'arrossegament
					; i el de l'arrossegament passa al bit de l'esquerra
	clrf		PORTC		; posa tots els bits del PORTC a 0
	movlw		b'00010000'	; posa el numero binari '00010000' a l'acumulador
	movwf		PORTB		; i ho posa al port B
	nop				; El posem perquè tots els LED tinguin la mateixa intensitat
	nop				; El posem perquè tots els LED tinguin la mateixa intensitat
	nop				; El posem perquè tots els LED tinguin la mateixa intensitat
	nop				; El posem perquè tots els LED tinguin la mateixa intensitat
	nop				; El posem perquè tots els LED tinguin la mateixa intensitat
	movlw		b'11000000'	; posa el numero binari '11000000' a l'acumulador
	movwf		PORTC		; ho posa al port C
	movwf		PORTB		; i també al port B
	btfsc		PORTA,3		; si el polsador no està pitjat fa la següent,
					; sino es salta una instrucció
	goto		numero6
	goto		Bucle		; torna a numero6 fins que no es pitja el polsador.
					; Quan es pitja va a Seq
Bucle2					; Bucle que ens envia al número corresponent.
					; Si hi ha activats els bits 6,7 o d'arrossegament va al Bucle3.
	clrf		PORTB		; posa tots els bits del PORTB a 0
	btfsc		n1,0		; si el bit 0 de la variable n1 està activat s'encen el número 1
	goto		numero1
	btfsc		n1,1		; si el bit 1 de la variable n1 està activat s'encen el número 2
	goto		numero2
	btfsc		n1,2		; si el bit 2 de la variable n1 està activat s'encen el número 3
	goto		numero3
	btfsc		n1,3		; si el bit 3 de la variable n1 està activat s'encen el número 4
	goto		numero4
	btfsc		n1,4		; si el bit 4 de la variable n1 està activat s'encen el número 5
	goto		numero5
	btfsc		n1,5		; si el bit 5 de la variable n1 està activat s'encen el número 6
	goto		numero6
	goto		Bucle3		; va a Bucle3
Bucle3					; Bucle en cas que la variable n1 tingui els bits 6,7
					; o d'arrossegament activats.
	rrf		n2,f		; Fa rodar els bits de la variable n2 cap a la dreta,
					; el bit de la dreta passa al bit de l'arrossegament
					; i el de l'arrossegament passa al bit de l'esquerra
	btfsc		n2,0		; si el bit 0 de la variable n2 està activat s'encen el número 1
	goto		numero1
	btfsc		n2,1		; si el bit 1 de la variable n2 està activat s'encen el número 2
	goto		numero2
	btfsc		n2,2		; si el bit 2 de la variable n2 està activat s'encen el número 3
	goto		numero3
	btfsc		n2,3		; si el bit 3 de la variable n2 està activat s'encen el número 4
	goto		numero4
	btfsc		n2,4		; si el bit 4 de la variable n2 està activat s'encen el número 5
	goto		numero5
	btfsc		n2,5		; si el bit 5 de la variable n2 està activat s'encen el número 6
	goto		numero6
	goto		Bucle3		; va a Bucle3
Seq1					; Seqüència amb la melodia de 'la cucaracha'.
					; Toca el principi i el final de la cançó.
	clrf		PORTB
	clrf		PORTC
	movf		V1,w		; posa el valor de la variable V1 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	movlw		.238		; Valor que correspon aproximadament a do3
	movwf		ValPR2		; Ho posem com a valor de PR2
	movlw		.109		; 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
	movlw		b'00000001'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	clrf		PORTB		; posa tots els bits del PORTB a 0
	movf		V9,w		; posa el valor de la variable V9 a l'acumulador
	movwf		PORTC		; posa el valor de l'acumulador al PORTC
	movlw		.238		; Valor que correspon aproximadament a do3
	movwf		ValPR2		; Ho posem com a valor de PR2
	movlw		.109		; 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
	movlw		b'00000001'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	clrf		PORTC		; posa tots els bits del PORTC a 0
	movf		V3,w		; posa el valor de la variable V3 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	movlw		.238		; Valor que correspon aproximadament a do3
	movwf		ValPR2		; Ho posem com a valor de PR2
	movlw		.109		; 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
	movlw		b'00000001'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	movf		V5,w		; posa el valor de la variable V5 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	movlw		.178		; Valor que correspon aproximadament a do3
	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
	movlw		b'00000011'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	movf		V7,w		; posa el valor de la variable V7 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	movlw		.141		; Valor que correspon aproximadament a do3
	movwf		ValPR2		; Ho posem com a valor de PR2
	movlw		.71		; Valor que correspon a un cicle del 50 %
	movwf		ValCCPR1L	; Valor de CCPR1L
	movlw		.0		; Valor dels bits de menys pes del CCP
	movwf		ValDC1B		; Valor de DC1B
	movlw		b'00000001'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	clrf		PORTB		; posa tots els bits del PORTB a 0
	movf		V1,w		; posa el valor de la variable V1 a l'acumulador
	movwf		PORTC		; posa el valor de l'acumulador al PORTC
	movlw		.238		; Valor que correspon aproximadament a do3
	movwf		ValPR2		; Ho posem com a valor de PR2
	movlw		.109		; 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
	movlw		b'00000001'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	clrf		PORTC		; posa tots els bits del PORTC a 0
	movf		V9,w		; posa el valor de la variable V9 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	movlw		.238		; Valor que correspon aproximadament a do3
	movwf		ValPR2		; Ho posem com a valor de PR2
	movlw		.109		; 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
	movf		V5,w		; posa el valor de la variable V5 a l'acumulador
	movlw		b'00000001'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	movf		V1,w		; posa el valor de la variable V1 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	movlw		.238		; Valor que correspon aproximadament a do3
	movwf		ValPR2		; Ho posem com a valor de PR2
	movlw		.109		; 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
	movlw		b'00000001'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	clrf		PORTB		; posa tots els bits del PORTB a 0
	movf		V9,w		; posa el valor de la variable V9 a l'acumulador
	movwf		PORTC		; posa el valor de l'acumulador al PORTC
	movlw		.178		; Valor que correspon aproximadament a do3
	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
	movlw		b'00000011'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	clrf		PORTC		; posa tots els bits del PORTC a 0
	movf		V3,w		; posa el valor de la variable V3 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	movlw		.141		; Valor que correspon aproximadament a do3
	movwf		ValPR2		; Ho posem com a valor de PR2
	movlw		.71		; Valor que correspon a un cicle del 50 %
	movwf		ValCCPR1L	; Valor de CCPR1L
	movlw		.0		; Valor dels bits de menys pes del CCP
	movwf		ValDC1B		; Valor de DC1B
	movlw		b'00001111'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	movf		V5,w		; posa el valor de la variable V5 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	movlw		.178		; Valor que correspon aproximadament a do3
	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
	movlw		b'00000011'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	movf		V7,w		; posa el valor de la variable V7 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	movlw		.178		; Valor que correspon aproximadament a do3
	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
	movlw		b'00000001'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	clrf		PORTB		; posa tots els bits del PORTB a 0
	movf		V1,w		; posa el valor de la variable V1 a l'acumulador
	movwf		PORTC		; posa el valor de l'acumulador al PORTC
	movlw		.189		; Valor que correspon aproximadament a do3
	movwf		ValPR2		; Ho posem com a valor de PR2
	movlw		.95		; Valor que correspon a un cicle del 50 %
	movwf		ValCCPR1L	; Valor de CCPR1L
	movlw		.0		; Valor dels bits de menys pes del CCP
	movwf		ValDC1B		; Valor de DC1B
	movlw		b'00000001'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	clrf		PORTC		; posa tots els bits del PORTC a 0
	movf		V9,w		; posa el valor de la variable V9 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	movlw		.189		; Valor que correspon aproximadament a do3
	movwf		ValPR2		; Ho posem com a valor de PR2
	movlw		.95		; Valor que correspon a un cicle del 50 %
	movwf		ValCCPR1L	; Valor de CCPR1L
	movlw		.0		; Valor dels bits de menys pes del CCP
	movwf		ValDC1B		; Valor de DC1B
	movlw		b'00000001'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	movf		V5,w		; posa el valor de la variable V5 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	movlw		.212		; Valor que correspon aproximadament a do3
	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
	movlw		b'00000001'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	movf		V1,w		; posa el valor de la variable V1 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	movlw		.212		; Valor que correspon aproximadament a do3
	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
	movlw		b'00000001'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	clrf		PORTB		; posa tots els bits del PORTB a 0
	movf		V9,w		; posa el valor de la variable V9 a l'acumulador
	movwf		PORTC		; posa el valor de l'acumulador al PORTC
	movlw		.238		; Valor que correspon aproximadament a do3
	movwf		ValPR2		; Ho posem com a valor de PR2
	movlw		.109		; 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
	movlw		b'00001111'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	clrf		PORTC		; posa tots els bits del PORTC a 0
	movf		V3,w		; posa el valor de la variable V3 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	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
	movlw		b'00000001'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	movf		V5,w		; posa el valor de la variable V5 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	movlw		.133		; Valor que correspon aproximadament a do3
	movwf		ValPR2		; Ho posem com a valor de PR2
	movlw		.67		; Valor que correspon a un cicle del 50 %
	movwf		ValCCPR1L	; Valor de CCPR1L
	movlw		.0		; Valor dels bits de menys pes del CCP
	movwf		ValDC1B		; Valor de DC1B
	movlw		b'00000001'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	movf		V7,w		; posa el valor de la variable V7 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	movlw		.141		; Valor que correspon aproximadament a do3
	movwf		ValPR2		; Ho posem com a valor de PR2
	movlw		.71		; Valor que correspon a un cicle del 50 %
	movwf		ValCCPR1L	; Valor de CCPR1L
	movlw		.0		; Valor dels bits de menys pes del CCP
	movwf		ValDC1B		; Valor de DC1B
	movlw		b'00000001'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	clrf		PORTB		; posa tots els bits del PORTB a 0
	movf		V1,w		; posa el valor de la variable V1 a l'acumulador
	movwf		PORTC		; posa el valor de l'acumulador al PORTC
	movlw		.158		; Valor que correspon aproximadament a do3
	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
	movlw		b'00000001'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	clrf		PORTC		; posa tots els bits del PORTC a 0
	movf		V9,w		; posa el valor de la variable V9 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	movlw		.178		; Valor que correspon aproximadament a do3
	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
	movlw		b'00001111'	; configurar la llargada de la nota
	movwf		Llargada
	call		nota		; toca la nota configurada
	movf		V5,w		; posa el valor de la variable V5 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	goto		Bucle2		; Va al Bucle2
Seq2					; Fa la seqüència sense música i més curta.
					; Pot servir si ens cansem de la música o si hi ha molta tensió.
	clrf		PORTC
	clrf		PORTB
	movf		V1,w		; posa el valor de la variable V1 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	call		RetM		; crida el Retard
	clrf		PORTB		; posa tots els bits del PORTB a 0
	movf		V9,w		; posa el valor de la variable V9 a l'acumulador
	movwf		PORTC		; posa el valor de l'acumulador al PORTC
	call		RetM		; crida el Retard
	clrf		PORTC		; posa tots els bits del PORTC a 0
	movf		V3,w		; posa el valor de la variable V3 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	call		RetM		; crida el Retard
	movf		V5,w		; posa el valor de la variable V5 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	call		RetM		; crida el Retard
	movf		V7,w		; posa el valor de la variable V7 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	call		RetM		; crida el Retard
	clrf		PORTB		; posa tots els bits del PORTB a 0
	movf		V1,w		; posa el valor de la variable V1 a l'acumulador
	movwf		PORTC		; posa el valor de l'acumulador al PORTC
	call		RetM		; crida el Retard
	clrf		PORTC		; posa tots els bits del PORTC a 0
	movf		V9,w		; posa el valor de la variable V9 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	call		RetM		; crida el Retard
	movf		V5,w		; posa el valor de la variable V5 a l'acumulador
	movwf		PORTB		; posa el valor de l'acumulador al PORTB
	call		RetM		; crida el Retard
	goto		Bucle2		; Va al Bucle2
nota					; Toca la nota configurada
	movlw		b'00100000'	; Definim el tempo
	movwf		Retard1
	movwf		Retard2
	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 dona 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
	btfsc		Llargada,0	; si el bit 0 de la variable n1 està activat s'encen el número 1
	call		RetM		; Espera
	btfsc		Llargada,1	; si el bit 1 de la variable n1 està activat s'encen el número 2
	call		RetM		; Espera
	btfsc		Llargada,2	; si el bit 2 de la variable n1 està activat s'encen el número 3
	call		RetM		; Espera
	btfsc		Llargada,3	; si el bit 3 de la variable n1 està activat s'encen el número 4
	call		RetM		; Espera
	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		RetM		; Espera
	return
RetM					; Funció de retard
	decfsz		Retard1,f
	goto		RetM
	decfsz		Retard2,f
	goto		RetM
	return
	end

 

 

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