Autor Tema: LCD JM162A con pic24f  (Leído 984 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado danifiguerola

  • PIC10
  • *
  • Mensajes: 24
LCD JM162A con pic24f
« en: 19 de Marzo de 2015, 13:18:26 »
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 & 8)>>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);
    };


   
}

Desconectado danifiguerola

  • PIC10
  • *
  • Mensajes: 24
Re: LCD JM162A con pic24f
« Respuesta #1 en: 19 de Marzo de 2015, 13:20:19 »
Por cierto, utilizo XC16


 

anything