En aquest exemple farem servir un sensor de temperatura i mostrarem la temperatura llegida a una pantalla sèrie.
#include <p16F690.inc> __config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
cblock 0x20 Valor:2 ; Valor llegit pel conversor (16 bits) ; Valor és el bit menys significatiu i Valor+1 el més significatiu D1 ; Variable unitats de la conversió BCD D2 ; Variable desenes de la conversió BCD ; D1:2 també és una variable auxiliar en els càlculs ; D1 és el bit menys significatiu i D2 el més significatiu D3 ; Variable centenes de la conversió BCD Caracter ; Caràcter o codi a enviar ; D3:2 també és una variable auxiliar en els càlculs ; D3 és el bit menys significatiu i Caracter el més significatiu Control ; Variable amb bits de control ; El bit 0 està a 1 si la temperatura és negativa ; El bit 7 estarà a 1 si cal sumar 0,5 a la temperatura Retard1 ; Variables per als cicles de retard Retard2 Retard3 endc
org 0 Inici movlw .10 ; Retard de 2 s call Rets ; Esperem que arrenqui la pantalla bsf STATUS,RP1 ; Tria el banc 2 movlw b'00000101' movwf ANSEL ; Configura AN0 i AN2 com entrada analògica clrf ANSELH ; Desactiva les altres entrades analògiques bcf STATUS,RP1 bsf STATUS,RP0 ; Tria el banc 1 movlw 0xFF ; Posa l'acumulador a FFh (tot uns) movwf TRISA ; Posa tots els bits del port A com a entrada clrf TRISC ; Tot el port C és de sortida clrf TRISB ; Tot el port B é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 bsf TXSTA,BRGH ; Configuració de velocitat bcf BAUDCTL,BRG16 ; Paràmetre de velocitat de 8 bits movlw .25 ; Velocitat de 9600 baud movwf SPBRG ; Paràmetre de velocitat bcf TXSTA,SYNC ; Comunicació asíncrona bcf TXSTA,TX9 ; Comunicació de 8 bits bcf STATUS,RP0 ; Tria el banc 0 bsf RCSTA,SPEN ; Activa comunicació sèrie bsf STATUS,RP0 ; Tria el banc 1 bsf TXSTA,TXEN ; Activa comunicació bcf STATUS,RP0 ; Tria el banc 0 movlw b'10001001' ; activa el conversor A/D connectat a AN2 movwf ADCON0 ; amb el resultat justificat per la dreta Bucle nop ; espera un microsegon nop ; espera un microsegon nop ; espera un microsegon nop ; espera un microsegon nop ; espera un microsegon, en total 5 bsf ADCON0,GO ; Inicia la conversió btfsc ADCON0,GO ; Quan el bit sigui 0 la conversió haurà acabat goto $-1 ; repetim la línia fins que deixi de ser 1 bsf STATUS,RP0 ; Tria el banc 1 movf ADRESL,w ; Llegim byte inferior del resultat bcf STATUS,RP0 ; Tria el banc 0 movwf Valor ; El guardem movf ADRESH,w ; Llegim byte superior del resultat movwf Valor+1 ; El guardem ; Abans de res, posicionem el cursor a la pantalla movlw .254 ; Control de la posició del cursor movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .0 ; Filera 1 columna 1 iorlw b'10000000' ; Posa el bit de posicionat a 1 movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia ; Comencem mirant si el valor es positiu o negatiu bcf Control,0 ; Suposem que el valor llegit és positiu i ho comprovem movf Valor+1,f ; Si el byte de més pes no és nul segur que es positiu btfss STATUS,Z ; És zero? goto Positiu ; No movlw .102 ; Si és més petit que 102 és negatiu subwf Valor,w ; W = Valor - W btfss STATUS,C ; C = 1 si Valor >= W bsf Control,0 ; El valor llegit és negatiu Positiu ; Anem a multiplicar per tres la lectura (resultat a D1) movf Valor,w ; Byte de menys pes movwf D1 movf Valor+1,w ; Byte de més pes movwf D1+1 call Suma ; D1 = D1 + Valor (sobre dos bytes) call Suma ; D1 = D1 + Valor (sobre dos bytes) ; Tenim 3 Valor a D1 clrf D3 ; Aquí és on posarem la lectura multiplicada per 128 movf Valor,w ; Copiem el byte menys significatiu de la lectura movwf D3+1 ; I el posem on guardarem el més significatiu rrf Valor+1,w ; No modifiquem la variable però passem el bit de la dreta a C rrf D3+1,f ; Entrem aquest bit per l'esquerra a D3+1 rrf D3,f ; i el que ha sortit l'entrem a l'esquerra de D3 ; Tenim 128 Valor a D3 call Resta ; D3 = D3 - D1 ; Tenim 125 Valor a D3 btfsc Control,0 ; Era negatiu? goto Negatiu ; Sí movlw .50 ; Byte més significatiu de 12800 movwf D1+1 clrf D1 ; Byte menys significatiu de 12800 call Resta ; D3 = D3 - D1 goto Escriu ; Anem a enviar-ho a la pantalla ; Tenim 125 Valor a D3 ; Per a fer la resta, cal passar-ho a D1 Negatiu movf D3+1,w movwf D1+1 movf D3,w movwf D1 movlw .50 ; Byte més significatiu de 12800 movwf D3+1 clrf D3 ; Byte menys significatiu de 12800 call Resta ; D3 = D3 - D1 ; Tenim el numerador a D3 i D3+1 ; Un cop dividit per 256, la part entera estarà a D3+1 ; I la part decimal dependrà del bit 7 de D3 ; Guardem el bit 7 a Control perquè la funció BCD sobrescriurà D3 Escriu bcf Control,7 ; Suposem que el decimal és 0 btfsc D3,7 ; Mira si està activat el bit 7 bsf Control,7 ; Sí, doncs el decimal és un 5 movf D3+1,w ; Aquest és el valor que mostrarem a la pantalla abans de la coma call BCD ; Ho convertim a BCD call ASCII ; Ho convertim a ASCII movf D3,w ; Llegeix el caràcter btfsc Control,0 ; Era negatiu? movlw '-' ; Sí. Doncs posa un - en lloc del caràcter movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movf D2,w ; Llegeix el caràcter movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movf D1,w ; Llegeix el caràcter movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw ',' ; Posa la coma movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw '0' ; Preparem un zero btfsc Control,7 ; Mirem si el decimal és 0 o 5 movlw '5' ; És 5 movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw ' ' ; Espai en blanc movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw b'11011111' ; Graus movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'C' ; Centígrads movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 0 call Retard ; Retard de 0,2 s call Retard ; Retard de 0,2 s call Retard ; Retard de 0,2 s goto Bucle
EnviaL ; Enviem caràcters a visualitzar movf Caracter,w ; Agafa el caràcter movwf TXREG ; L'envia nop nop ; Espera 2 us btfss PIR1,TXIF ; El registre TXREG ha quedat lliure? goto $-1 ; No, doncs esperem return ; Tornem al lloc des d'on hem vingut BCD ; Funció de conversió a BCD en ASCII ; El valor a convertir està a W 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 ASCII movlw '0' ; Carrega el codi ASCII del número 0 ; Sumant-li la xifra tindrem el codi ASCII addwf D3,f ; Ho afegeix al dígit addwf D2,f ; Ho afegeix al dígit addwf D1,f ; Ho afegeix al dígit movf D3,w ; Llegeix el dígit xorlw '0' ; Compara amb 0 btfss STATUS,Z ; Si Z està activat eren iguals return ; Si no eren iguals, ja estem movlw ' ' ; Carrega un espai en blanc movwf D3 ; Substitueix el 0 per l'espai movf D2,w ; Llegeix el dígit xorlw '0' ; Compara amb 0 btfss STATUS,Z ; Si Z està activat eren iguals return ; Si no eren iguals, ja estem movlw ' ' ; Carrega un espai en blanc movwf D2 ; Substitueix el 0 per l'espai return Resta ; D3 = D3 - D1 (sobre dos bytes) comf D1,f ; Complementa D1 incf D1,f ; I l'incrementa (el conjunt equival a canviar el signe) btfsc STATUS,Z ; Mirem si s'activa Z decf D1+1,f ; Si era zero cal decrementar D1+1 comf D1+1 ; Complementem D1+1 movf D1,w ; Llegim a W la variable que hem de sumar addwf D3,f ; L'afegim al byte de la dreta btfsc STATUS,C ; Mirem si s'activa C incf D3+1,f ; Si s'activa, incrementem el byte superior movf D1+1,w ; Llegim a W la variable que hem de sumar addwf D3+1,f ; L'afegim al byte de la dreta return Suma ; D1 = D1 + Valor (sobre dos bytes) movf Valor,w ; Llegim a W la variable que hem de sumar addwf D1,f ; L'afegim al byte de la dreta btfsc STATUS,C ; Mirem si s'activa C incf D1+1,f ; Si s'activa, incrementem el byte superior movf Valor+1,w ; Llegim a W la variable que hem de sumar addwf D1+1,f ; L'afegim al byte de la dreta 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 Rets ; Funció de retard de 0,2 W s 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.