Adicionar un código para Generar caracteres LCD 20x4

Hola a todos, esto es muy importante, me encuentro trabajando con una LCD 20x4. El cual uso como compilador XC8. Baje una libreria muy buena, la cual compartire y realizare una pregunta:

La libreria es la siguiente:

Código:
#ifndef __flex_lcd_H
#define __flex_lcd_H

#define _XTAL_FREQ 40000000

//Configuracion de los Puertos del LCD
#define LCD_RD7     LATDbits.LATD7       // D7
#define TRISRD7     TRISDbits.TRISD7

#define LCD_RD6     LATDbits.LATD6       // D6
#define TRISRD6     TRISDbits.TRISD6

#define LCD_RD5     LATDbits.LATD5       // D5
#define TRISRD5     TRISDbits.TRISD5

#define LCD_RD4     LATDbits.LATD4       // D4
#define TRISRD4     TRISDbits.TRISD4

#define LCD_EN      LATDbits.LATD2       // EN
#define TRISEN      TRISEbits.TRISE2

#define LCD_RS      LATDbits.LATD1       // RS
#define TRISRS      TRISEbits.TRISE1

#define      LCD_FIRST_ROW           128
#define      LCD_SECOND_ROW          192
#define      LCD_THIRD_ROW           148
#define      LCD_FOURTH_ROW          212
#define      LCD_CLEAR               1
#define      LCD_RETURN_HOME         2
#define      LCD_CURSOR_OFF          12
#define      LCD_UNDERLINE_ON        14
#define      LCD_BLINK_CURSOR_ON     15
#define      LCD_MOVE_CURSOR_LEFT    16
#define      LCD_MOVE_CURSOR_RIGHT   20
#define      LCD_TURN_OFF            0
#define      LCD_TURN_ON             8
#define      LCD_SHIFT_LEFT          24
#define      LCD_SHIFT_RIGHT         28


//Declaracion de Prototipos
void Lcd_Init(void);
void Lcd_Out(unsigned char y, unsigned char x, const char *buffer);
void Lcd_Out2(unsigned char y, unsigned char x, char *buffer);
void Lcd_Chr_CP(char data);
void Lcd_Cmd(unsigned char data);
static void _send_nibble(unsigned char data);
static void _send_byte(unsigned char data);
void lcd_add_character(unsigned char addr, unsigned char * pattern);
void lcd_command(unsigned char command);
void lcd_data(unsigned char data);
//Funciones de Retardos
void delay_ms10(int del){
    unsigned int ii;
    for (ii=0;ii<del;ii++){
        __delay_ms(10);
    }
}
void lcd_goto(unsigned char py, unsigned char px){
    //Funcion de Posicionamiento del Cursor en el LCD

}
void lcd_init(){
    unsigned char data;

    TRISRD7 = 0;
    TRISRD6 = 0;
    TRISRD5 = 0;
    TRISRD4 = 0;
    TRISEN = 0;
    TRISRS = 0;
    LCD_RD7 = 0;
    LCD_RD6 = 0;
    LCD_RD5 = 0;
    LCD_RD4 = 0;
    LCD_EN = 0;
    LCD_RS = 0;
    __delay_us(5500);
    __delay_us(5500);
    __delay_us(5500);
    __delay_us(5500);
    __delay_us(5500);
    __delay_us(5500);
    for(data = 1; data < 4; data ++)
    {
        LCD_RD7 = 0;    LCD_RD6 = 0;    LCD_RD5 = 1;    LCD_RD4 = 1;    LCD_EN = 0;
        LCD_RS = 0;    LCD_RD7 = 0;    LCD_RD6 = 0;    LCD_RD5 = 1;    LCD_RD4 = 1;
        LCD_EN = 1;    LCD_RS = 0;
        __delay_us(5);
        LCD_RD7 = 0;    LCD_RD6 = 0;    LCD_RD5 = 1;    LCD_RD4 = 1;    LCD_EN = 0;
        LCD_RS = 0;
        __delay_us(5500);
    }
    LCD_RD7 = 0; LCD_RD6 = 0; LCD_RD5 = 1; LCD_RD4 = 0; LCD_EN = 0; LCD_RS = 0;
    LCD_RD7 = 0; LCD_RD6 = 0; LCD_RD5 = 1; LCD_RD4 = 0; LCD_EN = 1; LCD_RS = 0;
    __delay_us(5);
    LCD_RD7 = 0; LCD_RD6 = 0; LCD_RD5 = 1; LCD_RD4 = 0; LCD_EN = 0; LCD_RS = 0;
    __delay_us(5500);
    data = 40; Lcd_Cmd(data);
    data = 16; Lcd_Cmd(data);
    data = 1;  Lcd_Cmd(data);
    data = 15; Lcd_Cmd(data);

}

