Programació en mpasm del PIC 16F690

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

Sensor de temperatura i humitat

Programa del grup 2

El grup 2 va fer un programa amb la següent presentació a la pantalla:

pantalla

Addicionalment, els LED indiquen si la temperatura o la humitat han sortit fora d'uns màxims i mínims que han establert.

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
Compta		; Comptador d'iteracions
Temp		; Variable temporal
Valor:2		; Valor d'entrada (16 bits)
Resul:5		; Valor de sortida
Port		; Valor a escriure al port A
Temps		; Variable per a guardar-hi el temps
Bits		; Compta els bits que es van rebent
Control		; Bits de control (port B)
Caracter	; Caràcter o codi a enviar (port C)
Retard1		; Variables per als cicles de retard
Retard2
ComparaH
ComparaT
Leds
Comparak
Humit:2		; Valor de la humitat relativa (en %) multiplicat per 10
Temper:2	; Valor de la temperatura (en °C) multiplicat per 10
Check		; Suma de comprovació de la lectura del sensor
	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
	bcf		TRISA,2		; De moment, RA2 és sortida
	clrf		TRISB		; Tot el port B és de sortida
	clrf		TRISC		; Tot el port C és de sortida
	movlw		b'10000000'	; Configuració de Timer0
					; Com a temporitzador basat en rellotge
					; 000 - Factor d'escala de 2
					; TMR0 s'incrementarà cada 2 us
					; I resistències de pull-up desactivades (valor per defecte)
	movwf		OPTION_REG	; Ho guarda al registre de configuració del Timer0
	bcf		STATUS,RP0
	bsf		STATUS,RP1	; Tria el banc 2
	movlw		b'11111011'
	movwf		ANSEL		; Posa AN2 (RA2) com entrada binària
	bcf		STATUS,RP0
	bcf		STATUS,RP1	; Tria el banc 0
	movlw		b'00000100'	; PORTA,2 és on hi ha el sensor
	movwf		Port		; Ho guardem a la variable Port
	movwf		PORTA		; I ho copiem al port A
	call		IniPant
Bucle
	call		ConfPant	; Configuració de la pantalla
	call		Llegir		; Llegeix els valors del sensor
	andlw		0xFF		; Anem a veure si W és zero
	btfss		STATUS,Z	; Si és zero, and donarà zero
	goto		Bucle		; No és zero, tornem a llegir
					; És zero, lectura correcta
	movlw		0x07		; 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
	movf		Temper+1,w	; Llegeix el byte més significatiu de la temperatura
	movwf		Valor+1		; Ho prepara per convertir-ho a BCD
	movf		Temper,w	; Llegeix el byte menys significatiu de la temperatura
	movwf		Valor		; Ho prepara per convertir-ho a BCD
	call		BCD5		; Ho converteix en BCD en 3 bytes
	call		SeparaH		; Ho separem en 5 bytes
	call		EscPant5	; Ho enviem a la pantalla
	movf		ComparaT,w
	movwf		Comparak
	movlw		0x47		; Adreça DDRAM (Filera 2 - Posició 1)
	iorlw		b'10000000'	; Posa el bit de DDRAM a 1
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaC		; Ho envia
	movf		Humit+1,w	; Llegeix el byte més significatiu de la humitat
	movwf		Valor+1		; Ho prepara per convertir-ho a BCD
	movf		Humit,w		; Llegeix el byte menys significatiu de la humitat
	movwf		Valor		; Ho prepara per convertir-ho a BCD
	call		BCD5		; Ho converteix en BCD en 3 bytes
	call		SeparaH		; Ho separem en 5 bytes
	call		EscPant5	; Ho enviem a la pantalla
	clrf		Leds		; Els Leds
	movf		Comparak,w	; guardem el valor de Compara a W (acumulador)
	sublw		.6		; li resto dos al acumulador
	btfss		STATUS,C	; comparo. Si es positiu fa la funcio seguent, sino salta la funció següent
					; (shift set (set=1=)).Aquesta funció només salta la pròxima línia de text.
	call		Ledstempmax	; pos eso
	call		Retard		; Crida a la funció Retard, el paràmetre està a W
	movf		Comparak,w	; guardem el valor de Compara a W (acumulador)
	sublw		.6		; li resto dos al acumulador
	btfsc		STATUS,C	; comparo. Si es NO positiu fa la funcio seguent, sino salta la funció següent
					; (shift set (set=1=)).Aquesta funció només salta la pròxima línia de text.
	call		Ledstempmin	; pos eso
	call		Retard		; Crida a la funció Retard, el paràmetre està a W
	movf		ComparaH,w	; guardem el valor de Compara a W (acumulador)
	sublw		.7		; li resto dos al acumulador
	btfss		STATUS,C	; comparo. Si es positiu fa la funcio seguent, sino salta la funció següent (shift set (set=1=))
	call		Ledshummax	; pos eso
	call		Retard		; Crida a la funció Retard, el paràmetre està a W
	movf		ComparaH,w	; guardem el valor de Compara a W (acumulador)
	sublw		.5		; li resto dos al acumulador
	btfsc		STATUS,C	; comparo. Si es positiu fa la funcio seguent, sino salta la funció següent (shift set (set=1=))
	call		Ledshummin	; pos eso
	call		Retard		; Crida a la funció Retard, el paràmetre està a W
	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		'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		'M'		; 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		':'		; 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		'H'		; 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		0x0E		; 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		b'11011111'	; 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		0x4E		; 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		b'00100101'	; Lletra
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	call		Retard
	goto		Bucle
