; Programa para leer la temperatura de un ADC y mostrarla en DOS Display
PCL EQU 02H
STATUS EQU 03H
TRISA EQU 05H
PORTA EQU 05H
TRISB EQU 06H
PORTB EQU 06H
UNID EQU 12H
PDel0 EQU 13H
DECE EQU 14H
DATO EQU 15H ; GUARDO EL RESULTADO DE ADC AL TERMINAR DE CONVERTIR
PDel01 EQU 16H
PDel11 EQU 17H
ORG 00H
GOTO INICIO
ORG 04H
GOTO FIN
INICIO BSF STATUS,5 ; configurando puertos
CLRF TRISA ; PORTA COMO SALIDA
BCF STATUS,5
MOVLW B'00000111' ; DESHABILITO TODO (DISPLAYS Y ADC)
MOVWF PORTA
ACA CALL CONVER ; LLAMO A LA SUBRUTINA DE CONVERSION.
CALL DECBCD ; RUTINA QUE CONVIERTE EL DATO DECIMAL EN TRES BCD
MOVF UNID,0
MOVWF DATO
CALL CODIFI ; AL DATO LO DIVIDO EN UNIDAD Y DECENA PARA LUEGO MOSTRARLO.
CALL MOSTRAR ; MUESTRO LOS DATOS EN LOS DISPLAYS.
GOTO ACA
;-----------> TABLA
TABLA ADDWF PCL,1
RETLW B'00111111' ; codigo para el 0 *
RETLW B'00000110' ; código para el 1 *
RETLW B'01011011' ; código para el 2 *
RETLW B'01001111' ; código para el 3 *
RETLW B'01100110' ; código para el 4 * display gfedcba segmentos de los leds del display
RETLW B'01101101' ; código para el 5 *
RETLW B'01111100' ; código para el 6 *
RETLW B'00000111' ; código para el 7 *
RETLW B'01111111' ; código para el 8 *
RETLW B'01100111' ; código para el 9 *
;-----------> DEMORA DE 0.120 Ms PARA LA CONVERSION DEL ADC
DEMOADC movlw .28 ; 1 set numero de repeticion
movwf PDel0 ; 1 |
PLoop0 clrwdt ; 1 clear watchdog
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ?
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;----------> DEMORA PARA MULTIPLEXAR LOS DISPLAYS DE 3 Ms
DEMODIS movlw .4 ; 1 set numero de repeticion (B)
movwf PDel01 ; 1 |
PLoop11 movlw .186 ; 1 set numero de repeticion (A)
movwf PDel11 ; 1 |
PLoop21 clrwdt ; 1 clear watchdog
decfsz PDel11, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop21 ; 2 no, loop
decfsz PDel01, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop11 ; 2 no, loop
PDelL11 goto PDelL21 ; 2 ciclos delay
PDelL21 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;-----------> CONVERSION DEL ADC
CONVER BSF STATUS,5 ; configurando puertos
MOVLW B'11111111' ; PORTB COMO ENTRADA (BIT=1, ENTONCES ENTRADA)
MOVWF TRISB
BCF STATUS,5
MOVLW B'00000110' ; HABILITO CS DEL ADC (CS=RA0)
MOVWF PORTA
NOP
MOVLW B'00000010' ; HABILITO INICIO DE CONVERSION (WR=RA2)
MOVWF PORTA
NOP
NOP
MOVLW B'00000110' ; DESHABILITO WR=RA2
MOVWF PORTA
CALL DEMOADC ; DEMORA DE 0.120 Ms PARA DARLE TIEMPO AL ADC DE CONVERTIR
MOVLW B'00000100' ; HABILITO LA SALIDA DEL DATO (RD=RA1)
MOVWF PORTA
MOVF PORTB,0 ; MUEVO EL DATO EN EL PORTB A W
MOVWF DATO ; GUARDO EL RESULTADO DE LA CONVERSION EN DATO
MOVLW B'00000111' ; DESHABILITO AL ADC
MOVWF PORTA
RETURN
;-----------> CONVERSION DEL DATO DECIMAL EN BCD
DECBCD NOP
BIN8_BCD3 clrf DECE ; INGRESA EL CODIGO DECIMAL GUARDADO EN DATO Y LO CONVIERTO A BCD
clrf UNID
BCD_HIGH movlw .100
subwf DATO,1 ; A DATO LE RESTO 100
btfss STATUS,0 ; C=1 SI EL RESULTADO DE LA OPERACION ES POSITIVO (BIT7 DEL RESULTADO=0) Y
goto SUMA_100 ; SALTO LA PROXIMA INSTRUCCION, SI NO RESTAURO DATO
incf DECE,1 ; INCREMENTO DECE CADA VEZ QUE LE RESTO 100 A DATO Y EL RESULTADO ES +
goto BCD_HIGH
SUMA_100 movlw .100
addwf DATO,1
movlw 0x0F
movwf UNID ; CARGO UNID CON 00001111
BCD_LOW movlw .10
subwf DATO,1 ; COMO ESTOY EN LAS UNIDADES HAGO LO MISMO Q AL PRINCIPIO PERO CON 10
btfss STATUS,0 ; C=1 SI EL RESULTADO DE LA OPERACION ES POSITIVO (BIT7 DEL RESULTADO=0) Y
goto SUMA_10 ; SALTO LA PROXIMA INSTRUCCION, SI NO RESTAURO DATO
incf UNID,1
movlw 0x0F
iorwf UNID,1
goto BCD_LOW ; EL DATO QUE SALE ES DE TERS CIFRAS, COMO SOLO MUESTRO EN DOS DISPLAY, EL DATO
SUMA_10 movlw .10 ; OBTENIDO EN UNID LO TENGO QUE SEPARAR EN DOS.
addwf DATO,1
movlw 0xF0
andwf UNID,1
movf DATO,0
iorwf UNID,1
RETURN
;-----------> SEPARACION DEL DATO EN UNIDAD Y DECENA
CODIFI
MOVF DATO,0 ; MUEVO EL DATO A W
ANDLW B'00001111' ; SEPARO LAS UNIDADES Y LAS GUARDO EN UNID
MOVWF UNID
MOVF DATO,0 ; MUEVO EL DATO A W
ANDLW B'11110000' ; SEPARO LAS DECENAS Y LAS GUARDO EN DECE
MOVWF DECE
SWAPF DECE,1 ; PONGO EL VALOR DE LA DECENA EN LOS CUATRO PRIMEROS BIT PARA PODER ENTRAR EN LA TABLA.
RETURN
;----------> MOSTRAR LA TEMPERATURA EN EL DISPLAY
MOSTRAR BSF STATUS,5 ; configurando puertos
CLRF TRISB ; PORTB COMO SALIDA
BCF STATUS,5
MOVF UNID,0 ; MUEVO UNID A W
CALL TABLA
MOVWF PORTB ; Saca valor por el puerto B.
MOVLW B'000010111' ; MUESTRO DATO EN DISPLAY 1 - UNIDADES (RA4=D1)
MOVWF PORTA
CALL DEMODIS
MOVF DECE,0 ; MUEVO DECE A W
CALL TABLA
MOVWF PORTB ; Saca valor por el puerto B.
MOVLW B'00001111' ; MUESTRO DATO EN DISPLAY 2 - DECENAS (RA3=D2)
MOVWF PORTA
CALL DEMODIS
RETURN
FIN NOP
END