TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: javprogramador en 08 de Marzo de 2010, 15:23:06
-
Muy buenas tengo un pequeño problema a ver si me podriais ayudar. Estoy tratando de hacer funcionar un lcd de 4 lineas pero mi rutina es para uno de 2 lineas ¿Alguien sabria decirme que cambios realizar? Gracias de antemano
//// Driver para LCDs basados en HD44780 ////
//// ////
//// Basado en el driver 'LCD.C' incluido con el compilador C de CCS ////
//// versión 3.234. ////
//// ////
//// Válido para ser utilizado con la nueva versión de las tarjetas ////
//// PICDEM2 PLUS de Microchip (las verdes). ////
//// ////
//// Modificaciones efectuadas por Miguel Ángel José Prieto ////
//// ////
//// ----------------------------------------------------------------- ////
//// ////
//// FUNCIONES DEFINIDAS ////
//// =================== ////
//// ////
//// lcd_init() Debe llamarse antes que cualquier otra función ////
//// ////
//// lcd_putc(c) Muestra 'c' en la siguiente posición del LCD ////
//// Caracteres con significado especial ////
//// \f Borra display ////
//// \n Va al inicio de la segunda línea ////
//// \b Retrocede una posición ////
//// ////
//// lcd_gotoxy(x,y) Fija la posición del LCD donde escribir ////
//// ////
//// lcd_getc(x,y) Devuelve el carácter en la posición x,y del LCD ////
//// ////
///////////////////////////////////////////////////////////////////////////
//// ////
//// v. 01 * Se pasan las líneas de datos del LCD a los cuatro bits ////
//// más bajos del puerto. ////
//// * Se traducen los comentarios al español. ////
//// ////
///////////////////////////////////////////////////////////////////////////
// Los pines a conectar se definen en una estructura como sigue:
// X0 D4
// X1 D5
// X2 D6
// X3 D7
// X4 rs
// X5 rw
// X6 enable
// X7 Control de la alimentación del LCD
//
// X puede ser el puerto D o el puerto B en este fichero.
// No se usan los pines D0-D3 del LCD (4 líneas de datos).
// Quitar el siguiente comentario para usar PORTB en vez de PORTD.
// #define use_portb_lcd TRUE
struct lcd_pin_map
{ // Esta estructura se mapea
int data : 4; // en un puerto de E/S para
BOOLEAN rs; // acceder a los pines del LCD.
BOOLEAN rw; // Los bits se definen empezando
BOOLEAN enable; // por el más bajo. ENABLE es
BOOLEAN
Vcc; // el bit X6 del PIC.
} lcd;
#if defined(__PCH__) // Aquí se mapea la estructura
#if defined use_portb_lcd
#byte lcd = 0xF81 // en el puerto B (dirección F81h)
#else
#byte lcd = 0xF83 // o en el D (dirección F83h)
#endif
#else
#if defined use_portb_lcd
#byte lcd = 6 // en el puerto B (dirección 6)
#else
#byte lcd = 8 // o en el D (dirección 8)
#endif
#endif
#if defined use_portb_lcd
#define set_tris_lcd(x) set_tris_b(x)
#else
#define set_tris_lcd(x) set_tris_d(x)
#endif
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 líneas
#define lcd_line_two 0x40 // Dirección RAM del LCD para la segunda línea
// Estos bytes se mandan al LCD para inicializarlo.
BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
// Estas constantes se usan para configurar los puertos de E/S.
// En modo escritura, todos los pines son salidas.
// En modo lectura, los pines de datos son entradas.
struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0};
struct lcd_pin_map const LCD_READ = {15,0,0,0,0};
///////////////////////////////////////////////////////////////////////////
BYTE lcd_read_byte()
{
BYTE low,high;
set_tris_lcd(LCD_READ);
lcd.rw = 1;
delay_cycles(2);
lcd.enable = 1;
delay_cycles(4);
high = lcd.data;
lcd.enable = 0;
delay_cycles(8);
lcd.enable = 1;
delay_us(1);
low = lcd.data;
lcd.enable = 0;
set_tris_lcd(LCD_WRITE);
return( (high<<4) | low);
}
///////////////////////////////////////////////////////////////////////////
void lcd_send_nibble(BYTE n)
{
lcd.data = n;
delay_cycles(3);
lcd.enable = 1;
delay_us(4);
lcd.enable = 0;
}
///////////////////////////////////////////////////////////////////////////
void lcd_send_byte(BYTE address,BYTE n)
{
lcd.rs = 0;
delay_ms(3); // Espera por LCD desocupado.
lcd.rs = address;
delay_cycles(3);
lcd.rw = 0;
delay_cycles(3);
lcd.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
///////////////////////////////////////////////////////////////////////////
void lcd_init()
{
BYTE i;
set_tris_lcd(LCD_WRITE);
lcd.Vcc = 1; // Asegura que el LCD esté alimentado.
lcd.rs = 0;
lcd.rw = 0;
lcd.enable = 0;
delay_ms(15);
for(i=1;i<=3;++i)
{
lcd_send_nibble(3);
delay_ms(5);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING);
}
///////////////////////////////////////////////////////////////////////////
void lcd_gotoxy(BYTE x,BYTE y)
{
BYTE address;
if(y!=1)
address=lcd_line_two;
else
address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
}
///////////////////////////////////////////////////////////////////////////
void lcd_putc(char c)
{
switch (c)
{
case '\f': lcd_send_byte(0,1);
delay_ms(5);
break;
case '\n': lcd_gotoxy(1,2);
break;
case '\b': lcd_send_byte(0,0x10);
break;
default : lcd_send_byte(1,c);
break;
}
}
///////////////////////////////////////////////////////////////////////////
char lcd_getc(BYTE x, BYTE y)
{
char value;
lcd_gotoxy(x,y);
delay_ms(3); // Espera por LCD desocupado.
lcd.rs=1;
value = lcd_read_byte();
lcd.rs=0;
return(value);
}
-
CCS tiene libreria para LCD de 4 lineas, buscala en la carpeta de drivers. Sino hay otra en el foro de CCS. (http://www.ccsinfo.com/forum)
Saludos!
-
Ya lo he resuelto gracias de todos modos