Llegir					; Llegeix els valors al sensor
					; Primer activem el funcionament del sensor
	bsf		STATUS,RP0	; Tria el banc 1
	bcf		TRISA,2		; Posem el pin com a sortida
	bcf		STATUS,RP0	; Tria el banc 0
	clrf		Humit+1		; Posa a zero les variables on ha d'anar la lectura
	clrf		Humit
	clrf		Temper+1	; Els primers bits de Humit+1 seran 0; així
	clrf		Temper		; si el bit de més a la dreta de Check el posem a 1
	movlw		0x01		; podrem veure on ha quedat aquest 1
	movwf		Check		; en cas que hi hagi una errada de lectura
	bcf		Port,2		; Posa la sortida a 0
	movf		Port,w		; Ho copia a W
	movwf		PORTA		; I ho envia al port
	movlw		.2		; Retard d'1,54 ms
	call		Retard		; Espera el temps
	bsf		Port,2		; Posa la sortida a 1
	movf		Port,w		; Ho copia a W
	movwf		PORTA		; I ho envia al port
	movlw		.5		; El retard serà de 3*5 = 15 us
	call		Retus
					; Un cop activat, esperem la resposta
	bsf		STATUS,RP0	; Tria el banc 1
	bsf		TRISA,2		; Posem el pin com a entrada
	bcf		STATUS,RP0	; Tria el banc 0
					; Esperem a rebre el pols d'inici
					; Primer un L d'uns 80 us
					; Per començar, s'ha de desactivar l'entrada
					; i s'ha de reactivar al cap d'entre 70 i 90 us
Esp0
	btfsc		PORTA,2		; S'ha desactivat l'entrada?
	goto		Esp0		; No, doncs esperem
	clrf		TMR0		; Comencem a comptar el temps
Esp1I					; Esperem que s'activi l'entrada
	btfsc		PORTA,2		; S'ha activat l'entrada?
	goto		ZeroIni		; Sí, doncs el zero inicial ja està
	movf		TMR0,w		; No, agafa el valor actual del temps
	movwf		Temps		; i el guarda
	movlw		.45		; Mirem que no passem de 90 us
	subwf		Temps,w		; W = Temps - W
	btfss		STATUS,C	; C = 1 si Temps >= 45
	goto		Esp1I		; És més petit, seguim esperant
	retlw		.1		; És més gran: Error 1 - Zero inicial massa llarg
ZeroIni					; El zero inicial ja està
					; Comprovem la durada
	movf		TMR0,w		; Agafa el valor actual del temps
	movwf		Temps		; i el guarda
	clrf		TMR0		; Comencem a comptar el temps per al següent
	movlw		.35		; Mirem que no sigui menor que 70 us
	subwf		Temps,w		; W = Temps - W
	btfss		STATUS,C	; C = 1 si Temps >= 35
	retlw		.2		; És més petit: Error 2 - Zero inicial massa curt
					; Ja tenim el zero inicial
					; Ara l'entrada està a u i esperem que es posi a zero
