如何将16x2 LCD与Atmega16 AVR连接并显示简单的欢迎消息

描述

显示器是任何机器的必要部分,无论是任何家用电器还是工业机器。显示屏不仅显示操作机器的控制选项,还显示该机器执行的任务的状态和输出。电子产品中使用的显示器类型很多,如 7 段显示器、16x2 LCD 显示器、TFT 触摸屏显示器、OLED 显示器等。

16x2 LCD显示器是最基本的显示模块,也用于一些小型电子设备,如计算器,数字仪表等。

在本教程中,我们将了解如何将16x2 LCD 与 Atmega16 AVR 微控制器连接并显示简单的欢迎消息。

所需组件

阿特梅加16

16x2液晶模块

运动员

面包板

ATmega16

威廉希尔官方网站 图

ATmega16

 

ATmega16

用于 16x2 LCD 显示器的 Atmega16 编程

编程不需要任何外部库。在这里,

Atmega16使用USBASP和Atmel Studio7.0进行编程

。项目结束时会给出

完整的程序和工作视频

,只需在 Atmega16 中上传程序并旋转 10k POT 即可调整 LCD 的亮度。

首先定义 CPU 频率,并包含 Atmel Studio 软件包附带的必要库,例如用于访问 IO 引脚的 和用于在程序中生成延迟的 。

 

#include                                

#include

 

在程序中定义LCD的RS和EN引脚。RS 引脚用于选择数据和命令寄存器。使能引脚锁存数据。

#define en PA3                                                   

#define rs PA2

还要定义Atmega16的哪个端口将用于连接LCD。这里,使用了PORTA。

#define lcdDirection  DDRA       

#define lcdPort PORTA

 

下一步是构造一个函数,该函数将通过传递参数来接受命令。有许多液晶屏十六进制命令。十六进制命令用于定义LCD的功能。由于我们使用LCD的4位模式,因此字节(8位)将以两个数据包发送。一个数据包将是上半字节(4位),另一个数据包将是下半字节(4位)。

void lcdCommand( unsigned char commands )

{

lcdPort = (lcdPort & 0x0F) | (commands & 0xF0); 

lcdPort &= ~ (1<

lcdPort |= (1<

_delay_us(1);

lcdPort &= ~ (1<

_delay_us(200);

lcdPort = (lcdPort & 0x0F) | (commands << 4);

lcdPort |= (1<

_delay_us(1);

lcdPort &= ~ (1<

_delay_ms(2);

}

下一步是接受字符并将其锁定到LCD端口。接收到的字符然后通过半字节发送到液晶屏半字节。该函数使用传递参数获取字符,然后获取上下半字节。对于数据寄存器,“rs”引脚设置为高电平,然后发送一个上升脉冲以锁存数据。类似地,通过更改使能值并发送使能的上升脉冲来发送较低的半字节。

void lcdChar( unsigned char string )

{

lcdPort = (lcdPort & 0x0F) | (string & 0xF0); 

lcdPort |= (1<

lcdPort|= (1<

_delay_us(1);

lcdPort &= ~ (1<

_delay_us(200);

lcdPort = (lcdPort & 0x0F) | (string << 4);   

lcdPort |= (1<

_delay_us(1);

lcdPort &= ~ (1<

_delay_ms(2);

}

此函数只是将字符转换为字符串,以后可以在需要写入字符串的程序中使用。

void lcdString (char *str) 

{

int j;

for(j=0;str[j]!=0;j++)                     

{

lcdChar (str[j]);

}

}

现在编写一个函数只是为了清除屏幕。您只需要在十六进制中发送命令 01,然后将光标设置为初始位置即可。

void lcdClear()                                                                                               

{

lcdCommand (0x01);                              

_delay_ms(2);

lcdCommand (0x80);                             

}

现在在主功能中,LCD已初始化。最初将液晶屏的端口方向设置为接口。在这里,端口设置为输出,因此设置 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);

初始化完成后,只需发送字符串来测试液晶屏。在这里,我们在 1 中发送一个字符串“接口 LCD”圣排。

lcdString("Interfacing LCD");

然后通过发送十六进制命令 c0 将光标移动到下一行。最后在这个位置上,写下字符串“With Atmega16”。

lcdCommand(0xC0);              

lcdString("With Atmega16");

ATmega16

关于将16x2 LCD与Atmega16接口的完整教程到此结束。请注意,如果您没有得到任何图像或像素,请根据代码和威廉希尔官方网站 图检查接线,或者更改连接到LCDV0引脚的POT的值。

/*

LCD16x2 4 bit ATmega16 interface

CircuitDigest(www.circuitdigest.com)

*/



#define F_CPU 16000000UL // Define CPU Frequency here it 16MHz 

#include // Include AVR std. library file 

#include // Include Delay header file 



#define en PA3 // Define Enable pin 

#define rs PA2 // Define Register Select pin 

#define lcdDirection DDRA // Define LCD data direction port 

#define lcdPort PORTA //Define LCD data port







void lcdCommand( unsigned char commands ) // commands will be sent from this function

{

lcdPort = (lcdPort & 0x0F) | (commands & 0xF0); // send upper nibble of 8 bit

lcdPort &= ~ (1<
lcdPort |= (1<
_delay_us(1);

lcdPort &= ~ (1<


_delay_us(200);



lcdPort = (lcdPort & 0x0F) | (commands << 4); // sending lower nibble of 8 bit i.e 1byte

lcdPort |= (1<
_delay_us(1);

lcdPort &= ~ (1<
_delay_ms(2);

}



void lcdChar( unsigned char string )

{

lcdPort = (lcdPort & 0x0F) | (string & 0xF0); // send upper nibble 

lcdPort |= (1<
lcdPort|= (1<
_delay_us(1);

lcdPort &= ~ (1<


_delay_us(200);



lcdPort = (lcdPort & 0x0F) | (string << 4); //send lower nibble 

lcdPort |= (1<
_delay_us(1);

lcdPort &= ~ (1<
_delay_ms(2);

}





void lcdString (char *str) // convert char to string fucntion

{

int j;

for(j=0;str[j]!=0;j++) 

{

lcdChar (str[j]);

}

}



void lcdClear()

{

lcdCommand (0x01); // send hex 01 to Clear display

_delay_ms(2);

lcdCommand (0x80); // send hex 80 to Cursor at home position 

}



int main()

{

// start Initializing 16x2 LCD

lcdDirection = 0xFF; // set LCD port direction in output

_delay_ms(20); // keep LCD Power ON delay >15ms always 



lcdCommand(0x02); // send for 4 bit initialization of LCD 

lcdCommand(0x28); // 2 line, 5*7 matrix in 4-bit mode 

lcdCommand(0x0c); // Display on cursor off

lcdCommand(0x06); // take curson to next position (shift cursor to right)

lcdCommand(0x01); // Clear display screen 

_delay_ms(2); //little delay



lcdString("Interfacing LCD"); // Write string on 1st row of 16x2 LCD

lcdCommand(0xC0); // move to 2nd row

lcdString("With Atmega16"); // write string on second line

}
 

 


 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分