Programació en mpasm del PIC 16F690

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

Monitor cardíac

Programa del grup 1

En el programa d'aquest grup, a part dels missatges que es presenten a l'usuari, destaca el símbol d'un cor representat a partir de sis caràcters especials

cor

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)
#define	ValComp	.6	; Nombre de repeticions per eliminar soroll
	cblock 0x20	; Zona de memòria de dades habitual
PolsosTotals		
Retard1			; Retard1 per mantenir el led ences
Retard2			; Retard2 per mantenir el led ences
Retard3			; Retard2 per mantenir el led ences
NumPols15		; comptador polsos en 15 segons
Premut			; Variable 0 si NO està premut i 1 si està premut.
D1			; Variable unitats	
D2			; Variable desenes	
D3			; Variable centenes	
Lectura			; Valor llegit a l'entrada analògica
Comptador:2		; Variable per comptar de 7500 fins a 0
Temps:2			; S'incrementa cada cop que es fa la interrupció (cada 2 ms)	
Max			; Valor màxim del senyal en un període	
Min			; Valor mínim del senyal en un període	
Centre			; Valor mig del senyal en un període	
Periode:2		; Quart de període
			; Guarda la meitat del nombre d'interrupcions entre dos inicis de pols
Comp			; Comptador per filtrar soroll
Control			; Bits de control (port B)
Leds
Caracter		; Caràcter o codi a enviar (port C)
Prov			; Provisional
Combi			; Per tal de que funcioni Led i pantalla alhora
Bits			; Variable on guardarem els bits d'estat que fem servir	
			;	Pols	Bits,0	S'activa quan el senyal està per sobre del valor mig
			;	Tenim1	Bits,3	S'activa quan ja hem detectat l'inici del primer pols
			; 	Estable	Bits,2	S'activa quan ja hem detectat l'inici del segon pols
			;			i, per tant, ja tenim dades útils
			;		Bits,7  S'activa al apretar el polsador, es desactiva quan 
			;			acaba el compte ensrere 
			;	Mis.    Bits,5  S'activa quan volem mostrar el missatge d'ERROR.
			;		Bits,1	S'activa quan es completa la lectura completament
			;		Bits,4	Pel comptador
W_Copia			; Guardarà el contingut de W durant la interrupció
ST_Copia		; Guardarà STATUS durant la interrupció	
	endc
	org 0
	goto	Inici		; Saltem al lloc on hi ha el programa principal
	nop			; Zona de memòria de programa que no utilitzem
	nop
	nop
Interrup
	bcf	INTCON,GIE	; Desactiva les interrupcions momentàniament
	movwf	W_Copia		; Copiem l'acumulador a W_Copia
	swapf	STATUS,w	; Copiem STATUS a l'acumulador permutant els nibbles
	clrf	STATUS		; Posa a 0 i així segur que el banc és el 0
	movwf	ST_Copia	; Guarda STATUS permutat a ST_Copia
	btfss	INTCON,T0IF	; Mira si Timer0 ha arribat a zero
				; Si hi ha arribat, no fa la instrucció següent
	goto	FiInt0		; Si la interrupció no és del Timer0 no fem res
Timer0				; Programa corresponent a Timer0
	movlw	.7		; Nova preselecció
	movwf	TMR0		; Ho posem a TMR0
	bcf	INTCON,T0IF	; Si ha arribat, desactivem el bit
				; Llegim el sensor		
	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
	movf	ADRESH,w	; Llegeix el valor (8 bits)
	movwf	Lectura		; I el guarda
	incf	Temps,f		; Incrementem Temps
	btfsc	STATUS,Z	; Si s'activa Z vol dir que hem incrementat un 255
	incf	Temps+1,f	; Si s'activa, incrementem el byte superior
	movf	Centre,w
	subwf	Lectura,w	; W = Lectura - Centre
	btfss	STATUS,C	; C = 1 si Lectura >= Centre
	goto	baix		; Lectura < Centre
				; Lectura >= Centre
	movf	Max,w
	subwf	Lectura,w	; W = Lectura - Max
	btfss	STATUS,C	; C = 1 si Lectura >= Max
	goto	mirapols	; Lectura < Max
				; Lectura >= Max
	movf	Lectura,w
	movwf	Max		; Guarda el nou màxim
	goto	mirapols	; Passem a la segona part
