Я попытался связать ЖК-дисплей с atmega16, мой ЖК-дисплей - jhd 162A. Я приложил код, а также схему. Всякий раз, когда я подключаю соответствующие контакты, видны только черные точки, а не то, что я намеревался отобразить. Я не мог, в чем была моя проблема. прилагается схема.!
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 8000000L
#define lcd_data PORTC
#define control PORTB
#define rs PB2
#define rw PB1
#define en PB0
void lcd_init (void);
void lcd_command(unsigned char cmd);
void lcd_write(unsigned char data);
void lcd_string(unsigned char *str);
void dis_cmd(char cmd_value);
void dis_write(unsigned char data);
int main()
{
DDRB = 0xFF;
DDRC = 0xFF;
lcd_init();
_delay_ms(50);
_delay_ms(1);
lcd_str("PROGRAMMING");
_delay_ms(50);
dis_cmd(0xc0);
lcd_str("IS FUN");
return 0;
}
void lcd_init (void)
{
dis_cmd(0x02); //initialises lcd on 4 bits mode
_delay_ms(1);
dis_cmd(0x28); //initialises lcd to use 2 line and 5*7 matrix ie 16*2 lcd on 8 bits
_delay_ms(1);
dis_cmd(0x01);//clears lcd screen
_delay_ms(1);
dis_cmd(0x0E);//display ON cursor ON
_delay_ms(1);
dis_cmd(0x80);//cursor is set on the 1st line
_delay_ms(1);
return;
}
void lcd_command(unsigned char cmd)
{
lcd_data =cmd;
control = (0<<rs)| (0<<rw) | (1<<en); // setting rs to 0 is command mode when rw=0 write mode
_delay_ms(1);
control = (0<<rs)| (0<<rw) | (0<<en);
_delay_ms(50);
// 2ta control command is used for the high to low transition of enable as the code works on the falling
// edge of the enable en
return;
}
void lcd_write(unsigned char data)
{
lcd_data= data;
control = (1<<rs)| (0<<rw) | (1<<en); // setting rs to 0 is command mode when rw=0 write mode
_delay_ms(1);
control = (1<<rs)| (0<<rw) | (0<<en);
_delay_ms(50);
return;
}
void dis_write(unsigned char data)
{
char data1;
data1 = data & 0xF0; //mask lower nibble because PA4-PA7 pins are used.
lcd_write(data1);
data1 = ((data<<4) & 0xF0); //shift 4-bit and mask
lcd_write(data1);
return;
// send to LCD
}
void lcd_str(unsigned char *str)
{
int i = 0;
while(str[i] != '\0')
{
dis_write(str[i]);
i++;
}
return;
}
void dis_cmd(char cmd_value)
{
char cmd_value1;
cmd_value1 = cmd_value & 0xF0; //mask lower nibble because PB4-PA7 pins are used.
lcd_command(cmd_value1); // send to LCD
cmd_value1 = ((cmd_value<<4) & 0xF0); //shift 4-bit and mask
lcd_command(cmd_value1); // send to LCD
}