接口16x2液晶显示到AVR微控制器

本次会议完全处理接口AVR微控制器(Atmega 16),具有16x2 LCD。Atmega16属于AVR微控制器系列。

接口16x2 LCD到AVR微控制器的电路图:

接口16x2 LCD到AVR微控制器电路图

电路说明:

  • 嗯,这与接口LCD到8051或PIC微控制器的方式不同。晶体振荡器将向微控制器提供时钟。连接到晶体的电容器将充当滤波器并帮助晶体共振并振荡到其并联谐振模式。
  • 连接到LCD的引脚3和PIN2的电位计将有助于调整LCD的对比度。作为寄存器选择,读/写和使能引脚的LCD的4,5和6引脚连接到ATMEGA16的PD0,PD1和PD2引脚。LCD的数据引脚连接到Atmega16的33至40销的引脚。

编程ATMEGA16以与16x2 LCD接口:

您可以从帖子中获取LCD的简要信息从8051微控制器接口16×2。正如我所说的,使用引脚和微控制器的寄存器都有相同的编程基本。

它非常重要地将数据发送到LCD以及命令如何发送到LCD,假设您是否已将数据发送到LCD,则必须在发送之前使启用引脚为16×2 LCD引脚为低电平数据,当您认为要发送的数据时,请准备好使使能引脚再次高,为编码语言为1。如果您使启用引脚高,则只能使用LCD。

只需使得启用引脚高即可工作,您就可以使寄存器选择引脚(RS引脚)高,以便LCD将接受它,即必须在LCD屏幕上显示的正常数据,如果您忘了制作卢比PIN高电平最终认为用户正在将其发送命令并使其自动为根据制作光标移动的命令进行操作,清除LCD上的数据,改变光标位置等。

最后但并非最不重要的是您需要担心读/写引脚的PIN,我们都知道,对于任何设备,基本功能从读写开始,读取数据并写入数据是任何外设或系统的主要和重要功能。在LCD中,在发送数据的同时显示用于显示的数据,您必须使R / W引脚低,因此LCD将在托管下将数据写入LCD屏幕并相应行动。

只需发送数据并显示它将无法完成任务;以可理解的方式排列数据是程序员的重要和关键任务。您可以在LCD中排列数据或使LCD根据您的愿望工作,可以通过向LCD发送命令或特殊功能来完成,您可以认为需要哪种类型的命令来为LCD,命令光标位置,增加或减少对比度,使光标从第一行变为第二行等,以向液晶显示器发送命令,只需发送数据,就像发送数据一样。要发送您需要使使能引脚高的命令高,寄存器选择PIN(RS引脚)低为0中的程序员术语,而读/写引脚(R / WIC PIN)高,则需要记住发送此配置以发送此配置命令。

在显示数据时,程序员通常使用不同的命令和有十六进制代码。

sno.
液晶指令
十六进制代码
1
如果要在5x7矩阵中显示一行中的内容
0x30.
2
如果要在5x7矩阵中显示两行中的内容
0x38
3.
如果在5x7矩阵中以一行中显示4位数据
0x20.
4.
如果在5x7矩阵中显示两行中的4位数据
0x28
5.
进入模式
0x06
6.
清除显示而不清除RAM内容
0x08
7.
制作光标上并显示屏上
0x0e.
8.
使光标关闭并显示关闭
0x0c.
9.
显示光标闪烁上的数据
0x0f.
10.
将完整的显示数据转移到左侧
0x18
11.
将完整的显示数据转换为右侧
0x1c.
12.
将光标移动到一个地方或一个字符
0x10
13.
将光标移动到一个地方或一个字符
0x14
14.
清除完整的显示,包括RAM数据
0x01
15.
在光标位置设置DDRAM地址
0x80 +添加

如果我们想简要介绍在LCD中显示数据

  • E = 1;启用PIN应高
  • Rs = 1;注册选择应该很高
  • r / w = 0;读/写销应低。

用于向LCD发送命令

  • E = 1;启用PIN应高
  • rs = 0;注册选择应低
  • r / w = 1;读/写销应高。

当您传递一个字符串时,它更好地使用字符串指针并递增指针,如果要递增指针,它将自动转到可变的可变的下一个地址,您可以在其中存储您想要显示的字符。请参阅以下示例。

void write_string(无符号char * str)//存储指针* str中字符串的地址值

{

INT i = 0;

而(strng [i]!='\ 0')//循环将继续在字符串中的空字符上

{
lcd_write(strng [i]); //按字节向LCD字节发送数据
I ++;
}
返回;

}

