Ya he probado el código que me pasaste D@rkbytes, sólo que sigue sin mostrar nada mi LCD.
Ya chequé los pines de mi dsPIC y funcionan bien, ya que si tienen salida.
Lo que vi es que la LCD utiliza un controlador HD44780
Ya busqué en el foro acerca de este controlador y he encontrado algunos, pero cuando los pruebo me salen errores.
Estoy usando el puerto D para los datos y el F para E, RS y RW.
Esta es la librería que encontré.
Ya chequé los pines de mi dsPIC y funcionan bien, ya que si tienen salida.
Lo que vi es que la LCD utiliza un controlador HD44780
Ya busqué en el foro acerca de este controlador y he encontrado algunos, pero cuando los pruebo me salen errores.
Estoy usando el puerto D para los datos y el F para E, RS y RW.
Esta es la librería que encontré.
C:
// Definición de Puertos Pantalla LCD 40x20 Hitachi 44780
#bit lcd_db4 = PORTD.4
#bit tris_lcd_db4 = TRISD.4
#bit lcd_db5 = PORTD.5
#bit tris_lcd_db5 = TRISD.5
#bit lcd_db6 = PORTD.6
#bit tris_lcd_db6 = TRISD.6
#bit lcd_db7 = PORTD.7
#bit tris_lcd_db7 = TRISD.7
#bit lcd_en = PORTD .0
#bit tris_lcd_en = TRISD.0
#bit lcd_rw = PORTD.2
#bit tris_lcd_rw = TRISD.2
#bit lcd_rs = PORTD.1
#bit tris_lcd_rs = TRISD.1
// lcd_init() Inicialización del LCD (debe utilizarse al principio,
// antes de trabajar con el LCD).
//
// lcd_putc(c) Imprime un caracter en el LCD.
//
// lcd_gotoxy(x,y) Selecciona la nueva posicion de escritura en el LCD.
// (la esquina superior izquierda es 1,1)
//
// lcd_getc(x,y) Devuelve el caracter de la posicion x,y del LCD.
//
// void lcd_erase_line(x) Borra una cantidad de caracter hacia la derecha
// Conexion a la pantalla LCD 40x4
// RB0 <---> LCD DB4
// RB1 <---> LCD DB5
// RB2 <---> LCD DB6
// RB3 <---> LCD DB7
// RA0 <---> LCD ENEABLE
// RA1 <---> LCD R/W
// RA2 <---> LCD RS
//
#define LCD_DATO 1
#define LCD_INST 0
#define LCD_LINEA1 0x80 // Direccion de memoria para la 1 linea
#define LCD_LINEA2 0xc0 // Direccion de memoria para la 2 linea
#define LCD_LINEA3 0x94 // Direccion de memoria para la 3 linea
#define LCD_LINEA4 0xd4 // Direccion de memoria para la 4 linea
#define chr_1 0x00
#define chr_2 0x01
#define chr_3 0x02
#define chr_4 0x03
#define chr_5 0x04
#define chr_6 0x05
#define chr_7 0x06
// 7 6 5 4 3 2 1 0
// Function Set 0b 0 0 1 B L F 0 0
// Bus size, B:0=4 bits, B:1=8 bits
// Line Number, L:0=1 Line, L:1=2 Lines
// Font size F:0=5x8, F:1=5x10
#define LCD_FUNCTION_SET 0b00101000 // Bus=4bit, Line=2 & Font=5x8
// 7 6 5 4 3 2 1 0
// Display/Cursor 0b 0 0 0 0 1 D U B
// Set Display on/off, D:0=off, D:1=on
// Underline cursor, U:0=off, U:1=on
// Blinking cursor, B:0=off, B:1=on
#define LCD_DISPLAY_CURSOR 0b00001100 // Display=on, Scroll=off, Blinkin=off
// 7 6 5 4 3 2 1 0
// Entry Mode 0b 0 0 0 0 0 1 M S
// Cursor direction, M:0=left, 1=right
// Display Scroll, S:0=no scroll, S:1=scroll
#define LCD_ENTRY_MODE 0b00000110 // Increment cursor, no disp shift
void lcd_set_write() {
tris_lcd_db4 = 0; //
tris_lcd_db5 = 0; //
tris_lcd_db6 = 0; //
tris_lcd_db7 = 0; //---> Set portb RB0-RB3 mode output
}
void lcd_set_read() {
tris_lcd_db4 = 1; //
tris_lcd_db5 = 1; //
tris_lcd_db6 = 1; //
tris_lcd_db7 = 1; //---> Set portb RB0-RB3 mode input
}
int8 lcd_read() {
int8 valor=0; // Crea e inicializa una variable de 8 Bits
lcd_set_read(); // Prepara el puerto DB4-DB7 como entrada
lcd_rw = 1; // Habilita modo de lectura
delay_cycles(1); // nop
lcd_en = 1; // Habilita LCD Enable
delay_cycles(1); // nop
if (lcd_db4) // Lectura de DB4
bit_set(valor,4); //
if (lcd_db5) // Lectura de DB5
bit_set(valor,5); //
if (lcd_db6) // Lectura de DB6
bit_set(valor,6); //
if (lcd_db7) // Lectura de DB7
bit_set(valor,7); //---> Recoge los datos MSB
lcd_en = 0; // Deshabilita LCD Enable
delay_cycles(1); // nop
lcd_en = 1; // Habilita LCD Enable
delay_us(2); // Espera 2 uSeg.
if (lcd_db4) //
bit_set(valor,0); //
if (lcd_db5) //
bit_set(valor,1); //
if (lcd_db6) //
bit_set(valor,2); //
if (lcd_db7) //
bit_set(valor,3); //---> Recoge los datos LSB
lcd_en = 0; // Deshabilita LCD Enable
delay_cycles(1); // nop
lcd_set_write(); // Prepara el puerto DB4-DB7 como salida
return (valor);
}
void lcd_send_nibble(int8 n) {
if (bit_test(n,0)) //
lcd_db4 = 1; //
else //
lcd_db4 = 0; //
if (bit_test(n,1)) //
lcd_db5 = 1; //
else //
lcd_db5 = 0; //
if (bit_test(n,2)) //
lcd_db6 = 1; //
else //
lcd_db6 = 0; //
if (bit_test(n,3)) //
lcd_db7 = 1; //
else //
lcd_db7 = 0; //---> Set data nibble
delay_cycles(1); // nop
lcd_en = 1; // Habilita LCD Eneable __
delay_us(2); // Espera 2 uSeg. | |
lcd_en = 0; // Desabilita LCD Eneable __| |__
}
void lcd_send_byte (int1 select, int8 n) {
lcd_rs = 0; // Modo de instruccion
while (bit_test(lcd_read(),7)); // Espera que la pantalla se desabilite
lcd_rs = select; // Escoje entre RS=0 : Instruccion & RS=1 : Data
delay_cycles(1); // nop
lcd_rw = 0; // Habilita modo de escritura
delay_cycles(1); // nop
lcd_en = 0; // Desabilita LCD Eneable
lcd_send_nibble(n >> 4); // Envia los datos superiores MSB
lcd_send_nibble(n); // Envia los datos inferiores LSB
}
// Opcional por si quieres crear caracteres especiales, puedes crear hasta 8
void lcd_cgram() {
int8 i;
const int8 chr[56] = {0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x15, // chr_1
0x15,0x00,0x10,0x10,0x10,0x10,0x00,0x15, // chr_2
0x15,0x00,0x14,0x14,0x14,0x14,0x00,0x15, // chr_3
0x15,0x00,0x15,0x15,0x15,0x15,0x00,0x15, // chr_4
0x00,0x00,0x00,0x00,0x1F,0x0E,0x04,0x00, // chr_5
0x00,0x04,0x0E,0x1F,0x04,0x04,0x04,0x00, // chr_6
0x00,0x04,0x04,0x04,0x1F,0x0E,0x04,0x00}; // chr_7
lcd_send_byte(LCD_INST, 0x40);
for(i=0;i<=55;++i) {
lcd_send_byte(LCD_DATO, chr);
}
lcd_send_byte(LCD_INST,0x01); // Clear LCD
}
void lcd_init() {
int8 i, count=0;
lcd_set_write(); // Prepara el puerto DB4-DB7 como salida
tris_lcd_en = 0; //
tris_lcd_rw = 0; //
tris_lcd_rs = 0; //---> Set porta RA0, RA1 & RA2 mode output
lcd_en = 0; //
lcd_rw = 0; //
lcd_rs = 0; //---> Clear LCD_EN, LCD_RW & LCD_RS
delay_ms(25);
retry:
for(i=1; i<=3; ++i) {
lcd_send_nibble(0b0011); // 8 bit mode 3 times
delay_ms(5);
}
lcd_send_nibble(0b0010); // 4 bit mode
while (bit_test(lcd_read(),7)) { // Espera que la pantalla se desabilite
delay_us(100);
count++;
if (count>=200) {
count=0;
goto retry;
}
}
lcd_send_byte(LCD_INST, LCD_FUNCTION_SET); // Function Set
lcd_send_byte(LCD_INST, LCD_DISPLAY_CURSOR); // Display Cursor
lcd_send_byte(LCD_INST, LCD_ENTRY_MODE); // Entry Mode
}
void lcd_gotoxy(int8 x, int8 y) {
int8 const address[4]={LCD_LINEA1,LCD_LINEA2,LCD_LINEA3,LCD_LINEA4};
int8 pos;
pos=address[y-1]+(x-1);
lcd_send_byte (LCD_INST, pos);
}
char lcd_getc(int8 x, int8 y) {
char valor;
lcd_gotoxy(x,y);
lcd_rs = 1;
valor = lcd_read();
lcd_rs = 0;
return (valor);
}
/*void lcd_putc(char c) {
lcd_send_byte(LCD_DATO,c);
}*/
void lcd_putc( char c) {
switch (c) {
case "f" : lcd_send_byte(0,1);
delay_ms(2);
break;
case "
" : lcd_gotoxy(1,2); break;
case "" : lcd_send_byte(0,0x10); break;
default : lcd_send_byte(LCD_DATO,c); break;
}
}
void lcd_clear() {
lcd_send_byte(LCD_INST,0x01);
}
void lcd_home() {
lcd_send_byte(LCD_INST,0x02);
}
void lcd_erase_line(int8 x) {
int8 i;
for(i=1;i<=x;++i) {
lcd_send_byte(LCD_DATO,32);
}
}
Última edición por un moderador: