En aquest cas tindrem un potenciòmetre connectat a una entrada analògica i escriurem el valor llegit a la pantalla.
En el nostre cas tindrem un resultat de 10 bits (valors de 000h a 3FFh; o sigui de 0 a 1023) que guardarem en una variable entera. El que farem doncs serà triar l'alineació a la dreta (ADFM valdrà 1). Un cop tinguem el valor, en separarem els dígits, els convertirem a caràcters ASCII i els enviarem a la pantalla.
El programa que emprarem serà:
PROCESSOR 16F690 #include <xc.inc> config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
Compta EQU 0x20 ; Comptador d'iteracions Temp EQU 0x21 ; Variable Temporal Valor EQU 0x22 ; Valor d'entrada (2 bytes, 16 bits) Resul EQU 0x24 ; Valor de sortida (cinc bytes) Caracter EQU 0x29 ; Caràcter o codi a enviar Retard1 EQU 0x2A ; Variables de retard Retard2 EQU 0x2B Retard3 EQU 0x2C
PSECT code, class=CODE, delta=2, abs ; A l'inici de la memòria
main:
bsf 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 TRISB ; Tot el port B és de sortida
clrf TRISC ; Posa tots els bits del port C com a sortida
bsf BRGH ; Configuració de velocitat
bcf BRG16 ; Paràmetre de velocitat de 8 bits
movlw 25 ; Velocitat de 9600 baud
movwf SPBRG ; Paràmetre de velocitat
bcf SYNC ; Comunicació asíncrona
bcf TX9 ; Comunicació de 8 bits
bcf RP0 ; Tria el banc 0
bsf SPEN ; Activa comunicació sèrie
bsf RP0 ; Tria el banc 1
bsf TXEN ; Activa comunicació
movlw 00010000B ; Posa el conversor a 1/8 de la freqüència
movwf ADCON1 ; Copia W a la configuració del conversor A/D
bcf RP0
bsf RP1 ; Tria el banc 2
movlw 0xFF ; Posa l'acumulador a FFh (tot uns)
movwf ANSEL ; Configura AN0-AN7 com entrades analògiques
clrf ANSELH ; Desactiva les altres entrades analògiques
bcf RP0
bcf RP1 ; Tria el banc 0
movlw 10 ; Retard de 2 s
call Rets ; Esperem que arrenqui la pantalla
movlw 10000001B ; activa el conversor A/D connectat a AN0
movwf ADCON0 ; amb el resultat justificat per la dreta
Bucle:
movlw 254 ; Caràcter de control
movwf Caracter ; Ho guarda a la variable
call EnviaL ; Ho envia
movlw 1 ; Esborra la pantalla i posa el cursor a l'inici
movwf Caracter ; Ho guarda a la variable
call EnviaL ; Ho envia
nop ; espera un microsegon
nop ; espera un microsegon
nop ; espera un microsegon
nop ; espera un microsegon
nop ; espera un microsegon
bsf GO_DONE ; Inicia la conversió
btfsc GO_DONE ; Quan el bit sigui 0 la conversió haurà acabat
goto $-1 ; repetim la línia fins que deixi de ser 1
bsf RP0 ; Tria el banc 1
movf ADRESL,w ; Llegeix els bits de menys pes
bcf RP0 ; Tria el banc 0
movwf Valor ; Els guarda a Valor
movf ADRESH,w ; Llegeix els bits de més pes
movwf Valor+1 ; Els guarda a Valor+1
call BCD5 ; Els passa a BCD (cinc nibbles en tres bytes)
call Separa ; Els separem (cinc bytes)
; Anem a convertir-los a ASCII i enviar-los
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
BucleASC:
movlw '0' ; Carrega el codi ASCII del número 0
; Sumant-li la xifra tindrem el codi ASCII
addwf INDF,w ; Ho afegeix al dígit i se'l queda a W
movwf Caracter ; Ho guarda a la variable
call EnviaL ; Ho envia
decf FSR ; Decrementa FSR
decfsz Compta,f ; Decrementa el comptador
goto BucleASC ; Si no és zero, repetim
movlw 5 ; Retard d'1 s
call Rets ; Deixem temps a llegir-ho
goto Bucle
; ; Funció que converteix un número de 16 bits a BCD (5 dígits) ; BCD5: bcf CARRY ; 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 ; ; Funció que separa els dígits ; Separa: 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 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 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 retlw 0 ; Retorna amb un zero a W ; ; Enviem caràcters a visualitzar ; EnviaL: movf Caracter,w ; Agafa el caràcter movwf TXREG ; L'envia nop nop ; Espera 2 us btfss TXIF ; El registre TXREG ha quedat lliure? goto $-1 ; No, doncs esperem return ; Tornem al lloc des d'on hem vingut ; ; Funció de retard de 0,2 W s ; Rets: movwf Retard3 Bucles: decfsz Retard1,f goto Bucles decfsz Retard2,f goto Bucles decfsz Retard3,f goto Bucles return END main

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