;
;lcd_ej_7.asm Visualiza en la pantalla LCD el valor decimal de PORTA. 
;El programa se encarga de capturar el valor de PORTA, convertirlo en    
;los tres numeros en BCD para posteriormente convertirlos a ASCII y  
;mostrarlo en la pantalla.

	list		p=16f84
	include		"p16f84.inc"
	__config	_CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ;palabra de configuración	

;palabra de configuración

	__config	_CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

;registros para las subrutinas de control del LCD

CONT0		equ	0x0C
CONT1		equ	0x0D
LCD_TEMP	equ	0x0E

;registros que utiliza el programa principal 

BUFFER_H	equ	0x0F
BUFFER_L	equ	0x10
TEMPORAL	equ	0x11


		org	0x00
		goto	INICIO
		org	0x05

		include	"lcd_db4.inc"	;incorpora subrutinas para el LCD
		

;BIN_BCD Convierte el valor binario del byte presente en W en BCD  
;El resultado se deposita en los registros BUFFER_H y BUFFER_L
;nibble bajo de BUFFER_H = centenas
;nibble alto de BUFFER_L = decenas
;nibble bajo de BUFFER_L = unidades

BIN_BCD		clrf	BUFFER_L	;limpia regs. de trabajo
		clrf	BUFFER_H	

BIN_BCD_1	addlw	0xF6		;resta 10 a W por complemento a 2
		btfss	STATUS,C	;hay Carry ?
		goto	BIN_BCD_3	;NO
		movwf	TEMPORAL	;Si, guardar en el registro temporal
		incf	BUFFER_L,F	;incrementa byte bajo, guardarlo y...
		movf	BUFFER_L,W	;pasarlo a W
		xorlw	b'00001010'	;.10 xor W (BCDL)
		btfss	STATUS,Z	;es "0" el resultado de la operación
		goto	BIN_BCD_2	;NO
		clrf	BUFFER_L	;SI, borra el byte bajo e...
		incf	BUFFER_H,F	;...incrementa el alto
BIN_BCD_2	movf	TEMPORAL,W	;recupera el dato
		goto	BIN_BCD_1	;continuar la operación
BIN_BCD_3	addlw	0x0A		;temporal + 10
		swapf	BUFFER_L,F	;intercambia bits <3:0> con <7:4> 		
		iorwf	BUFFER_L,F	;W or BCDL = BCDL
		return

;Programa principal, inicia TRISA y TRISB, recoge dato de PORTA, 
;llama a BIN_BCD para convertir a BCD, convierte cada número BCD a 
;ASCII y envia al LCD. EL bucle de trabajo se repite indefinidamente 
 

INICIO		bsf	STATUS,RP0
		movlw	b'00000011'	
		movwf	TRISB		;PORTB para LCD
		movlw	b'00011111'
		movwf	TRISA		;PORTA entradas
		bcf	STATUS,RP0

		call	LCD_INI		;inicia LCD y comandos por defecto
		movlw	0x0C
		call	LCD_REG		;apaga cursor

BUCLE		movlw	0x80		
		call	LCD_REG		;primera posición primera linea
		movf	PORTA,W
		andlw	b'00011111'	;máscara 
		call	BIN_BCD		;convierte a BCD
		movf	BUFFER_H,W
		andlw	b'00001111'	;máscara para el primer nibble 
		addlw	0x30		;convierte a ASCII	
		call	LCD_DATO	;vusualiza centenas
		swapf	BUFFER_L,W
		andlw	b'00001111'
		addlw	0x30
		call	LCD_DATO
		movf	BUFFER_L,W
		andlw	b'00001111'
		addlw	0x30
		call	LCD_DATO
		goto	BUCLE
		
		end
		
		
		
		