Esp0I					; Esperem a que es desactivi l'entrada
	btfss		PORTA,2		; S'ha desactivat l'entrada?
	goto		UIni		; Sí, doncs l'u inicial ja està
	movf		TMR0,w		; No, agafa el valor actual del temps
	movwf		Temps		; i el guarda
	movlw		.45		; Mirem que no passem de 90 us
	subwf		Temps,w		; W = Temps - W
	btfss		STATUS,C	; C = 1 si Temps >= 45
	goto		Esp0I		; És més petit, seguim esperant
	retlw		.3		; És més gran: Error 3 - U inicial massa llarg
UIni					; L'u inicial ja està
	movf		TMR0,w		; Agafa el valor actual del temps
	movwf		Temps		; i el guarda
	clrf		TMR0		; Comencem a comptar el temps per al següent
	movlw		.35		; Mirem que no sigui menor que 70 us
	subwf		Temps,w		; W = Temps - W
	btfss		STATUS,C	; C = 1 si Temps >= 35
	retlw		.4		; És més petit: Error 4 - U inicial massa curt
					; Ja tenim l'u inicial
					; Ara hem de rebre els bits
	movlw		.40		; Hem de rebre 40 bits
	movwf		Bits		; Aquesta variable els comptarà
BucBits					; Esperem a rebre un bit
					; Primer un L d'uns 80 us
					; Ara l'entrada està a zero
					; S'ha d'activar al cap d'entre 10 i 90 us
	clrf		TMR0		; Comencem a comptar el temps
Esp1B					; Esperem que s'activi l'entrada
	btfsc		PORTA,2		; S'ha activat l'entrada?
	goto		ZeroB		; Sí, doncs el valor 0 del bit ja està
	movf		TMR0,w		; No, agafa el valor actual del temps
	movwf		Temps		; i el guarda
	movlw		.45		; Mirem que no passem de 90 us
	subwf		Temps,w		; W = Temps - W
	btfss		STATUS,C	; C = 1 si Temps >= 45
	goto		Esp1B		; És més petit, seguim esperant
	retlw		.5		; És més gran: Error 5 - Valor 0 del bit massa llarg
ZeroB					; El valor 0 del bit ja està
	movf		TMR0,w		; Agafa el valor actual del temps
	movwf		Temps		; i el guarda
	clrf		TMR0		; Comencem a comptar el temps per al següent
	movlw		.5		; Mirem que no sigui menor que 10 us
	subwf		Temps,w		; W = Temps - W
	btfss		STATUS,C	; C = 1 si Temps >= 5
	retlw		.6		; És més petit: Error 6 - Valor 0 del bit massa curt
					; Ja tenim el valor 0 del bit. Ara esperem un 1
Esp0B					; Esperem a que es desactivi l'entrada
	btfss		PORTA,2		; S'ha desactivat l'entrada?
	goto		UB		; Sí, doncs el valor 1 del bit ja està
	movf		TMR0,w		; No, agafa el valor actual del temps
	movwf		Temps		; i el guarda
	movlw		.40		; Mirem que no passem de 80 us
	subwf		Temps,w		; W = Temps - W
	btfss		STATUS,C	; C = 1 si Temps >= 40
	goto		Esp0B		; És més petit, seguim esperant
	retlw		.7		; És més gran: Error 7 - Valor 1 del bit massa llarg
UB					; El valor 1 del bit ja està
	movf		TMR0,w		; Agafa el valor actual del temps
	movwf		Temps		; i el guarda
	clrf		TMR0		; Comencem a comptar el temps per al següent
					; Ja hem comprovat que no passi de 80 us
					; Si és més petit que 12 us és massa curt
	movlw		.6		; Mirem si és menor que 12 us
	subwf		Temps,w		; W = Temps - W
	btfss		STATUS,C	; C = 1 si Temps >= 8
	retlw		.8		; És més petit: Error 8 - Valor 1 del bit massa curt
					; Ja hem comprovat que no sigui massa curt
					; Si és més petit que 38 us és un pols curt, o sigui un 0
	movlw		.19		; Mirem si és menor que 38 us
	subwf		Temps,w		; W = Temps - W
	btfss		STATUS,C	; C = 1 si Temps >= 19
	goto		EsUn0		; Si està entre 16 i 38 us és un 0
					; No era un pols curt
					; Si és més gran que 60 us és un pols llarg, o sigui un 1
	movlw		.30		; Mirem si és menor que 60 us
	subwf		Temps,w		; W = Temps - W
	btfsc		STATUS,C	; C = 1 si Temps >= 30
	goto		EsUn1		; Si està entre 60 i 80 us és un 1
	retlw		.9		; No és ni llarg ni curt: Error 9 - Valor 1 del bit incorrecte
