Estoy intentando conectar una pantalla LCD de 16x4 con un chip atmega32. Escribí el siguiente código que solía funcionar para LCD 16x2
#include<avr/io.h>
#include<util/delay.h>
#define dataport PORTC // LCD data port
#define commport PORTD
#define en PD6 // enable signal
#define wr PD5 // read/write signal
#define rs PD4 // register select signal
int wrcomm(unsigned int data)
{
dataport=data;
_delay_ms(10);
commport &= ~(1 << rs);
commport &= ~(1 << wr);
commport |= (1 << en);
commport &= ~(1 << en);
_delay_ms(10);
return 1;
}
int wrdata(unsigned int data)
{
dataport=data;
_delay_ms(10);
commport |= (1 << rs);
commport &= ~(1 << wr);
commport |= (1 << en);
commport &= ~(1 << en);
_delay_ms(10);
return 1;
}
int lcd_putchar(unsigned char x)
{
wrdata(x);
return 1;
}
void lcd_init(void)
{
DDRC=0xff;
DDRD=0x70;
wrcomm(0x38);
wrcomm(0x01); //turn on display and cursor
wrcomm(0x0E);//cursor line 1 postn 1
wrcomm(0x80);
}
int main(void)
{
lcd_init();
lcd_putchar('a');
return 0;
}
Supongo que también debería funcionar para LCD 16x4. Pero no lo hace. La pantalla LCD es un JHD539 164b .
Lo único con lo que he progresado es que si no envío ningún comando, la segunda y la cuarta línea permanecen negras, pero si envío un comando, todas están desactivadas. La olla no ayuda en absoluto.