Autor Tema: Ayuda para escribir y leer carácteres personalizados en un Display 16x2  (Leído 6468 veces)

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

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 805
    • https://electronicadicto.wordpress.com/
Hola a todos, Estoy utilizando el compilador C18 y la librería XLCD y estoy tratando de escribir caracteres personalizados en un display 16x2 HD44780 y luego mostrarlo en pantalla pero no consigo hacerlo, en la pantalla me salen caracteres raros en el lugar donde quiero mostrar el carácter, lo demás todo funciona bien, puedo utilizar los caracteres pregrabados de fábrica y mostrar texto sin problemas.
Estoy hecho un lío con las funciones de SetCGRamAddr y SetDDRamAddr, no sé como utilizarlas para almacenar el carácter y desplegarlo, a ver si alguien me echa una mano

Muchas gracias
« Última modificación: 20 de Marzo de 2025, 09:04:15 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 805
    • https://electronicadicto.wordpress.com/
Re:Ayuda para escribir y leer carácteres personalizados en un Display 16x2
« Respuesta #1 en: 20 de Marzo de 2025, 00:24:19 »
Hola de nuevo, me olvidaba de poner la función con la que estoy haciéndolo, a ver si alguien ve el problema

Código: [Seleccionar]
const unsigned char GradeesCelsius[8] = {
0b01110,
0b01010,
0b01110,
0b11111,
0b00000,
0b00000,
0b00000,
0b00000
};



void customcharacter(unsigned char codigo, const unsigned char *caracter) {
    unsigned char i;
    unsigned char direccionCGRAM = 0x40 + (codigo * 8);

while( BusyXLCD() ); //wait untill LCD controller is busy
    SetCGRamAddr(direccionCGRAM);
    for (i = 0; i < 8; i++) {
    while( BusyXLCD() ); //wait untill LCD controller is busy
        WriteDataXLCD(caracter[i]);
    }
    while( BusyXLCD() ); //wait untill LCD controller is busy
    SetCGRamAddr(0x80);
}
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Jiha

  • PIC10
  • *
  • Mensajes: 28
Re:Ayuda para escribir y leer carácteres personalizados en un Display 16x2
« Respuesta #2 en: 20 de Marzo de 2025, 07:36:58 »
// Carácter personalizado para grados Celsius
const unsigned char GradosCelsius[8] = {
    0b00110,
    0b01001,
    0b01001,
    0b00110,
    0b00000,
    0b00000,
    0b00000,
    0b00000
};

// Función para cargar un carácter personalizado en CGRAM
void customcharacter(unsigned char codigo, const unsigned char *caracter) {
    unsigned char i;
    SetCGRamAddr(0x40 + (codigo * 8));  // Dirección en CGRAM
    for (i = 0; i < 8; i++) {
        WriteDataXLCD(caracter); 
    }
}

void main() {
    // Inicialización del LCD
    OpenXLCD(FOUR_BIT & LINES_5X7);
    while(BusyXLCD()); 

    customcharacter(0, GradosCelsius); // Carga el carácter en CGRAM

    SetDDRamAddr(0x00); // Posiciona el cursor
    while(BusyXLCD()); 

    // Imprime "Temp: 25°C" de manera eficiente
    putrsXLCD("Temp: 25");
    PutCXLCD(0); // Símbolo de grados
    PutCXLCD('C'); // Letra "C"

    while(1); // Bucle infinito
}
« Última modificación: 20 de Marzo de 2025, 07:41:02 por Jiha »

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 805
    • https://electronicadicto.wordpress.com/
Re:Ayuda para escribir y leer carácteres personalizados en un Display 16x2
« Respuesta #3 en: 20 de Marzo de 2025, 08:46:30 »
Hola, Gracias por tu respuesta.

No funciona ese código, cada vez que enciendo el proyecto me muestra un carácter diferente, símbolos sin forma alguna,

Creo que el código que has puesto tiene algún error, si no es así ruego me corrijan y me expliquen el por qué.

en la función:
Código: [Seleccionar]
void customcharacter(unsigned char codigo, const unsigned char *caracter);
creo que la variable caracter debería de ir así:
Código: [Seleccionar]
WriteDataXLCD(caracter[i]);
Para que el bucle for tenga algún sentido ahí y haga su trabajo que es ir desplazando la posición de la variable (arreglo de bits) e ir metiendo en CGRAM de el LCD cada uno de los datos de ese arreglo

y en la parte de mostrar el carácter en main:
la función
Código: [Seleccionar]
PutcXLCD()está mal puesta, es
Código: [Seleccionar]
putcXLCD() la P en minusculas