将LCD连接到ATMEGA16的代码:

LCD数据端口---- Port B
信号端口------端口D
RS ------- PD0.
RW ------- PD1.
EN ------- PD2.
* /

#define lcd_data portb // lcd数据端口
#define ctrl portd.
#define en pd2 //使能信号
#define RW PD1 //读/写信号
#define RS PD0 //寄存器选择信号

void lcd_cmd(无符号char cmd);
void init_lcd(void);
void lcd_write(无符号char数据);

int main()
{
ddrb = 0xff;//设置端口b
ddrd = 0x07;//端口D设置
init_lcd();//液晶显示屏初始化
_delay_ms(50);//延迟50 mili秒
lcd_write_string(“Hello World”);//函数打印LCD上的字符串
返回0;
}

void init_lcd(void)
{
lcd_cmd(0x38);// 8位模式下的16x2 LCD初始化
_delay_ms(1);
lcd_cmd(0x01);//清除LCD.
_delay_ms(1);
lcd_cmd(0x0e);//光标上
_delay_ms(1);
lcd_cmd(0x80);// -8转到第一行,--0是第0位置
_delay_ms(1);
返回;
}

void lcd_cmd(无符号char cmd)
{
lcd_data = cmd;
ctrl =(0 << RS)|(0 << RW)|(1 << en);
_delay_ms(1);
ctrl =(0 << RS)|(0 << RW)|(0 << en);
_delay_ms(50);
返回;
}

void lcd_write(无符号char数据)
{
lcd_data =数据;
ctrl =(1 << RS)|(0 << RW)|(1 << en);
_delay_ms(1);
ctrl =(1 << RS)|(0 << RW)|(0 << en);
_delay_ms(50);
返回 ;
}

void lcd_write_string(未签名的char * str)// store point * str中字符串的地址值
{
INT i = 0;
而(str [i]!='\ 0')//循环将继续直到字符串中的null字符
{
lcd_write(str [i]);//按字节向LCD字节发送数据
I ++;
}
返回;
}

3回复

  1. 说得好!- 我读到了Wiki中的这个概念,我觉得与维基相比,这篇文章中提供的信息具有良好的东西。谢谢!

  2. 和代码......

    #包括
    #包括

    #define f_cpu 1000000UL.

    #define lcd_data portd //数据端口
    #define ctrl portc // controlle端口
    #define en pc3 //启用端口和引脚
    #define RW PC2 //读/写端口和引脚
    #define RS PC1 //寄存器选择端口和引脚

    void lcd_cmd(无符号char cmd);
    void init_lcd(void);
    void lcd_write(无符号char数据);
    void lcd_write_string(char * str);

    int main()
    {
    ddrd = 0xff;//设置输出端口D.
    DDRC = 0B00001110;//设置端口C的设置输出

    init_lcd();//液晶显示屏初始化
    _delay_ms(100);//延迟50 mili秒
    lcd_write_string(“Andrej !!! 111”);//函数打印LCD上的字符串

    而(1)
    {
    }
    返回0;
    }

    void init_lcd(void)
    {
    lcd_cmd(0x01);//清除LCD.
    _delay_ms(1);
    lcd_cmd(0x38);// 8位模式下的16x2 LCD初始化
    _delay_ms(1);
    lcd_cmd(0x0e);//光标上
    _delay_ms(1);
    lcd_cmd(0x80);// -8转到第一行,--0是第0位置
    _delay_ms(1);
    返回;
    }

    void lcd_cmd(无符号char cmd)
    {
    lcd_data = cmd;
    ctrl =(0 << RS)|(0 << RW)|(1 << en);
    _delay_ms(1);
    ctrl =(0 << RS)|(0 << RW)|(0 << en);
    _delay_ms(50);
    返回;
    }

    void lcd_write(无符号char数据)
    {
    lcd_data =数据;
    ctrl =(1 << RS)|(0 << RW)|(1 << en);
    _delay_ms(1);
    ctrl =(1 << RS)|(0 << RW)|(0 << en);
    _delay_ms(50);
    返回 ;
    }

    void lcd_write_string(char * str)
    {
    INT i = 0;
    而(str [i]!='')//循环将继续直到字符串中的null字符
    {
    lcd_write(str [i]);//按字节向LCD字节发送数据
    I ++;
    }
    返回;
    }

发表评论

您的电子邮件地址不会被公开。必需的地方已做标记*