Cordial saludo.
Gracias a todos y ahi voy avanzando....
Les cuento:
Conecte una pantalla LCD para al PIC para mirar que me esta entrando, pero no se que problema tengo con las decenas, o depronto el problema es general ya que los datos me estan pàsando por el LCD pero no veo concordancia alguna con lo que me esta entrando el codigo que llevo es:
; Febrero 6, 4:42 pm
list P=16F870
#include <P16F870.inc> ; Registros del PIC16F876A
;/////////////////////////////////////////////////////////////////////////////
__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON & _LVP_OFF & _BODEN_OFF
;/////////////////////////////////////////////////////////////////////////////
; Constantes
;Bancos de memoria RAM (para utilizar banksel)
Banco0 equ 0x20
Banco1 equ 0xA0
Banco2 equ 0x120
Banco3 equ 0x1A0
estado equ 0x03
uni equ 0x21
dec equ 0x22
cen equ 0x23
ptob equ 0x06
buffer equ 0x28
#define CARRY estado,0
#define RPT0 estado,5
E_LCD equ 7 ;Bit del puerto C para control de E.
RW_LCD equ 6 ;Bit del puerto C para control de R/W.
RS_LCD equ 5 ;Bit del puerto C para control de RS.
LCD_Dat equ 0x06 ;Bus de datos del LCD = PORTB
LCD_Ins equ 0x07 ;Bus de Control del LCD = PORTC
;/////////////////////////////////////////////////////////////////////////////
TEMPB3 equ 0x21
TEMPB2 equ 0x22
TEMPB1 equ 0x23
;/////////////////////////////////////////////////////////////////////////////
Org 0x00
goto main
main
clrf INTCON
BANKSEL Banco1 ; Bank1 seleccionado
clrf TRISC
clrf TRISB ; PORTB = Salidas
clrf ADCON0
bcf STATUS, RP0
;movlw B'01000001'
;movwf ADCON0
movlw b'10000001'
movwf ADCON0
; Set ADCON1
;BANKSEL ADCON1
;movlw b'10000101'
;movwf ADCON1
BANKSEL Banco0 ; Bank0 seleccionado
clrf PORTC
clrf PORTB
call inicio
Leer
call ad_portc
goto Leer
ad_portc
bsf ADCON0,GO
Wait
btfsc ADCON0,GO
goto Wait
; bsf RPT0
movf ADRESH,W
;bcf RPT0
movwf buffer ;Guarda el dato obtenido de ADRESL en el buffer temporal
bcf CARRY ;Limpia el CARRY
btfsc ADRESH, 0 ;Mira el bit menos significativo de ADRESH (Bit 8)
bsf CARRY ;Si está en 1 pone en uno el carry
rrf buffer, 1 ;Hace desaparecer el bit 0 de ADRESL, mete el bit 0 de ADRESH por el 7 de ADRESL
movf buffer, 0 ;Dato digitalizado -> W
call DECIMAL ;Obtiene UNI, DEC y CEN con el agregado de 30h para la tabla ASCII
movf dec,0
call LCD_printchar
;call LCD_printchar
movf cen, 0 ;Coloca las decenas
call LCD_printchar
;call LCD_printchar
movf uni, 0 ;Coloca las unidades
call LCD_printchar
call DelaymS
call DelaymS
call BorrarDisplay_LCD
call DelaymS
call DelaymS
movf cen,0
movwf LCD_Dat
bcf LCD_Ins,RW_LCD
bsf LCD_Ins,RS_LCD
bsf LCD_Ins,E_LCD
bcf LCD_Ins,E_LCD
call DelaymS
call DelaymS
call DelaymS
call DelaymS
call DelaymS
call BorrarDisplay_LCD
; movlw "E"
; call LCD_printchar
; call DelaymS
; call DelaymS
return
DECIMAL movwf uni ;Convierte el dato presente en W en UNI, DEC y CEN
clrf dec
clrf cen
movlw d'100' ;Determina la cant. de centenas
CENTENA subwf uni, 1
btfss CARRY
goto CIEN
incf cen, 1
goto CENTENA
CIEN addwf uni, 1
movlw d'10' ;Determina la cant. de decenas
DECENA subwf uni, 1
btfss CARRY
goto DIEZ
incf dec, 1
goto DECENA
DIEZ addwf uni, 1 ;Uni queda con la cant. de unidades (sin decenas ni centenas)
movlw 0x30 ;Le suma 30h a los valores de UNI, DEC y CEN para que queden en ASCII
addwf uni, 1
movlw 0x30
addwf dec, 1
movlw 0x30
addwf cen, 1
return
inicio
call Configurar_LCD
call BorrarDisplay_LCD
call CursorOn_LCD
call InicioL1_LCD
;movlw .2
; call DelayS
; movlw "T"
; call LCD_printchar
; movlw "E"
; call LCD_printchar
; movlw "I"
;call LCD_printchar
;movlw "K"
;call LCD_printchar
;movlw "O"
;call LCD_printchar
;movlw " "
;call LCD_printchar
;movlw "S"
;call LCD_printchar
;;movlw "."
;call LCD_printchar
;movlw "A"
;call LCD_printchar
;fin
; nop
; goto fin
;/////////////////// Subrutinas ///////////////////
Configurar_LCD
movlw .10
call DelaymS
movlw 0x38
call LCD_Instruccion
movlw .1
call DelaymS
return
CursorOn_LCD
movlw 0x0F
call LCD_Instruccion
movlw .1
call DelaymS
return
CursorOff_LCD
movlw 0x0C
call LCD_Instruccion
movlw .1
call DelaymS
return
BorrarDisplay_LCD
movlw 0x01
call LCD_Instruccion
movlw .3
call DelaymS
return
InicioL1_LCD
movlw .128
bcf LCD_Ins,RW_LCD
bcf LCD_Ins,RS_LCD
bsf LCD_Ins,E_LCD
movwf LCD_Dat
bcf LCD_Ins,E_LCD
movlw .1
call DelaymS
return
InicioL2_LCD
movlw .168
bcf LCD_Ins,RW_LCD
bcf LCD_Ins,RS_LCD
bsf LCD_Ins,E_LCD
movwf LCD_Dat
bcf LCD_Ins,E_LCD
movlw .1
call DelaymS
return
LCD_printchar
bcf LCD_Ins,RW_LCD
bsf LCD_Ins,RS_LCD
bsf LCD_Ins,E_LCD
movwf LCD_Dat
bcf LCD_Ins,E_LCD
movlw 0x01
call DelaymS
return
LCD_Instruccion
bcf LCD_Ins,RW_LCD
bcf LCD_Ins,RS_LCD
bsf LCD_Ins,E_LCD
movwf LCD_Dat
bcf LCD_Ins,E_LCD
return
DelayS
movwf TEMPB3
movlw .250
call DelaymS
movlw .250
call DelaymS
movlw .250
call DelaymS
movlw .250
call DelaymS
decfsz TEMPB3,F
goto $-9
return
DelaymS
movwf TEMPB1
movlw .249
movwf TEMPB2
nop
decfsz TEMPB2,F
goto $-2
decfsz TEMPB1,F
goto $-6
retlw .0
end
Como ven antes de hacer de nuevo una lectura le meti delay para que el tiempo de refresco del LCD me permita leer, pero como les comento no ahi concordancia entre la entrada y lo que me muestra el LCD, aclarando como les comento que las decenas NO me esta mostrando nada.
Gracias de nuevo a todos