新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 将16X2 LCD连接到AVR微控制器

将16X2 LCD连接到AVR微控制器

作者:时间:2023-04-28来源:电子产品世界收藏

本节课完全是关于(ATMEGA 16)与16X2 的接口问题。Atmega16属于系列。

本文引用地址:http://www.eepw.com.cn/article/202304/446098.htm

电路解释:

这与与8051或PIC的接口方式没有什么不同。水晶振荡器将向微控制器提供时钟。连接在晶体上的电容将作为过滤器,帮助晶体产生共振,并以平行共振的方式进行振荡。

 连接到的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针脚)为高电平,你需要记住这个配置来发送命令。

在显示数据时,程序员一般使用不同的命令和它们的十六进制代码。

1682650753904628.png

如果我们想简单说说在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;

}



关键词: AVR 微控制器 LCD

评论


相关推荐

技术专区

关闭