Hola. Soy nuevo en el foro.
Tengo problemas con la inicialización de un LCD JM162A (con el controlador KS0070B). Estoy usando el p24fj64gb002.
Conecto el pic con el LCD de la siguiente manera: Modo 4 bits. RB5 i RB7 con RS y E (respectivamente) i RB8-RB11 con DB4-DB7. RW a masa y un potenciòmetro de 10k para el contraste.
Ejecuto la rutina y el LCD no se inicializa (se ve una línea de cuadrados negros).
He probado varios códigos, aumentar los delays, bajar el oscilador para relantizar la ejecución del programa... y no hay manera
Ya no se que hacer.
He de decir que estudié ingeniería electrónica pero hacia muchos años que no hacia nada con microcontroladores ni programación, por lo que estoy bastante-mucho oxidado (seguramente el código que adjunto deja bastante que desear...)
He visto que en varios temas ya hablaban de LCD pero no he encontrado ninguno del KS0070b con pic24f por lo que he optado abrir un nuevo tema. Si no he hecho bien disculpad el error (soy novato en eso de los foros.
Gracias de antemano por la atención y ayuda
El código es el siguiente:
#include <stdio.h>
#include <stdlib.h>
#include <p24FJ64GB002.h>
#define FCY 62500UL
#include <libpic30.h>
_CONFIG1 (JTAGEN_OFF); //Modulo JTAG deshabilitado (RB5-RB9 i/o digitales)
_CONFIG3 (SOSCSEL_IO); //RA4 i RB4 i/0 digitales
//_CONFIG2 (POSCMOD_XT & OSCIOFNC_OFF & FNOSC_PRI); //Oscilador primario XT (cristal 20MHz)
_CONFIG2 (POSCMOD_NONE & OSCIOFNC_ON);
// Definir pins control i dades
#define LCD_PIN_RS _LATB5
//#define LCD_PIN_RW _RA1 //RW a tierra
#define LCD_PIN_E _LATB7
#define LCD_PIN_DB4 _LATB8
#define LCD_PIN_DB5 _LATB9
#define LCD_PIN_DB6 _LATB10
#define LCD_PIN_DB7 _LATB11
// Definir direcció dels pins
#define RS_DIRECCIO _TRISB5
//#define RW_DIRECCIO _TRISA1
#define E_DIRECCIO _TRISB7
#define DB4_DIRECCIO _TRISB8
#define DB5_DIRECCIO _TRISB9
#define DB6_DIRECCIO _TRISB10
#define DB7_DIRECCIO _TRISB11
#define CONFIG_1x5x7 0x04
#define CONFIG_2x5x7 0x08
#define CONFIG_1x5x10 0x04
#define CONFIG_2x5x10 0x0C
void port_4bits (char dada)
{
LCD_PIN_DB4 = dada & 1;
LCD_PIN_DB5 = (dada & 2)>>1;
LCD_PIN_DB6 = (dada & 4)>>2;
LCD_PIN_DB7 = (dada &
>>3;
}
void escriure_byte (char dada)
{
char hg_4bits;
LCD_PIN_E = 0;
LCD_PIN_RS = 1; //Mode dato
__delay_us(1);
LCD_PIN_E = 1;
hg_4bits = dada >>4;
port_4bits (hg_4bits); //Transmitir 4 bits altos
__delay_us(1);
LCD_PIN_E = 0;
__delay_us(1);
LCD_PIN_E = 1;
port_4bits (dada); //Transmitir 4 bits bajos
__delay_us(1);
LCD_PIN_E = 0;
__delay_us(50);
}
void cmd_lcd_4bits (char dada)
{
LCD_PIN_E = 0;
LCD_PIN_RS = 0; //Instrucción
port_4bits(dada); //Poner dada en el puerto
LCD_PIN_E = 1;
__delay_ms(100);
LCD_PIN_E = 0;
}
void escriure_cmd (char dada)
{
char hg_4bits;
hg_4bits = dada >>4;
cmd_lcd_4bits(hg_4bits);
__delay_ms(1000);
cmd_lcd_4bits(dada);
__delay_ms(1000);
}
void ini_LCD_4bits ()
{
TRISB = 0x0000; //port B salida
__delay_ms(100);
//Inicializa a 4 bits
cmd_lcd_4bits(0x02);
__delay_ms(100);
escriure_cmd(0x28); //Function set 2 lineas 5x7
__delay_ms(80);
escriure_cmd(0x0E); //Display on, cursor on, blink off
__delay_ms(80);
escriure_cmd(0x01); //Clear display
__delay_ms(4);
escriure_cmd (0x06); //Increment mode y entrire shift off
__delay_ms(80);
}
int main() {
_NOSC = 0x7; //Fast RC
_RCDIV = 0x6; //Divided per 64 (125kHz)
AD1PCFG = 0xffff; //Todos los puertos digitales
ODCB = 0x0000; //No open drain
TRISB = 0; //Port B salida
_TRISA0 = 0; //RA0 salida
ini_LCD_4bits();
__delay_ms(1000);
escriure_byte (0x48);
while(1)
{
_LATA0 = 1; //Parpadeo de led cada segundo, para verificar retardos
__delay_ms(1000);
_LATA0 = 0;
__delay_ms(1000);
};
}