EsUn0
	bcf		STATUS,C        ; Si és un 0 entrem un 0
	goto		EntraBit
EsUn1
	bsf		STATUS,C        ; Si és un 1 entrem un 1
EntraBit				; Guardem el bit rebut
	rlf		Check,f         ; Entrem per Check i anem rodant fins a Humit+1
	rlf		Temper,f
	rlf		Temper+1,f
	rlf		Humit,f
	rlf		Humit+1,f
	decfsz		Bits,f		; Un altre bit rebut
	goto		BucBits		; Si no hem acabat, esperem el següent
	retlw		.0		; Lectura correcta
EscPant3				; Anem a enviar la lectura de 3 caràcters
	movlw		.3		; Cal fer-ho 3 cops
	movwf		Compta		; Ho posem al comptador
	movlw		Resul+2		; Adreça de la darrera xifra
	goto		EscPant
EscPant5				; Anem a enviar la lectura de 5 caràcters
	movlw		.4		; Cal fer-ho 5 cops
	movwf		Compta		; Ho posem al comptador
	movlw		Resul+4		; Adreça de la darrera xifra
EscPant
	movwf		FSR		; Adreçament indirecte
BuclePant
	movf		INDF,w		; Llegeix el caràcter
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	decf		FSR,f		; Decrementa FSR
	decfsz		Compta,f	; Decrementa el comptador
	goto		BuclePant	; Si no és zero, repetim
	movlw		','		; Lletra
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	movf		INDF,w		; Llegeix el caràcter
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	return				; Fi de l'enviament a la pantalla
IniPant					; Inicialització del mode de funcionament de la pantalla
	movlw		0		; Comença un cicle de durada fixa (0,2 s)
	call		Retard		; Crida a la funció Retard, el paràmetre està a W
	call		Retard		; Crida a la funció Retard, el paràmetre està a W
	call		Retard		; Crida a la funció Retard, el paràmetre està a W
	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
					;
ConfPant				; Configuració de la pantalla
	movlw		b'00001100'	; Display ON/OFF control - Activa la pantalla amb cursor intermitent
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaC		; Ho envia
	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 alt
	iorwf		Leds,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
Retus					; Funció de retard; W conté el nombre de cicles de 3 us que cal fer
	movwf		Retard1
Bucleus
	decfsz		Retard1,f
	goto		Bucleus
	return
Retard					; Funció Retard, W conté el nombre de cicles de 771 us que cal fer
	movwf		Retard2		; Ho copia a la variable Retard2
BucRet
	decfsz		Retard1,f	; Decrementa la variable 1
					; si dona zero, no es fa la instrucció següent
	goto		BucRet		; Salta, excepte si el resultat ha estat zero
	decfsz		Retard2,f	; Decrementa la variable 2
	goto		BucRet		; Salta, excepte si el resultat ha estat zero
	return				; Tornem al lloc des d'on hem vingut
BCD5					; Converteix a BCD
	bcf		STATUS,C	; Posa a zero C per entrar zeros a les rotacions
	movlw		.16		; Nombre d'iteracions
	movwf		Compta		; Comptador d'iteracions
	clrf		Resul+2		; Desenes de miler
	clrf		Resul+1		; Unitats de miler i centenes
	clrf		Resul		; Desenes i unitats
BucleBCD
	rlf		Valor,f		; Girem bits a l'esquerra a valor
	rlf		Valor+1,f	; Cap a valor+1
	rlf		Resul,f		; I cap als resultats
	rlf		Resul+1,f
	rlf		Resul+2,f
	decfsz		Compta,f	; Decrementa Compta
	goto		ajust		; Si no és zero, ajustem el resultat
	retlw		0		; Si és zero ja estem; tornem un 0 a W
