; PCDB9-EVOLUPICLCD  comunica teclado de PC con LCD en tarjeta
; EVOLUPIC por puerto serie DB9 a 2400 bauds
; => 2400 8-N-1

processor 16F628
include <p16f628.inc>
__config _XT_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF	

#DEFINE	BANCO0	BCF STATUS,RP0
#DEFINE	BANCO1	BSF STATUS,RP0

DATO	EQU	H'20'	;caracter recibido
BANDA	EQU	H'21'	;banderas en bits
K	EQU	H'22'	;variable subrutina delay
L	EQU	H'23'	;variable subrutina delay
M	EQU	H'24'	;variable para checar tecla liberada
N	EQU	H'25'	;valor columna (salida en puerto B, RB0...RB3)
PALA	EQU	H'26'	;caracter recibido de PC
SALTO	EQU	0X27
LISTA1	EQU	0X28

LCD	MACRO
	BANCO1	
	MOVLW	0XF9
	MOVWF	TRISA
	MOVLW	0X0
	MOVWF	TRISB
	BANCO0
	MOVLW	0X0
	MOVWF	PALA
	MOVWF	SALTO
	MOVWF	BANDA
	MOVLW	0X5
	MOVWF	LISTA1
	MOVLW	0X0
	MOVWF	PORTA	; RS=0 => empiezan comandos
	movlw 	0x30	; despierta LCD
	movwf	PORTB
	call	EPULSO
	call	DELAY
	call	EPULSO
	call	DELAY
	call	EPULSO
	call	DELAY
	CALL	CICLO
	ENDM
; Programa

INICIO	org 	0
	CALL	DELAY
	LCD
RECICLA	BANCO1
	MOVLW	02H	;B1/RX entrada, B2/TX salida
	MOVWF	TRISB	;
	MOVLW	0X19	;x=25(10)=19(16) en formula de baud rate
	MOVWF	SPBRG	;para 2400 bauds, modo sincrono
	MOVLW	00H	;BRG=0, SYNC=0, TXEN=0, TX9=0
	MOVWF	TXSTA	;baja Vel., asincrono, NO habilita Tx, 8 bits de datos
	BANCO0	
TECLA	MOVLW	090H	;SPEN=1, CREN=1, ADEN=0
	MOVWF	RCSTA	;recepcion continua asincrona, no detecta direccion
RECIBE	BTFSS	PIR1,5	;si RCIF se pone a uno termino la recepcion
	GOTO	RECIBE
	MOVFW	RCREG	;leo lo que llego
	MOVWF	DATO	;lo guardo temporalmente
	BAMCO1
	MOVLW	0XF9
	MOVWF	PORTA
	MOVLW	0X0
	MOVWF	PORTB
	BANCO0
	MOVLW	0X2
	MOVWF	PORTA	; RS=1 para recibir datos
	bsf	BANDA,0
	MOVFW	DATO
	MOVWF	PALA

PARTIDA	MOVLW	0XF0
	ANDWF	PALA,W
	MOVWF	PORTB
	CALL	EPULSA
	CALL	DELAY
	MOVLW	0X0F
	ANDWF	PALA,F
	SWAPF	PALA,W
	MOVWF	PORTB
	CALL	EPULSA
	CALL	DELAY
	BTFSS	BANDA,0
	RETURN
	MOVLW	0X0
	MOVWF	PORTA	; RS=0 termina recepcion de dato
	GOTO	RECICLA
CICLO	CALL	JEFE
	INCF	SALTO,F
	DECFSZ	LISTA1,F
	GOTO	CICLO
	CLRF	SALTO
	RETURN

PARTIDO	MOVLW	0XF0
	ANDWF	PALA,W
	MOVWF	PORTB
	CALL	EPULSO
	CALL	DELAY
	MOVLW	0X0F
	ANDWF	PALA,F
	SWAPF	PALA,W
	MOVWF	PORTB
	CALL	EPULSO
	CALL	DELAY
	RETURN
	
JEFE	MOVLW	ORDEN
	ADDWF	SALTO,W
	CALL	ATENTO
	MOVWF	PALA
	CALL	PARTIDO
	RETURN

ATENTO	MOVWF	PCL
ORDEN	RETLW	0X2	; 4 bits mas significativos
	RETLW	0X28	; 2 renglones
	RETLW	0X0E	; pantalla y cursor ON
	RETLW	0X01	; cursor al inicio
	RETLW	0X06	; avance de cursor a la derecha
	RETLW	0XC0	; segundo renglon	

EPULSO
	MOVLW	0X4
	MOVWF	PORTA
	call	DELAY
	MOVLW	0X0
	MOVWF	PORTA
	return

EPULSA	MOVLW	0X6
	MOVWF	PORTA
	call	DELAY
	MOVLW	0X2
	MOVWF	PORTA
	return

DELAY	movlw	0X7F	; 48.769 milisegundos
	movwf	M
mallaM:	movwf	L
mallaL:	decfsz	L,f
	goto	mallaL	
	decfsz	M,f
	goto	mallaM
	return	
	END




			
			
		
	

	

