无论是家用电器还是工业机器,显示器都是任何机器的必要组成部分。显示屏不仅显示用于操作机器的控制选项,还显示该机器执行的任务的状态和输出。电子产品中使用的显示器类型很多,例如7段显示器,16x2 LCD显示器,TFT触摸屏显示器,OLED显示器等。
16x2 LCD显示是最基本的显示模块,还用于一些小型电子设备,例如计算器,数字仪表等。我们已经使用16x2 LCD完成了许多项目,包括与其他微控制器的基本接口:
- LCD与8051单片机的接口
- LCD与ATmega32单片机的接口
- 与PIC单片机的LCD接口
- 将16x2 LCD与Arduino接口
- 使用Python与Raspberry Pi进行16x2 LCD接口
在本教程中,我们将看到如何将16x2 LCD与Atmega16 AVR微控制器接口并显示一条简单的欢迎消息。
所需组件
- Atmega16
- 16x2 LCD模块
- 跳线
- 面包板
电路原理图
为16x2 LCD显示器编程Atmega16
编程不需要任何外部库。此处, Atmega16使用USBASP和Atmel Studio7.0进行编程。 在项目结束时提供完整的程序和工作视频,只需将程序上传到Atmega16中并旋转10k POT即可调整LCD的亮度。最初定义CPU频率,并包括Atmel Studio软件包随附的必要库,例如 用于访问IO引脚和
在程序中定义LCD的RS和EN引脚。RS引脚用于选择数据和命令寄存器。使能引脚锁存数据。
#define PA3 #define rs PA2
还要定义将Atmega16的哪个PORT用于连接LCD。在此,使用PORTA。
#define lcdDirection DDRA #define lcdPort PORTA
下一步是构造一个函数,该函数将通过传递参数来接受命令。LCD HEX命令很多。十六进制命令用于定义LCD的功能。由于我们使用LCD的4位模式,因此将以两个数据包发送字节(8位)。一个数据包将是高位半字节(4位),其他数据包将是低位半字节(4位)。
无效的lcdCommand(无符号字符命令) { lcdPort =(lcdPort&0x0F)-(commands&0xF0); lcdPort&=〜(1 <
下一步将是接受字符并将其锁存到LCD端口。然后将接收到的字符逐个字节地发送到LCD半字节。函数使用 pass by参数 获取字符,然后获取上下半字节。数据寄存器的“ rs”引脚设置为高电平,然后发送上升脉冲以锁存数据。同样,通过更改使能值并发送使能上升脉冲来发送较低的半字节。
void lcdChar(unsigned char string) { lcdPort =(lcdPort&0x0F)-(string&0xF0); lcdPort-=(1 <
该函数只是将字符转换为字符串,并且可以在以后需要写入字符串的程序中使用。
void lcdString(char * str) { int j; for(j = 0; str!= 0; j ++) { lcdChar(str); } }
现在编写一个函数只是为了清除屏幕。您只需要以十六进制发送命令 01 ,然后将光标设置到初始位置即可。
void lcdClear() { lcdCommand(0x01); _delay_ms(2); lcdCommand(0x80); }
现在在主功能中,LCD初始化。最初设置LCD的端口方向以进行接口连接。此处,PORT设置为OUTPUT,因此设置FF。
lcdDirection = 0xFF; _delay_ms(20)
然后通过以十六进制发送02来将LCD设置为4位模式。还以十六进制发送28,以将其设置为4位模式的2行15x7矩阵像素。
lcdCommand(0x02); lcdCommand(0x28);
的命令0C和06被用来控制光标的位置。最后,只需以十六进制形式发送01即可清除屏幕。这样将完成LCD的初始化。
lcdCommand(0x0c); lcdCommand(0x06); lcdCommand(0x01);
初始化完成后,只需发送一个字符串来测试LCD。在这里,我们发送一个字符串“ 接口LCD 1个中的”第一排。
lcdString(“接口LCD”);
然后通过以十六进制发送命令c0将光标移动到下一行。最后在该位置上,编写字符串“ With Atmega1 6”。
lcdCommand(0xC0); lcdString(“ With Atmega16”);
至此,完成了将16x2 LCD与Atmega16接口的完整教程。请注意,如果没有任何图像或像素,请根据代码和电路图检查接线或更改连接到LCD V0引脚的POT的值。如果您有任何疑问或建议,可以通过写信给我们的论坛或在下面的评论中与我们联系。