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

描述

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

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

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

所需组件

阿特梅加16

16x2液晶模块

运动员

面包板

lcd

电路图

lcd

 

lcd

用于 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");

lcd

关于将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
完善资料,
赚取积分