TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Loudness en 04 de Septiembre de 2018, 10:47:51

Título: XC8 y LCD, cadenas de caracteres especiales
Publicado por: Loudness en 04 de Septiembre de 2018, 10:47:51
Hola de nuevo.

Vamos a ver como puedo explicarme sin liarme demasiado a escribir (imposible, seguro que voy a escribir bastante :D)

En los ratos libres sigo estudiando xc8 y, para tal menester me he comprado este libro:

https://www.apress.com/la/book/9781484232729

Aunque esta en ingles pero es bastante facil de leer.
De este libro precisamente he cogido unas librerias para lcd (se las incluyo) que parece funcionan y para escribir frases (p.e "Hola mundo") en pantalla he descubierto (yo no lo he descubierto realmente :lol:) dos metodos distintos:

Primer Metodo: metiendo caracter a caracter por su codigo ascii:

Código: [Seleccionar]
        Lcd_Set_Cursor(1,1);    // linea 1 posicion 1
    Lcd_Write_Char(0x48);  // Codigo Ascii letra "H" (01001000)
    Lcd_Write_Char(0x4F); // Codigo Ascii letra "O" (01001111)
    Lcd_Write_Char(0x4C); // Codigo Ascii letra "L" (01001100)
Lcd_Write_Char(0x41); // Codigo Ascii letra "A" (01000001)
....                 // etc etc

Lo malo es que con mensajes largos esto se convierte en algo bastante tedioso. Para eso esta el segundo metodo

Segundo metodo: utilizar char para hacer una cadena de caracteres y llamarla con una instruccion para leer cadenas:

Código: [Seleccionar]
        char MENSAJE[11] = "HOLA MUNDO";
....
Lcd_Write_String (MENSAJE);

Lo mires por donde lo mires el segundo metodo es mucho mas comodo.

Cual es mi problema estonces?.
Mi problema es cuando quiero escribir una frase no con alfabeto romano, sino utilizando caracteres especiales (letras griegas, katakana, simbolos) que no se pueden meter directamente en la instruccion char, aqui solo me queda el primer metodo:

Código: [Seleccionar]
Lcd_Set_Cursor(1,1);    // linea 1 posicion 1
    Lcd_Write_Char(0xE0);  // Codigo Ascii letra griega "alfa"     (11100000)
    Lcd_Write_Char(0xD2); // Codigo Ascii letra katakana "me" (11010010)
    Lcd_Write_Char(0xF2); // Codigo Ascii simbolo "yen"          (11111100)
        ......

Y esa es la duda que quiero consultarles: Hay alguna manera de crear "cadenas de caracteres especiales" para sacar en el LCD de una manera similar al alfabeto romano? 

Tambien he estado estudiando y probando con sprintf pero no logro que funcione....

Agradecere cualquier ayuda o consejo que puedan darme.

 - Tienes que ingresar para ver archivos adjuntos -
 - Tienes que ingresar para ver archivos adjuntos -
 - Tienes que ingresar para ver archivos adjuntos -
Título: Re:XC8 y LCD, cadenas de caracteres especiales
Publicado por: KILLERJC en 04 de Septiembre de 2018, 22:06:02
Citar
Y esa es la duda que quiero consultarles: Hay alguna manera de crear "cadenas de caracteres especiales" para sacar en el LCD de una manera similar al alfabeto romano? 

Como los caracteres que vos queres son especiales del LCD, es decir no corresponden con el ASCII, no vas a poder escribir una letra griega y que eso se convierta como las letras comunes. Por eso vas a tener que especificar letra por letra. Si es mas incomodo, pero podes usar el LCD_Write_String() , observa que el ultimo caracter debe ser 0x00 o '\0' que es lo mismo.

Código: C
  1. char MENSAJE[] = {'H','O','L','A',' ',0xE0,'\0',};
  2. ....
  3. Lcd_Write_String (MENSAJE);

Otra forma no se me ocurre para nada... Lo que podes hacer es darle un nombre si queres que sea mas simple de ver, pero nada mas

Código: C
  1. #define ALPHA 0xE0
  2.  
  3. char MENSAJE[] = {'H','O','L','A',' ',ALPHA,'\0',};
  4. ....
  5. Lcd_Write_String (MENSAJE);

Y los ejemplos que te doy claramente son para cuando tenes algun caracter en especial.  Sino lo haces como vos tenes. con sprintf podrias hacer asi:

Código: C
  1. sprintf(MENSAJE,"HOLA %c",ALPHA);
  2. Lcd_Write_String (MENSAJE);
Título: Re:XC8 y LCD, cadenas de caracteres especiales
Publicado por: Loudness en 05 de Septiembre de 2018, 00:44:56
Gracias KILLERJC por tu mensaje.

Sea como sea me espera una ardua tarea verdad :lol:?


Otra forma no se me ocurre para nada... Lo que podes hacer es darle un nombre si queres que sea mas simple de ver, pero nada mas

Código: C
  1. #define ALPHA 0xE0
  2.  
  3. char MENSAJE[] = {'H','O','L','A',' ',ALPHA,'\0',};
  4. ....
  5. Lcd_Write_String (MENSAJE);


Creo que esto va a ser lo mejor, de lo contrario me voy a equivocar si o si con tanto hexadecimal...

Saludos