baix				; Lectura < Centre
				; Anem a mirar si Temps:2 > Periode:2
				; Si Temps+1 > Periode+1 segur que sí
				; Si Temps+1 < Periode+1 segur que no
				; Si Temps+1 = Periode+1 cal comprovar si Temps > Periode
	movf	Periode+1,w	
	subwf	Temps+1,w	; W = Temps+1 - Periode+1
	btfss	STATUS,C	; C = 1 si Temps+1 >= Periode+1
	goto	mirapols	; Temps+1 < Periode+1
				; Temps+1 >= Periode+1
	movf	Periode+1,w	
	xorwf	Temps+1,w	; Ho comparem amb Temps+1
	btfss	STATUS,Z
	goto	miramin		; Si són diferents és que Temps+1 > Periode+1
	movf	Periode,w
	subwf	Temps,w		; W = Temps - Periode
	btfss	STATUS,C	; C = 1 si Temps >= Periode
	goto	mirapols	; Temps < Periode
miramin				; Temps >= Periode
	movf	Min,w
	subwf	Lectura,w	; W = Lectura - Min
	btfsc	STATUS,C	; C = 1 si Lectura >= Min
	goto	mirapols	; Lectura >= Min
				; Lectura < Min
	movf	Lectura,w
	movwf	Min		; Guarda el nou mínim
mirapols
	btfsc	Bits,0		; Mira si Pols està activat
	goto	activat		; Sí ho està
	movf	Centre,w
	subwf	Lectura,w	; W = Lectura - Centre
	btfss	STATUS,C	; C = 1 si Lectura >= Centre
	goto	miratemps	; Lectura < Centre
				; Lectura >= Centre
				; Anem a mirar si Temps:2 > Periode:2
				; Si Temps+1 > Periode+1 segur que sí
				; Si Temps+1 < Periode+1 segur que no
				; Si Temps+1 = Periode+1 cal comprovar si Temps > Periode
	movf	Periode+1,w
	subwf	Temps+1,w	; W = Temps+1 - Periode+1
	btfss	STATUS,C	; C = 1 si Temps+1 >= Periode+1
	goto	miratemps	; Temps+1 < Periode+1
				; Temps+1 >= Periode+1
	movf	Periode+1,w
	xorwf	Temps+1,w	; Ho comparem amb Temps+1
	btfss	STATUS,Z
	goto	sipols		; Si són diferents és que Temps+1 > Periode+1
	movf	Periode,w
	subwf	Temps,w		; W = Temps - Periode
	btfss	STATUS,C	; C = 1 si Temps >= Periode
	goto	miratemps	; Temps < Periode
sipols
	decfsz	Comp,f		; Decrementa Comp
	goto	miratemps	; Si no ha arribat a zero, ja estem
	bsf	Bits,0		; Activa Pols
	
	incf	NumPols15,f	; +1 comptador polsos 15 segons
	
	movf	Temps+1,w
	movwf	Periode+1	; Periode+1 = Temps+1
	movf	Temps,w
	movwf	Periode		; Periode = Temps
	bcf	STATUS,C	; Volem entrar un zero
	rrf	Periode+1,f	; Dividim Periode per 2
	rrf	Periode,f
	clrf	Temps		; Posem Temps a zero
	clrf	Temps+1		; Posem Temps+1 a zero
	movlw	ValComp		; Nombre de repeticions per eliminar soroll
	movwf	Comp		; Ho posa a Comp
	btfss	Bits,3		; Mira si Tenim1 està activat
	goto	tenimpols	; Si no ho està, l'activa i surt
	btfss	Bits,2		; Mira si Estable està activat
	bsf	Bits,2		; Si no ho estava, l'activa
	goto	miratemps
