我试着将液晶显示器与atmega16接口,我的液晶显示器是jhd 162 A。我附加了代码以及schematic.whenever,我连接了适当的引脚,只看到了黑点,而不是我想要显示的。我不能知道我的问题是什么。我还附了示意图。
#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
}发布于 2014-06-17 07:34:46
我认为您没有执行所需的init序列。在lcd_init()中,首先发送函数集。
但是,在此之前,显示将等待这样的序列:

我不知道如何使用4位接口来处理这个问题,但我认为这就是DB3-0“不关心”的原因。您可能只需将DB7-4应用于您的4位总线(读取数据表)。
我会在启动时等待几百毫秒,以确保Vcc是稳定的。然后,按照重置顺序与放松的时间,如
PowerOn
等待200
发送指令
等待20
发送指令
等待5毫秒
发送指令
等待5毫秒
发送函数集
..。
由于您没有轮询繁忙的标志,我将等待至少1ms之间的所有指示。
发布于 2014-06-21 11:08:25
您正在lcd_init中定义四位模式,您的编程是8位模式。
对于8位模式,请像这样使用它
void lcd_init (void)
{
dis_cmd(0x02); //initialises lcd on 4 bits mode
_delay_ms(1);
dis_cmd(0x38); //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;
}此外,PORTC有时会在lcd上产生问题,为此您必须禁用JTAG。
发布于 2014-12-23 04:47:29
您的代码中有两个问题:-
1)您正在使用“dis_cmd(0x28)”命令,该命令定义了4位模式。如果要使用8位模式,请将其更改为“dis_cmd(0x38);”
2)不要将PORTC用于lcd数据或禁用JTAG。使用JTAG启用时,PORTC不会将数据提供给lcd。我不知道背后的原因,但我已经学会了这一点,我自己的经验。
https://stackoverflow.com/questions/24247495
复制相似问题