首页

接口16X2 LCD与AVR单片机

本节将全面介绍AVR单片机(atmega16)与16X2 LCD的接口。Atmega16属于AVR微控制器家族。

16X2 LCD与AVR单片机接口电路图:

16X2 LCD与AVR单片机的接口

电路的解释:

  • 这和LCD接口的方式没有什么不同8051或PIC单片机。晶体振荡器将为微控制器提供时钟。连接到晶体上的电容器将充当滤波器,帮助晶体谐振并振荡到它的并联谐振模式。
  • 连接LCD引脚3和引脚2的电位器将有助于调整LCD的对比度。LCD的4、5、6引脚分别为Register select、Read/write和Enable引脚,分别连接到Atmega16的PD0、PD1和PD2引脚。LCD的数据引脚连接到Atmega16的33 ~ 40引脚。

编程ATMEGA16接口与16X2 LCD:

您可以从邮件中获得LCD的简要信息接口16×2来自8051单片机。正如我之前所说的,基本的编程都是一样的,除了使用微控制器的引脚和寄存器。

很重要的是如何将数据发送到液晶LCD和命令的发送,假设如果你是将数据发送到LCD,那么你必须使16×2液晶的启用销销低在发送数据之前,当你认为你想要的数据发送是准备让再次启用销高1的编码语言。如果您使使能引脚高,那么只有LCD将工作。

仅仅使使能引脚高将不起作用,你必须使寄存器选择引脚(RS引脚)也高,以便LCD将接受它是一个正常的数据,必须显示在LCD的屏幕上,如果你忘记让RS引脚高,它最终认为用户正在发送命令,并使它自己准备根据命令行动,如使光标移动,清除LCD上的数据,改变光标位置等。

最后但并非最不重要的另一个引脚,你需要担心读/写引脚,我们都知道,对于任何设备的基本功能开始读和写,读数据和写数据是任何外围设备或系统的主要和重要的功能。在这里,在LCD发送显示数据时,您必须使R/W引脚低,以便LCD将理解,数据应该写入LCD屏幕和相应的行动。

仅仅发送数据并显示它并不能完成任务;以可理解的方式排列数据是程序员的重要和关键任务。你可以安排液晶中的数据或使液晶工作根据你的愿望,可以通过发送命令或特殊功能液晶,你可能认为需要什么类型的命令为LCD工作,命令光标位置,增加或减少的对比,使光标改变行,如从第一行到第二行等。要发送一个命令到LCD,你需要使引脚高和低就像发送数据。为了发送命令,你需要使ENABLE PIN高,寄存器SELECT PIN (RS PIN)低,在程序员术语是0,读/写PIN (R/W PIN)高,你需要记住这个配置发送命令。

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

