Hola amigos, tengo un problemilla con un programa para la config del LCD. el programa es el q os pongo ahi abajo, y mi problema es q mi LCD es para 4 bits (D4-D7) y las otras lineas son: E (A1), RW (A2), RS (A3). Por muchas variaciones que intento hacer en el programa no consigo mandar nada al LCD... Agradecería mucho si alguien me pudiera poner el programa corregido con los cambios q he dicho, o pasarme otro para la configuración q os comento.
Muchas gracias!!
#define ENABLE bsf PORTA,2 ;Activa señal E
#define DISABLE bcf PORTA,2 ;Desactiva señal E
#define LEER bsf PORTA,1 ;Pone LCD en Modo RD
#define ESCRIBIR bcf PORTA,1 ;Pone LCD en Modo WR
#define OFF_COMANDO bcf PORTA,0 ;Desactiva RS (modo comando)
#define ON_COMANDO bsf PORTA,0 ;Activa RS (modo dato
CBLOCK Lcd_var ;Inicio de las variables. Será la primera
Lcd_Temp_1 ;direccón libre disponible
Lcd_Temp_2
ENDC
;*************************************************************************
;UP_LCD: Configuración PIC para el LCD.
;
UP_LCD bsf STATUS,RP0 ;Banco 1
clrf PORTB ;RB <0-7> salidas digitales
movlw b"00011000"
movwf PORTA ;RA0-RA2 salidas, RA3-RA4 entradas
bcf STATUS,RP0 ;Banco 0
OFF_COMANDO ;RS=0
DISABLE ;E=0
return
;
;**************************************************************************
;LCD_BUSY: Lectura del Flag Busy y la dirección.
;
LCD_BUSY LEER ;Pone el LCD en Modo RD
bsf STATUS,RP0
movlw H"FF"
movwf PORTB ;Puerta B como entrada
bcf STATUS,RP0 ;Selecciona el banco 0
ENABLE ;Activa el LCD
nop
LCD_BUSY_1 btfsc PORTB,7 ;Chequea bit de Busy
goto LCD_BUSY_1 ;
DISABLE ;Desactiva LCD
bsf STATUS,RP0
clrf PORTB ;Puerta B salida
bcf STATUS,RP0
ESCRIBIR ;Pone LCD en modo WR
return
;**************************************************************************
;LCD_E: Pulso de Enable. En los nuevos LCD"s esta señal debe estar a "0" unos 40uS antes de
;volver a activarse a "1".
;
LCD_E ENABLE ;Activa E
nop
DISABLE ;Desactiva E
movlw .14
movwf Lcd_Temp_1
LCD_E_1 decfsz Lcd_Temp_1,F ;Pierde unos 40 uS para la constante de tiempo Tc
goto LCD_E_1 ;de los nuevos módulos LCD de winteck
return
;
;**************************************************************************
;LCD_DATO: Escritura de datos en DDRAM o CGRAM. Envía el dato presente en el W
;
LCD_DATO OFF_COMANDO ;Desactiva RS (modo comando)
movwf PORTB ;Valor ASCII a sacar por portb
call LCD_BUSY ;Espera a que se libere el LCD
ON_COMANDO ;Activa RS (modo dato).
goto LCD_E ;Genera pulso de E
;**************************************************************************
;LCD_REG: Escritura de comandos en el LCD. Envía el comando presente en el W
LCD_REG OFF_COMANDO ;Desactiva RS (modo comando)
movwf PORTB ;Código de comando.
call LCD_BUSY ;LCD libre?.
goto LCD_E ;SI.Genera pulso de E.
;***************************************************************************
;LCD_INI: inicialización del LCD enviando el comando "Function Set" 3 veces consecutivas
;con un intervalo de unos 5 mS. El LCD queda borrado y el cursor en la primera posición
LCD_INI movlw b"00111000"
call LCD_REG ;Código de instrucción
call LCD_DELAY ;Temporiza
movlw b"00111000"
call LCD_REG ;Código de instrucción
call LCD_DELAY ;Temporiza
movlw b"00111000"
call LCD_REG ;Código de instrucción
call LCD_DELAY ;Temporiza
movlw b"00000001" ;Borra LCD y Home.
call LCD_REG
return
;*****************************************************************************
;LCD_DELAY: Rutina de temporización de unos 5 mS. Se emplean las variables Lcd_Temp_1
;y LCD_Temp_2 en lugar del TMR0. Este queda libre para las aplicaciones del usuario
LCD_DELAY: clrwdt
movlw .10
movwf Lcd_Temp_1
clrf Lcd_Temp_2
LCD_DELAY_1: decfsz Lcd_Temp_2,F
goto LCD_DELAY_1
decfsz Lcd_Temp_1,F
goto LCD_DELAY_1
return