activat
	movf	Centre,w
	subwf	Lectura,w	; W = Lectura - Centre
	btfsc	STATUS,C	; C = 1 si Lectura >= Centre
	goto	miratemps	; Lectura > Centre
				; Lectura <= Centre
	decfsz	Comp,f		; Decrementa Comp
	goto	miratemps	; Si no ha arribat a zero, ja estem
	bcf	Bits,0		; Desactiva Pols
	movf	Min,w
	movwf	Centre		; Guarda Min, provisionalment, a Centre
	movf	Max,w
	addwf	Centre,f	; Centre = Max + Min
				; Si ens en portem, quedarà a C
	rrf	Centre,f	; Dividim la resta per dos (les que portem entren per l'esquerra)
	movf	Centre,w	; El resultat queda a Centre
	movwf	Max		; I el copiem a Max
	movwf	Min		; i a Min
	movlw	ValComp		; Nombre de repeticions per eliminar soroll
	movwf	Comp		; Ho posa a Comp
miratemps
	movlw	.4		; Equival a menys de 30 pulsacions per minut
	subwf	Temps+1,w	; W = Temps+1 - 4
	btfss	STATUS,C	; C = 1 si Temps+1 >= 4
	goto	FiInt0		; Temps+1 < 4
reinici
	clrf	Bits		
	clrf	Leds
	clrf	NumPols15
	clrf	PolsosTotals
	clrf	Periode		; Posem Periode a zero
	clrf	Periode+1	; Posem Periode+1 a zero
	clrf	Temps		; Posem Temps a zero
	clrf	Temps+1		; Posem Temps+1 a zero
	movlw	.127		; Valor central del conversor (255/2)
	movwf	Centre		; Ho posa a Centre
	movwf	Max		; Ho posa a Max
	movwf	Min		; Ho posa a Min
	movlw	ValComp		; Nombre de repeticions per eliminar soroll
	movwf	Comp		; Ho posa a Comp
	movlw	b'01001100'	; part de la dreta de 7500
	movwf	Comptador	
	movlw	b'00011101'	; part de l'esquerra de 7500
	movwf	Comptador+1
	goto	FiInt0
tenimpols
	bsf	Bits,3		; Si no ho estava, l'activa
				; Aquí comença "comptador de quinze segons"
FiInt0
	btfsc	Bits,2		; Mira si el pols és estable, 
	bsf	Bits,5		; si no ho és activa Bits 5 per mostrar error.
	btfsc	Bits,7		; Mira si està activat el polsador (Bit 7)
	goto 	IniciComptador	; Si està premut, anem a esEstable
	goto	FiInt01		; Si NO esta premut, anem a FiInt01
ReiniciPols
	clrf	NumPols15
	bcf	Bits,4
IniciComptador
	btfsc	Bits,4
	goto	ReiniciPols
	movf	Comptador,f	; Copiem Comptador sobre ell mateix per veure si és 0
	btfsc	STATUS,Z	; Mirem si s'activa Z
	decf	Comptador+1,f	; Si s'activa, decrementem l byte superior
	decf	Comptador,f	; Decrementem el byte de la dreta
	btfsc	STATUS,Z
	goto	ZeroTotal
	goto    FiInt01
ZeroTotal
	movf	Comptador+1,f	;  Copiem Comptador+1 sobre ell mateix per veure si és 0
	btfsc	STATUS,Z
	goto	Encendre
	goto	FiInt01
Encendre
	bcf     STATUS,C
	rlf     NumPols15,f	; multipliquem x2 i guardem a la variable
	bcf     STATUS,C
	rlf     NumPols15,w	; multipliquem x2 i guardem a l'acumulador
	movwf 	PolsosTotals	; copiem el resultat de x4 a PolsosTotals
	bsf	Leds,1
	movf	Leds,w
	movwf	PORTC
	movlw	5
	call	Rets
Apaga	
	bcf	Leds,1
	movf	Leds,w
	movwf	PORTC
	bsf	Bits,1
FiInt01	
	movf	Bits,w		; Agafa el valor de Bits
	andlw	b'00001101'
	movwf	Prov
	movf	Leds,w
	andlw	b'00000010'
	iorwf	Prov,w
	movwf	Leds
	movf	Leds,w
	movwf	PORTC		; Ho posa al port C; Només actúa el bit 0 (Pols)
	swapf	ST_Copia,w	; Copia permutant ST_Copia a l'acumulador
	movwf	STATUS		; I ho passa a STATUS recuperant el valor d'abans
				; de la interrupció
	swapf	W_Copia,f	; Permuta els bits de W_Copia
	swapf	W_Copia,w	; Torna a permutar els bits de W_Copia
				; i els guarda a l'acumulador sense variar STATUS
	bsf	INTCON,GIE	; Reactiva les interrupcions a l'acabar
	retfie			; Torna al programa principal, on s'havia quedat
Inici
	bsf	STATUS,RP0	; Tria el banc 1
	movlw	b'10000010'	; Configuració de Timer0
				; Com a temporitzador basat en rellotge
				; 010 - Factor d'escala de 8
				; I resistències de pull-up desactivades (valor per defecte)
	movwf	OPTION_REG	; Ho guarda al registre de configuració del Timer0
	movlw	0xFF		; Posa l'acumulador a FFh (tot uns)
	movwf	TRISA		; Posa tots els bits del port A com a entrada
	clrf	TRISB		; Tot el port B és de sortida
	clrf	TRISC		; Tot el port C és de sortida
	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	b'00000101'
	movwf	ANSEL		; Configura port AN0 i AN2 com entrades analògiques
	bcf	STATUS,RP1	; Tria el banc 0
	movlw	.5
	call	Rets
	call	IniPant
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	call	ConfPant
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	call	missatgeIni
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
				; Caràcters especial 1
	movlw	0x00		; Adreça CGRAM
	iorlw	b'01000000'	; Posa el bit de CGRAM a 1
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaC		; Ho envia
	movlw	b'00000000'	; Primera filera
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000000'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000001'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000011'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000111'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000111'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000111'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000111'	; Darrera filera
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
				; Fi caràcters especial 1			
				; Caràcters especial 2
	movlw	0x08		; Adreça CGRAM
	iorlw	b'01000000'	; Posa el bit de CGRAM a 1
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaC		; Ho envia
	movlw	b'00000000'	; Primera filera
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000000'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00010001'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00011011'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00011111'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00011111'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00011111'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00011111'	; Darrera filera
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
				; Fi caràcters especial 2
				; Caràcters especial 3
	movlw	0x10		; Adreça CGRAM
	iorlw	b'01000000'	; Posa el bit de CGRAM a 1
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaC		; Ho envia
	movlw	b'00000000'	; Primera filera
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000000'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00010000'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00011000'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00011100'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00011100'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00011100'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00011100'	; Darrera filera
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
				; Fi caràcters especial 3
				; Caràcters especial 4
	movlw	0x18		; Adreça CGRAM
	iorlw	b'01000000'	; Posa el bit de CGRAM a 1
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaC		; Ho envia
	movlw	b'00000111'	; Primera filera
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000011'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000001'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000000'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000000'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000000'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000000'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000000'	; Darrera filera
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
				; Fi caràcters especial 4	
				; Caràcters especial 5
	movlw	0x20		; Adreça CGRAM
	iorlw	b'01000000'	; Posa el bit de CGRAM a 1
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaC		; Ho envia
	movlw	b'00011111'	; Primera filera
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00011111'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00011111'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00011111'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00001110'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000100'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000000'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000000'	; Darrera filera
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
				; Fi caràcters especial 5
				; Caràcters especial 6
	movlw	0x28		; Adreça CGRAM
	iorlw	b'01000000'	; Posa el bit de CGRAM a 1
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaC		; Ho envia
	movlw	b'00011100'	; Primera filera
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00011000'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00010000'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000000'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000000'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000000'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000000'
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	b'00000000'	; Darrera filera
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
					; Fi caràcters especial 6
	movlw	b'01001100'	; part de la dreta de 7500
	movwf	Comptador	
	movlw	b'00011101'	; part de l'esquerra de 7500
	movwf	Comptador+1
	movlw	b'00001001'	; activa el conversor A/D connectat a AN2
	movwf	ADCON0		; amb el resultat justificat per l'esquerra
				; Inicialització de variables
	clrf	Bits		; Posa tots els bits a zero
	clrf	Leds
	clrf	Periode		; Posem Periode a zero
	clrf	Periode+1	; Posem Periode+1 a zero
	clrf	Temps		; Posem Temps a zero
	clrf	Temps+1		; Posem Temps+1 a zero
	clrf	NumPols15	; Posem NumPols15 a zero
	movlw	.127		; Valor central del conversor (255/2)
	movwf	Centre		; Ho posa a Centre
	movwf	Max		; Ho posa a Max
	movwf	Min		; Ho posa a Min
				; Configurem el Timer i activem interrupcions
	movlw	ValComp		; Nombre de repeticions per eliminar soroll
	movwf	Comp		; Ho posa a Comp
	movlw	.7		; Presselecció de 7, que són 249 iteracions
	movwf	TMR0		; Ho posa com a preselecció del temporitzador
	movlw	b'10100000'	; Activem GIE i T0IE
	movwf	INTCON		; Activa les interrupcions globals i la de Timer0
Bucle	
	btfss	PORTA,3		; Mira si està activada l'entrada A3 (Polsador)
	bsf	Bits,7
	btfss	Bits,7
	bsf	Bits,4
	btfss	Bits,5
	call	missatgeError
	btfsc	Bits,1
	call	missatgeCorrecte
	goto	Bucle		; En el bucle no hi ha res	
missatgeIni
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	call	ConfPant	; Configuració de la pantalla
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	movlw	0x00		; Adreça DDRAM (Filera 1 - Posició 1)
	iorlw	b'10000000'	; Posa el bit de DDRAM a 1
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaC		; Ho envia
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	movlw	'P'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'r'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'e'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'm'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	' '		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'e'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'l'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	' '		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'p'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'o'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'l'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	's'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'a'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'd'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'o'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'r'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	0x40		; Adreça DDRAM (2 - 1)
	iorlw	b'10000000'	; Posa el bit de DDRAM a 1
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaC		; Ho envia
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	movlw	' '		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'p'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'e'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'r'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	' '		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'i'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'n'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'i'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'c'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'i'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'a'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'r'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	' '		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	':'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'D'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	bcf	Bits,4	    
	return
missatgeError
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	call	ConfPant
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	movlw	0x00		; Adreça DDRAM (Filera 1 - Posició 1)
	iorlw	b'10000000'	; Posa el bit de DDRAM a 1
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaC		; Ho envia
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	movlw	'E'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'R'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'R'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'O'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'R'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	.15		; 
	call	Rets		; Crida a la funció Rets (1s)
	bcf	Bits,5
	call	missatgeIni
	return
missatgeCorrecte
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	call	ConfPant
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	movlw	0x00		; Adreça DDRAM (Filera 1 - Posició 1)
	iorlw	b'10000000'	; Posa el bit de DDRAM a 1
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaC		; Ho envia
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	movlw	'E'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	's'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	't'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'u'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'd'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'i'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	' '		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'c'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'o'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'r'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'r'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'e'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'c'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	't'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'e'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	.10		; 
	call	Rets		; Crida a la funció Rets (2s)
	call	MostraPols
	bcf     Bits,1	
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	call	Reinici2
	call	missatgeIni
	return
MostraPols
	movf    PolsosTotals,w 
	call	BCD
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	call	ConfPant
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	movlw	0x00		; Adreça DDRAM (Filera 1 - Posició 1)
	iorlw	b'10000000'	; Posa el bit de DDRAM a 1
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaC		; Ho envia
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	movf	D3,f	; Si pols < 100 no volem que surti un 0 a l'inici
	btfsc	STATUS,Z
	goto	Zero
NoZero
	movlw	'0'		; Carrega el codi ASCII del número 0
	addwf	D3,f	
	movf	D3,w		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	goto	MostraPols2
Zero
	movlw	' '		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
MostraPols2
	movlw	'0'		; Carrega el codi ASCII del número 0
	addwf	D2,f	
	movf	D2,w		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'0'		; Carrega el codi ASCII del número 0
	addwf	D1,f	
	movf	D1,w		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	' '		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'p'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'o'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'l'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	's'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'/'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'm'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'i'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	'n'		; Lletra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia	
				; Dibuixem el cor
	movlw	0x0D		; Adreça DDRAM (1 - 16)
	iorlw	b'10000000'	; Posa el bit de DDRAM a 1
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaC		; Ho envia
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	movlw	0x00		; Caràcter especial
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	0x01		; Caràcter especial
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	0x02		; Caràcter especial
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	0x4D		; Adreça DDRAM (2 - 15)
	iorlw	b'10000000'	; Posa el bit de DDRAM a 1
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaC		; Ho envia
	movlw	0x03		; Caràcter especial
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	0x04		; Caràcter especial
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	0x05		; Caràcter especial
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaL		; Ho envia
	movlw	.45		; 
	call	Rets		; Crida a la funció Rets (9s)
	return
				; Funció que converteix un número de 8 bits a BCD (3 dígits)
				;
BCD	
	clrf	D3		; Posa D3 (centenes) a zero
	clrf	D2		; Posa D2 (desenes) a zero
	movwf	D1		; Guarda W (valor a convertir) a D1 
				; D1 són les unitats
Cent				; Anem a trobar les centenes (D3)
	movlw	.100		; Carrega 100 decimal a W
	subwf	D1,w		; Li resta W a D1
	btfss	STATUS,C	; Mira C i si és 1 no fa la següent
				; Si és 1 vol dir resultat positiu
	goto	Desen		; Si el resultat és negatiu les centenes ja estan
				; el valor de W es perd i anem a les desenes
	movwf	D1		; Guarda el resultat (W) a D1
	incf	D3,f		; La centena restada a D1 l'afegeix a D3
	goto	Cent		; Tornem-ho a fer
Desen				; Anem a trobar les desenes
	movlw	.10		; Carrega 10 decimal a W
	subwf	D1,w		; Li resta W a D1
	btfss	STATUS,C	; Mira C i si és 1 no fa la següent
				; Si és 1 vol dir resultat positiu
	goto	Final		; Si el resultat és negatiu les desenes ja estan
				; el valor de W es perd i anem a ASCII
	movwf	D1		; Guarda el resultat (W) a D1
	incf	D2,f		; La desena restada a D1 l'afegeix a D2
	goto	Desen		; Tornem-ho a fer
Final
	retlw	0		; Retorn amb un 0 a W
IniPant					
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	movlw	b'00100000'	; Function set - Configuració inicial  0010 al nibble de l'esquerra
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaI		; Envia els 4 bits superiors
					; Ara enviem la configuració 2 línea, 5x8 píxels  0010 1000
	call	EnviaI		; Enviem la part esquerra (ja ho teníem a Caracter)
	movlw	b'10000000'	; I ara la part dreta (però posada a l'esquerra)
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaI		; Envia els 4 bits superiors
	return			; Fi de la inicialització del mode de funcionament
				;
				; Configuració de la pantalla
				;
ConfPant				
	movlw	b'00001111'	; Display ON/OFF control - Activa la pantalla amb cursor intermitent
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaC		; Ho envia
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	movlw	b'00000001'	; Clear display - Buida la pantalla i inicialitza
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaC		; Ho envia
	movlw	.5		; El punt indica que es un valor decimal
					; Comença un cicle de durada fixa (3,9 ms)
	call	Rets		; Crida a la funció Retard, el paràmetre està a W
	movlw	b'00000110'	; Entry mode - Buida la pantalla, sentit dreta i despl. automàtic
	movwf	Caracter	; Ho guarda a la variable
	call	EnviaC		; Ho envia
	movlw	1		; 
	call	Rets		; Crida a la funció Rets (0,2s)
	return			; Fi de la configuració de la pantalla
EnviaC				; Enviem caràcters de control
	bcf	Control,7	; Desactiva E
	bcf	Control,5	; Desactiva RS
	goto	Envia
EnviaL				; Enviem caràcters a visualitzar
	bcf	Control,7	; Desactiva E
	bsf	Control,5	; Activa RS
Envia	
	call	EnviaN		; Envia els 4 bits més alts
	swapf	Caracter,f	; Permuta els nibbles
	call	EnviaN		; Envia els 4 bits més alts
	swapf	Caracter,f	; Torna a deixar els nibbles com estaven
	return			; Tornem al lloc des d'on hem vingut
EnviaI					; Enviem nibbles de caràcters de control
	bcf	Control,7	; Desactiva E
	bcf	Control,5	; Desactiva RS
EnviaN					; Enviem nibbles
	decfsz	Retard1,f	; Funció de retard de 0,8 ms
	goto	EnviaN
	movf	Control,w	; Copia Control a l'acumulador
	movwf	PORTB		; I ho posa al PORTB
	nop			; Espera 1 us
	nop			; Espera 1 us
	nop			; Espera 1 us
	movf	Caracter,w	; Llegeix el caràcter
	andlw	0xF0		; Agafa els 4 bits més alts
	movwf	Combi
	movf	Leds,w
	andlw	0x0F
	iorwf	Combi,w
	movwf	PORTC		; Envia el byte
	bsf	Control,7	; Activa E
	movf	Control,w	; Copia Control a l'acumulador
	movwf	PORTB		; I ho posa al PORTB
	nop			; Espera 1 us
	nop			; Espera 1 us
	nop			; Espera 1 us
	nop			; Espera 1 us
	nop			; Espera 1 us
	bcf	Control,7	; Desactiva E
	movf	Control,w	; Copia Control a l'acumulador
	movwf	PORTB		; I ho posa al PORTB
	return			; Tornem al lloc des d'on hem vingut
				;
				; Funció Retard, W conté el nombre de cicles de 771 us que cal fer
				;	
Reinici2	
	clrf	Bits		
	clrf	Leds
	clrf	NumPols15
	clrf	PolsosTotals
	;clrf	Acum
	movlw	b'01001100'	; part de la dreta de 7500
	movwf	Comptador	
	movlw	b'00011101'	; part de l'esquerra de 7500
	movwf	Comptador+1
	return
Rets
	movwf	Retard3
Bucles
	decfsz	Retard1,f		
	goto	Bucles		
	decfsz	Retard2,f		
	goto	Bucles		
	decfsz	Retard3,f	
	goto	Bucles
	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.