SNO
液晶显示器说明书
十六进制代码
1
如果您想在5x7矩阵的一行中显示内容
0 x30
2
如果你想在5x7矩阵的两行中显示内容
0 x38
3.
如果你用5x7矩阵在一行中显示4位数据
0 x20
4
如果你在5 × 7矩阵的两行中显示4位数据
0 x28
5
输入模式
0 x06
6
清除显示而不清除ram内容
(
7
使光标在上,也显示在上
0 x0e
8
使光标关闭,也显示关闭
0 x0c
9
光标闪烁时显示数据
0 x0f
10
将完整显示数据移到左侧
0 x18
11
将完整显示数据移至右侧
0 x1c
12
将光标移动到一个位置或剩下一个字符
0 x10
13
向右移动光标到一个位置或一个字符
0 x14
14
清除完整的显示,包括RAM数据
0 x01
15
在光标位置设置DDRAM地址
0 x80 +添加

如果我们想简单地谈谈在LCD中显示数据

  • E = 1;使能引脚应该高
  • RS = 1;寄存器选择应该是高的
  • R / W = 0;读/写引脚应该低。

用于发送命令到LCD

  • E = 1;使能引脚应该高
  • RS = 0;寄存器选择应该是低的
  • R / W = 1;读/写引脚应该高。

当你传递一个字符串,它最好使用一个字符串指针和增量指针,如果你增量一个指针,它会自动到变量的下一个地址,你可以存储你想要显示的字符。参见下面的示例。

Void write_string(unsigned char *str)//将字符串的地址存储在指针*str中

int i = 0;

而(strng[我]! = ' \ 0 ')//循环将继续到字符串中的NULL字符

lcd_write(string [i]);//在LCD上一个字节一个字节地发送数据
我+ +;
返回;

LCD与ATMEGA16接口代码:

LCD数据接口----接口B
信号端口,端口D
rs - PD0
rw (PD1
en - PD2
*/

#define LCD_DATA PORTB //LCD数据端口
#定义ctrl PORTD
#define en PD2 //启用信号
#define rw p1 //读写信号
#define rs PD0 //寄存器选择信号

void LCD_cmd(unsigned char cmd);
空白init_LCD(无效);
void LCD_write(unsigned char data);

int main ()

DDRB = 0 xff;//设置端口B
DDRD = 0 x07;//设置D端口
init_LCD ();//初始化LCD
_delay_ms (50);//延迟50毫秒
LCD_write_string(“hello world”);//在LCD上打印字符串
返回0;

空白init_LCD(空白)

LCD_cmd (0 x38);//在8位模式下初始化16X2 LCD
_delay_ms (1);
LCD_cmd (0 x01);/ /清除液晶
_delay_ms (1);
LCD_cmd (0 x0e);/ /光标
_delay_ms (1);
LCD_cmd (0 x80);// -8到第一行,-0是第0位
_delay_ms (1);
返回;

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);
返回;

LCD_write(无符号字符数据)

LCD_DATA =数据;
ctrl = (1 < < rs) | (0 < < rw) | (1 < < en);
_delay_ms (1);
ctrl = (1 < < rs) | (0 < < rw) | (0 < < en);
_delay_ms (50);
返回;

void LCD_write_string(unsigned char *str) //将字符串的地址值存储在指针*str中

int i = 0;
while(str[i]!= ' \0 ') //循环将持续到字符串中的NULL字符

[我]LCD_write (str);//在LCD上一个字节一个字节地发送数据
我+ +;

返回;

3反应

  1. 和代码…

    # include
    # include

    #定义F_CPU 1000000 ul

    #define LCD_DATA PORTD //数据端口
    #define ctrl PORTC //控制端口
    #define en PC3 //启用端口和引脚
    #define rw PC2 //读/写端口和引脚
    #define rs PC1 //寄存器选择端口和引脚

    void LCD_cmd(unsigned char cmd);
    空白init_LCD(无效);
    void LCD_write(unsigned char data);
    空白LCD_write_string (char * str);

    int main ()

    DDRD = 0 xff;//设置D端口的输出
    DDRC = 0 b00001110;//设置C端口的输出

    init_LCD ();//初始化LCD
    _delay_ms (100);//延迟50毫秒
    LCD_write_string(“111年Andrej ! !”);//在LCD上打印字符串

    而(1)


    返回0;

    空白init_LCD(空白)

    LCD_cmd (0 x01);/ /清除液晶
    _delay_ms (1);
    LCD_cmd (0 x38);//在8位模式下初始化16X2 LCD
    _delay_ms (1);
    LCD_cmd (0 x0e);/ /光标
    _delay_ms (1);
    LCD_cmd (0 x80);// -8到第一行,-0是第0位
    _delay_ms (1);
    返回;

    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);
    返回;

    LCD_write(无符号字符数据)

    LCD_DATA =数据;
    ctrl = (1 < < rs) | (0 < < rw) | (1 < < en);
    _delay_ms (1);
    ctrl = (1 < < rs) | (0 < < rw) | (0 < < en);
    _delay_ms (50);
    返回;

    空白LCD_write_string (char * str)

    int i = 0;
    while(str[i]!= ") //循环将一直进行到字符串中的NULL字符

    [我]LCD_write (str);//在LCD上一个字节一个字节地发送数据
    我+ +;

    返回;

留下一个回复

您的电子邮件地址将不会被公布。必填字段已标记

Electronicshub图标
<\/i>","library":""}}" data-widget_type="nav-menu.default">
Baidu