Hola, ya busque en el foro sobre este tema, lei un par de post, y la verdad no he logrado que me funcione ni en proteus ni en el mundo real este LCD con estas rutinas, cree un tema. Incluso vi un post que enseñaba unas rutinas de xrobotics, que son muy similares a las que yo tenia de una presentacion pdf. Trate de poner mas retardos, tambien retardos mas grandes y no me funciona. Estoy programando con el MPLAB V8.33, un pic16F690 y el pickit2. Me parece que el problema es con el puerto B, pero no estoy seguro. Les agradesco su ayuda.
Código:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; RUTINAS PARA MANEJO DE LCD ;
; Aqui se colocan las rutinas necesarias para manejar una LCD ;
; basada en un controlador KS066U. Se utiliza el puerto C para ;
; manejar los datos y el puerto B para el control ;
; PIC16F690 ;
; 4MHZ INTOSC ;
; Ing. Mauricio Aguilar Salas ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LIST P=16F690
#include <P16F690.inc>
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF
CBLOCK 0X20
RET_5MS1
RET_5MS2
ENDC
;--------------------CONSTANTES----------------------
;{
;PARA LA LCD
RS EQU 4
RW EQU 5
E EQU 6
;}
;---------------------MACROS------------------------
;{
BANCO0 MACRO ;MACRO PARA SELECCIONAR EL BANCO 0 DE LA RAM
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANCO1 MACRO ;MACRO PARA SELECCIONAR EL BANCO 1 DE LA RAM
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
BANCO2 MACRO ;MACRO PARA SELECCIONAR EL BANCO 2 DE LA RAM
BCF STATUS,RP0
BSF STATUS,RP1
ENDM
BANCO3 MACRO ;MACRO PARA SELECCIONAR EL BANCO 3 DE LA RAM
BSF STATUS,RP0
BSF STATUS,RP1
ENDM
;}
ORG 0
;--------------------RUTINA PRINCIPAL---------------------
;{
CALL INICIALIZACION
CALL INIT_LCD
PRINCIPAL:
MOVLW 'L'
CALL ESCRIBE_LCD
MOVLW 'C'
CALL ESCRIBE_LCD
MOVLW 'D'
CALL ESCRIBE_LCD
MOVLW D'40'
CALL COMANDO_LCD
MOVLW 'L'
CALL ESCRIBE_LCD
MOVLW 'I'
CALL ESCRIBE_LCD
MOVLW 'S'
CALL ESCRIBE_LCD
MOVLW 'T'
CALL ESCRIBE_LCD
MOVLW 'O'
CALL ESCRIBE_LCD
GOTO $
;}
;--------------INCIALIZACION DEL MICROCONTROLADOR---------
INICIALIZACION:
BANCO0
CLRF PORTA
CLRF PORTB
CLRF PORTC
BANKSEL ANSEL
MOVLW B'11111000' ;Carga w con binario
MOVWF ANSEL ;AN0-3 digitales
BANCO1
MOVLW 0XFF ;Carga W con hexadecimal
MOVWF TRISA ;Puerto A como entrada
MOVLW B'10000000' ;Carga W con binario
MOVWF TRISB ;RB4-6 como salida
CLRF TRISC ;Puerto C como salida
BANCO0
RETURN
;--------------------------FUNCIONES LCD------------------
;{
INIT_LCD:
CALL DELAY_5MS
BCF PORTB,RW ;Modo escritura
MOVLW B'00111000' ;Carga W con binario
CALL COMANDO_LCD ;Configura 8 bits, 2 lineas y caracteres 5x8
CALL DELAY_5MS
MOVLW B'00111000' ;Carga W con binario
CALL COMANDO_LCD ;Otra vez
CALL DELAY_5MS
MOVLW B'00111000' ;Carga W con binario
CALL COMANDO_LCD ;Y otra vez
MOVLW B'00001100' ;Carga W con binario
CALL COMANDO_LCD ;Enciende LCD, apaga cursor y parpadeo
CALL DELAY_5MS
MOVLW 0X01 ;Carga W con hexadecimal
CALL COMANDO_LCD ;Borra la pantalla
CALL DELAY_5MS
RETURN
ESCRIBE_LCD:
BCF PORTB,RS
MOVWF PORTC ;Saca el dato por el puerto
CALL LCD_OCUPADO
BSF PORTB,RS ;RS=1 para mandar datos
GOTO PULSO_ENABLE
COMANDO_LCD:
BCF PORTB,RS ;RS=0 para mandar comandos
MOVWF PORTC ;Saca comando al puerto
CALL LCD_OCUPADO
GOTO PULSO_ENABLE
PULSO_ENABLE:
BSF PORTB,E ;ALTO
NOP ;Pierde 1us
BCF PORTB,E ;BAJO
RETURN
LCD_OCUPADO:
BSF PORTB,RW ;Modo lectura
BANKSEL TRISC
MOVLW 0XFF ;Carga unos
MOVWF TRISC ;Puerto C como entrada
BANCO0
BSF PORTB,E ;E=1
NOP ;Pierde 1us
CHEQUEO:
BTFSC PORTC,7 ;Chequea busy
GOTO CHEQUEO
BCF PORTB,E ;E=0
BANKSEL TRISC
CLRF TRISC ;Puerto C como salida
BANCO0
BCF PORTB,RW ;Modo escritura
RETURN
DELAY_5MS:
MOVLW D'7' ;Carga decimal
MOVWF RET_5MS2
REPITE:
DECFSZ RET_5MS1,F ;Decrementa 256 veces
GOTO REPITE ;256*3 instrucciones= 768 instrucciones
DECFSZ RET_5MS2,F ;768 instrucciones * 7 = 5736 instrucciones
GOTO REPITE ;5376 * 1us = 5.4ms
RETURN
;}
END