将16X2 LCD连接到AVR微控制器
本节课完全是关于AVR微控制器(ATMEGA 16)与16X2 LCD的接口问题。Atmega16属于AVR微控制器系列。
电路解释:
这与LCD与8051或PIC微控制器的接口方式没有什么不同。水晶振荡器将向微控制器提供时钟。连接在晶体上的电容将作为过滤器,帮助晶体产生共振,并以平行共振的方式进行振荡。
连接到LCD的3号和2号引脚的电位器将有助于调整LCD的对比度。LCD的4、5和6个引脚,即寄存器选择、读/写和启用引脚,与Atmega16的PD0、PD1和PD2引脚相连。LCD的数据引脚与Atmega16的33至40引脚相连。
对ATMEGA16进行编程,以便与16X2 LCD连接:
你可以从8051单片机的16×2接口一文中得到LCD的简要信息。正如我前面所说的,编程的基本原理都是一样的,就是使用微控制器的引脚和寄存器。
非常重要的是如何向LCD发送数据以及如何向LCD发送命令,假设你要向LCD发送数据,那么你必须在发送数据之前将16×2 LCD的ENABLE引脚调为低电平,当你认为你要发送的数据已经准备好时,再将ENABLE引脚调为高电平,用编码语言表示为1。如果你把ENABLE引脚变成高电平,那么只有LCD会工作。
仅仅使ENABLE引脚为高电平是不行的,你必须使REGISTER SELECT引脚(RS引脚)也为高电平,这样LCD才会接受必须在LCD屏幕上显示的正常数据,如果你忘记使RS引脚为高电平,它最终会认为用户在向它发送命令,并使它自己准备好根据命令行事,如使光标移动、清除LCD上的数据、改变光标位置等等。
最后但并非最不重要的是另一个你需要担心的针脚--读/写针脚,我们都知道任何设备的基本功能都是从读和写开始的,读数据和写数据是任何外围设备或系统的主要和重要功能。
仅仅发送数据和显示数据并不能完成任务;以可理解的方式安排数据是程序员的重要和关键任务。你可以在LCD中安排数据或使LCD按照你的愿望工作,可以通过向LCD发送命令或特殊功能来完成,你可能会想,LCD需要什么类型的命令,光标位置的命令,增加或减少对比度,使光标改变行,如从第一行到第二行等等。 为了向LCD发送命令,你需要使引脚变成高电平和低电平,就像发送数据一样。为了发送命令,你需要使ENABLE针脚为高电平,REGISTER SELECT针脚(RS针脚)为低电平,也就是程序员所说的0,而读/写针脚(R/W针脚)为高电平,你需要记住这个配置来发送命令。
在显示数据时,程序员一般使用不同的命令和它们的十六进制代码。
如果我们想简单说说在LCD上显示数据的情况
E=1;使能引脚应该是高电平
RS=1;寄存器选择应该是高电平
R/W=0;读/写引脚应该为低电平。
对于向LCD发送命令
E=1;使能引脚应该为高电平
RS=0;寄存器选择应该是低电平
R/W=1;读/写引脚应该为高电平。
当你传递一个字符串时,最好使用一个字符串指针并递增这个指针,如果你递增一个指针,它将自动进入变量的下一个地址,你可以在其中存储你想显示的字符。请看下面的例子。
void write_string(unsigned char *str) //store address value of the string in pointer *str
{
int i=0;
while(strng[i]!=’ ′) // loop will go on till the NULL character in the string
{
lcd_write(strng[i]);// sending data on LCD byte by byte
i++;
}
return;
}
Code for Interfacing the LCD to ATMEGA16:
LCD DATA port----PORT B
signal port------PORT D
rs-------PD0
rw-------PD1
en-------PD2
*/
#define LCD_DATA PORTB //LCD data port
#define ctrl PORTD
#define en PD2 // enable signal
#define rw PD1 // read/write signal
#define rs PD0 // register select signal
void LCD_cmd(unsigned char cmd);
void init_LCD(void);
void LCD_write(unsigned char data);
int main()
{
DDRB=0xff; // setting the port B
DDRD=0x07; // setting for port D
init_LCD(); // initialization of LCD
_delay_ms(50); // delay of 50 mili seconds
LCD_write_string(“hello world”); // function to print string on LCD
return 0;
}
void init_LCD(void)
{
LCD_cmd(0x38); // initialization of 16X2 LCD in 8bit mode
_delay_ms(1);
LCD_cmd(0x01); // clear LCD
_delay_ms(1);
LCD_cmd(0x0E); // cursor ON
_delay_ms(1);
LCD_cmd(0x80); // —8 go to first line and –0 is for 0th position
_delay_ms(1);
return;
}
void LCD_cmd(unsigned 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);
return;
}
void LCD_write(unsigned char data)
{
LCD_DATA= data;
ctrl = (1<<rs)|(0<<rw)|(1<<en);
_delay_ms(1);
ctrl = (1<<rs)|(0<<rw)|(0<<en);
_delay_ms(50);
return ;
}
void LCD_write_string(unsigned char *str) //store address value of the string in pointer *str
{
int i=0;
while(str[i]!=’ ′) // loop will go on till the NULL character in the string
{
LCD_write(str[i]); // sending data on LCD byte by byte
i++;
}
return;
}
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码