void Lcd_Out(unsigned char y, unsigned char x, const char *buffer){
    unsigned char data;
    switch (y){
        case 1: data = 128 + x; break;
        case 2: data = 192 + x; break;
        case 3: data = 148 + x; break;
        case 4: data = 212 + x; break;
        default: break;
    }
    Lcd_Cmd(data);
    while(*buffer){
        Lcd_Chr_CP(*buffer);
        buffer++;               // Increment buffer
    }
    return;
}

//Imprime una series de caracteres
void Lcd_Out2(unsigned char y, unsigned char x, char *buffer){
    unsigned char data;
    switch (y){
        case 1: data = 128 + x; break;
        case 2: data = 192 + x; break;
        case 3: data = 148 + x; break;
        case 4: data = 212 + x; break;
        default: break;
    }
    Lcd_Cmd(data);
    while(*buffer){
        Lcd_Chr_CP(*buffer);
        buffer++;
    }
    return;
}

//Imprime un solo caracter
void Lcd_Chr_CP(char data){
    LCD_EN = 0; LCD_RS = 1;
    LCD_RD7 = (data & 0b10000000)>>7; LCD_RD6 = (data & 0b01000000)>>6;
    LCD_RD5 = (data & 0b00100000)>>5; LCD_RD4 = (data & 0b00010000)>>4;
    _delay(10);
    LCD_EN = 1; __delay_us(5); LCD_EN = 0;
    LCD_RD7 = (data & 0b00001000)>>3; LCD_RD6 = (data & 0b00000100)>>2;
    LCD_RD5 = (data & 0b00000010)>>1; LCD_RD4 = (data & 0b00000001);
    _delay(10);
    LCD_EN = 1; __delay_us(5); LCD_EN = 0;
    __delay_us(5); __delay_us(5500);
}

//Ejecucion de Comandos del LCD
void Lcd_Cmd(unsigned char data){
    LCD_EN = 0;

    LCD_RS = 0;
    LCD_RD7 = (data & 0b10000000)>>7; LCD_RD6 = (data & 0b01000000)>>6;
    LCD_RD5 = (data & 0b00100000)>>5; LCD_RD4 = (data & 0b00010000)>>4;
    _delay(10);
    LCD_EN = 1; __delay_us(5); LCD_EN = 0;
    LCD_RD7 = (data & 0b00001000)>>3; LCD_RD6 = (data & 0b00000100)>>2;
    LCD_RD5 = (data & 0b00000010)>>1; LCD_RD4 = (data & 0b00000001);
    _delay(10);
    LCD_EN = 1; __delay_us(5); LCD_EN = 0;
    __delay_us(5500);//Delay_5us();
}

#endif


Ahora quiero agregar un código que se encargue de adicionar caracteres especiales. Consegui una página muy buena que genera las coordenadas para dibujar estos caracteres.

Aqui la tienen; http://www.quinapalus.com/hd44780udg.html

Esperando su grata y buena respuesta que ayudará aportar una buena lógica al código. Me despido. Gracias ...
 
Última edición por un moderador:
El código que usted a subido no pertenece a flex_lcd_H. La pagina donde usted lo descargo cambio el nombre y altero el código.

El código original usted lo puede encontrar en la descripción del vídeo. Busque en google lo siguiente.

"16x2 LCD Display library - YouTube"

La librería esta disponible tanto para MPLABC18 como para MPLABX XC8.
La librería pertenece a Hector8389.
La librería actualmente fue actualizada.
Para imprimir caracteres especiales el autor próximamente lanzara la actualizacion.

Gracias.
 
Ok Gracias por responder y ganarte el protagonismo. Pero esto no lleva al caso. La idea central es tratar de hacer un código para generar cgram. Yo hice esto, si alguien sabe que pude hacer mal. Por que no me imprime el caracter especial

//Declaracion de Caracteres Especiales
unsigned char arrow[8]={0,10,17,21,17,10,0};

void main(){
Lcd_Add_Character(3,0,1,arrow);
}

void Lcd_Add_Character(unsigned char y, unsigned char x,unsigned char addr, unsigned char *pattern){
unsigned char i, direccion,data;

switch (y){
case 1: data = 128 + x; break;
case 2: data = 192 + x; break;
case 3: data = 148 + x; break;
case 4: data = 212 + x; break;
default: break;
}
Lcd_Cmd(data);
__delay_us(50);
direccion=addr+SET_CG_RAM_ADDRES;
Lcd_Cmd(direccion);

for(i=0;i<8;i++)
Lcd_Chr_CP(pattern);
}

Gracias
 
Última edición:
Ok ya tome nota de lo que usted trata de hacer. Próximamente se actualizara la librería. Por el momento no le puedo dar una solución rápida.

Con respecto al "protagonismo", para nada :)
La librería es código abierto y libre descarga.:):)
La próxima actualizacion tendrá version en español. :)

Saludos.
 
Última edición:
Atrás
Arriba