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

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

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