显示器是任何机器的必要部分,无论是任何家用电器还是工业机器。显示屏不仅显示操作机器的控制选项,还显示该机器执行的任务的状态和输出。电子产品中使用的显示器类型很多,如 7 段显示器、16x2 LCD 显示器、TFT 触摸屏显示器、OLED 显示器等。
16x2 LCD显示器是最基本的显示模块,也用于一些小型电子设备,如计算器,数字仪表等。
在本教程中,我们将了解如何将16x2 LCD 与 Atmega16 AVR 微控制器连接并显示简单的欢迎消息。
所需组件
阿特梅加16
16x2液晶模块
运动员
面包板
威廉希尔官方网站 图
用于 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");
关于将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
}
全部0条评论
快来发表一下你的评论吧 !