ajust					; funció d'ajust dels resultats
	movlw		Resul		; Agafem l'adreça del byte de menys pes
	movwf		FSR		; La posa a l'adreçament indirecte
	call		ajustBCD	; Ajusta el byte de més a la dreta
	movlw		Resul+1		; Agafem l'adreça del byte del mig
	movwf		FSR		; La posa a l'adreçament indirecte
	call		ajustBCD	; Ajusta el byte del mig
	movlw		Resul+2		; Agafem l'adreça del byte de més pes
	movwf		FSR		; La posa a l'adreçament indirecte
	call		ajustBCD	; Ajusta el byte de més a l'esquerra
	goto		BucleBCD	; Torna a repetir el bucle (fins a 16 cops)
ajustBCD				; funció d'ajust d'un byte, primer el nibble de la dreta, després l'altre
	movlw		0x03		; Agafa el valor 03h
	addwf		INDF,w		; El suma al byte que ajustem
	movwf		Temp		; Ho guarda a Temp
	btfsc		Temp,3		; És més gran que 07h (s'ha activat el bit 3)?
	movwf		INDF		; Si és cert, sobreposa el resultat
	movlw		0x30		; Agafa el valor 30h
	addwf		INDF,w		; El suma al byte que ajustem
	movwf		Temp		; Ho guarda a Temp
	btfsc		Temp,7		; És més gran que 70h (s'ha activat el bit 7)?
	movwf		INDF		; Si és cert, sobreposa el resultat
	retlw		0		; Retorna amb un zero a W
SeparaH					; Separa els digits i els converteix a ASCII
	movf		Resul+2,w	; Agafa les desenes de miler
	movwf		Resul+4		; Les posa al seu lloc
	swapf		Resul+1,w	; Llegeix les unitats de miler i les centenes
					; i les guarda, permutades, a w
	andlw		0x0F		; Es queda amb les unitats de miler
	movwf		Resul+3		; Les posa al seu lloc
	movf		Resul+1,w	; Llegeix les unitats de miler i les centenes i les guarda a w
	andlw		0x0F		; Es queda amb les centenes
	movwf		Resul+2		; Les posa al seu lloc
	movwf		ComparaH
   	swapf		Resul,w		; Llegeix les desenes i les unitats i les guarda, permutades, a w
  	andlw		0x0F		; Es queda amb les desenes
	movwf		Resul+1		; Les posa al seu lloc
	movwf		ComparaT
	movf		Resul,w		; Llegeix les desenes i les unitats i les guarda a w
	andlw		0x0F		; Es queda amb les unitats
	movwf		Resul		; Les posa al seu lloc
	movlw		.5		; Cal fer-ho 5 cops
	movwf		Compta		; Ho posem al comptador
	movlw		Resul+4		; Adreça de la darrera xifra
	movwf		FSR		; Adreçament indirecte
	movlw		'0'		; Carrega el codi ASCII del número 0
					; Sumant-li la xifra tindrem el codi ASCII
Bucle1
	addwf		INDF,f		; Ho afegeix al dígit
	decf		FSR,f		; Decrementa FSR
	decfsz		Compta,f	; Decrementa el comptador
	goto		Bucle1		; Si no és zero, repetim
	movlw		.4		; Cal fer-ho 4 cops
	movwf		Compta		; Ho posem al comptador
	movlw		Resul+4		; Adreça de la darrera xifra
	movwf		FSR		; Adreçament indirecte
Bucle2
	movf		INDF,w		; Llegeix el dígit
	xorlw		'0'		; Compara amb 0
	btfss		STATUS,Z	; Si Z està activat eren iguals
	goto		Final		; Si no eren iguals, ja estem
	movlw		' '		; Carrega un espai en blanc
	movwf		INDF		; Substitueix el 0 per l'espai
	decf		FSR,f		; Decrementa FSR
	decfsz		Compta,f	; Decrementa el comptador
	goto		Bucle2		; Si no és zero, repetim
Ledstempmax
	bsf		Leds,0		; Encenc el LED n° 0 (el 1 diguemne)
	return
Ledshummax
	bsf		Leds,2		; Encenc el LED n° 2 (el 3 diguemne)
	return
Ledstempmin
	bsf		Leds,1		; Encenc el LED n° 1 (el 2 diguemne)
	return
Ledshummin
	bsf		Leds,3		; Encenc el LED n° 3 (el 4 diguemne)
	return
Final
	retlw		0		; Retorna amb un 0 a W
	end

 

 

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