« Última modificación: 20 de Marzo de 2025, 09:30:31 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 805
    • https://electronicadicto.wordpress.com/
Re:Ayuda para escribir y leer carácteres personalizados en un Display 16x2
« Respuesta #4 en: 20 de Marzo de 2025, 09:02:50 »
Ya está, descubrí el problema, estaba en el puntero.... como funcionaría bien es así:

Código: [Seleccionar]

// Carácter personalizado para grados Celsius
const unsigned char GradosCelsius[8] = {
    0b01110,
    0b01010,
    0b01110,
    0b00000,
    0b11111,
    0b00000,
    0b00000,
    0b00000
};

// Función para cargar un carácter personalizado en CGRAM
void customcharacter(unsigned char codigo, const unsigned char *caracter) {
    unsigned char i;
    SetCGRamAddr(0x40 + (codigo * 8));  // Dirección en CGRAM
    for (i = 0; i < 8; i++) {
        WriteDataXLCD(caracter[i]);
    }
}

void main() {
    // Inicialización del LCD
    OpenXLCD(FOUR_BIT & LINES_5X7);
    while(BusyXLCD());

    customcharacter(0, &GradosCelsius); // Carga el carácter en CGRAM

    SetDDRamAddr(0x00); // Posiciona el cursor
    while(BusyXLCD());

    // Imprime "Temp: 25°C" de manera eficiente
   while( BusyXLCD() ); //wait untill LCD controller is busy
gotoxyXLCD(0,1); //Posición 1 caracter, línea 1
while( BusyXLCD() ); //wait untill LCD controller is busy
putrsXLCD("Temp: 26"); //Texto a mostar en la línea 1
while( BusyXLCD() ); //wait untill LCD controller is busy

gotoxyXLCD(9,1); //Posición 1 caracter, línea 1
while( BusyXLCD() ); //wait untill LCD controller is busy
WriteDataXLCD(0); // Mostrar el símbolo ºC

while( BusyXLCD() ); //wait untill LCD controller is busy
gotoxyXLCD(10,1); //Posición 1 caracter, línea 1
while( BusyXLCD() ); //wait untill LCD controller is busy
    putrsXLCD("C");
    while(1); // Bucle infinito
}


Y como la función gotoxyXLCD no está en los driver originales de microcip la comparto.

Código: [Seleccionar]
void gotoxyXLCD(unsigned char x, unsigned char y){//Función con la que podemos elegir posición
unsigned char direccion;

if(y != 1)
direccion = 0x40;
else
direccion = 0;

direccion += x-1;
commandXLCD(0x80 | direccion);
while( BusyXLCD() ); //wait untill LCD controller is busy
}

Pues gracias y un saludo, me han ayudado más de lo que piensan.
« Última modificación: 20 de Marzo de 2025, 09:07:10 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Jiha

  • PIC10
  • *
  • Mensajes: 28
Re:Ayuda para escribir y leer carácteres personalizados en un Display 16x2
« Respuesta #5 en: 20 de Marzo de 2025, 09:45:17 »
void gotoxyXLCD(unsigned char x, unsigned char y) {
    unsigned char direccion;
   
    switch (y) {
        case 1: direccion = 0x00; break; // Línea 1
        case 2: direccion = 0x40; break; // Línea 2
        case 3: direccion = 0x14; break; // Línea 3 (para LCDs de 4 líneas)
        case 4: direccion = 0x54; break; // Línea 4 (para LCDs de 4 líneas)
        default: return; // Si se ingresa un número de línea inválido, salir
    }

    direccion += (x - 1);
    commandXLCD(0x80 | direccion); // Enviar comando para mover el cursor
    while (BusyXLCD());  // Esperar a que el LCD esté listo
}

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 805
    • https://electronicadicto.wordpress.com/
Re:Ayuda para escribir y leer carácteres personalizados en un Display 16x2
« Respuesta #6 en: 20 de Marzo de 2025, 11:16:32 »
void gotoxyXLCD(unsigned char x, unsigned char y) {
    unsigned char direccion;
   
    switch (y) {
        case 1: direccion = 0x00; break; // Línea 1
        case 2: direccion = 0x40; break; // Línea 2
        case 3: direccion = 0x14; break; // Línea 3 (para LCDs de 4 líneas)
        case 4: direccion = 0x54; break; // Línea 4 (para LCDs de 4 líneas)
        default: return; // Si se ingresa un número de línea inválido, salir
    }

    direccion += (x - 1);
    commandXLCD(0x80 | direccion); // Enviar comando para mover el cursor
    while (BusyXLCD());  // Esperar a que el LCD esté listo
}

Esta forma no se me había ocurrido, gracias por compartir, me la apunto
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...


 

anything