首页 > 编程知识 正文

单片机1602显示程序(C51单片机LCD1602驱动程序)

时间:2023-05-05 07:24:53 阅读:122654 作者:3836

C51单片机LCD1602驱动器LCD1602概要1602的读取动作时序写入动作时序参数LCD1602重要命令操作1、清除画面命令2、模式设定命令3、显示开关控制命令4、功能设定命令5、RAM地址映射LCD 116

本文总结了学习我国科技单片机开发板HC68000-EM3 V2.2后的笔记;

液晶屏1602介绍

用于显示LCD1602字符型液晶(每行显示16个字符,共可显示两行) ——个字符、数字和符号的专用点阵型液晶模块。 它由几个5x7或5x10的点阵字符组成。 每个点阵字符的位可以用于显示字符。 每个位之间有点间距,每行之间也有间距,起到字符间距和行距的作用。 因此,不能很好地显示图像。

1602个管脚

请注意下一个别针。

(足) VL,液晶显示偏置信号用于调节LCD1602的显示对比度,通常外加音量来调节偏置信号,并且注意此脚电压为0时可以获得最强的对比度。4 脚:RS,数据/命令选择端,当此脚为高电平时,可以对1602 进行数据字节的传输操作,而为电平时,则是进行命令字节的传输操作命令字节是用于设置LCD1602的一些行为的字节。 数据字节,即使是用于在1602中显示的字节。 顺便说一下,LCD1602的数据是8位。 http://www.Sina.com/3358 www.Sina.com/http://www.Sina.com /便于在LCD1602上读写数据。

操作时机

因为我们不需要读1602,所以以下只看写操作:

我们设为5 脚:R/W,读写选择端。当此脚为高电平可对LCD1602 进行读数据操作,反之进行写数据操作,设定LCD1602的动作方式时:需要6 脚:E,使能信号,其实是LCD1602 的数据控制时钟信号,利用该信号的上升沿实现对LCD1602 的数据传输。

如果我们要求7~14 脚:8 位并行数据口,在1602实现显示:需要写指令字时

注意到了吗,写命令和写数据只是RS的水平不同。 LCD1602的时序图如下所示。

写入定时

时间序列参数

尝试写命令字节时,时间从左到右,RS为低电平,R/W为低电平。 请注意RS的状态先变化后完成。 此时,DB0~DB7上的数据进入有效阶段,接着e端子有全脉冲的跳跃,接着维持时间最小值为tpw=400ns的e脉冲宽度。 然后,e端子跳负,RS电平变化,R/W电平变化。 这是完整的LCD1602刻录命令的定时。

LCD1602键指令操作一、清除指令

清除液晶显示器,将DDRAM内容全部记入"空白"的ASCII代码20H的光标复原,将光标缩回到液晶显示器的左上; 将地址计数器(AC )的值设定为0; 二.进入模式设定指令

功能:每次输入1位数据时设定光标的移位方向,另外,设定每次写入时是否移动1个字符。 参数设定时如下所示:

名称————设置;

I/D —— 0=写入新数据后,光标向左移动; 1=写入新数据后,光标向右移动;

S —— 0=写入新数据后,显示器不动; 1=写入新数据后,整个显示器向右移动一个字符

三.显示开关控制指令

功能:控制显示器的打开/关闭、光标的显示/关闭以及光标是否闪烁。 参数设定时为:

位名称————设置

D —— 0=显示功能关闭; 1=显示功能打开

C —— 0=无光标; 1=有光标

B —— 0=光标闪烁; 1=光标不闪烁;

四.功能设定命令

功能:设定数据总线的位数、显示的行数、字体。 参数设定时为:

位名称————设置

DL —— 0=数据总线为4位; 1=数据总线为8位

N —— 0=行显示; 1=显示两行;

F —— 0=57点/每1个字符; 1=510点/每1个字符;

五、RAM地址图设置完成后,要具体显示在哪里、显示在哪里。 在液晶模块的初始化中,首先设定其显示模式。 液晶模块上显示文字时,光标自动向右移动,无需手动操作。 每次输入命令时,判断液晶模块是否还忙。 dRAM是显示数据的ram,用于登记要显示的字符编码。 共计80字节,地址和画面的对应关系如下表所示。

要显示文字,首先输入要显示文字的地址。 也就是说,它告诉你在模块中显示字符的位置。 例如,如果第二行中第一个字符的地址为40H,则光标的位置取决于是否直接写入40H。 第二行第一个字符的位置是? 不是这样的

行,因为写入显示地址时要求最高位D7恒定为高电平1,所以实际写入的数据应该是:
0100000OB (40H)+10000000B(80H)=11000000B(C0H)。
在1602中我们就用前16个就行了。第二行也一样用前16个地址。对应如下:

LCD1602驱动代码 写命令 // 向LCD1602液晶写入一字节命令,cmd-待写入命令值 // 写命令时序:RS=0,RW=0,D7——D0 = 数据,E=正脉冲,液晶在脉冲下降沿采样数据。void lcd1602WriteCmd(unsigned char cmd){delayNms(5);//延时5msRS=0;// 命令RW=0;// 写E=1;// 使能LCD1602DPORT=cmd;// 将命令码输出在数据端口上delay10us(); // 短暂延时10usE=0; // 关闭LCD1602使能,释放总线} 写数据 // 向LCD1602液晶写入一字节数据,dat-待写入数据值 // 写数据时序:RS=1,RW=0,D7——D0 = 数据,E=正脉冲,液晶在脉冲下降沿采样数据。void lcd1602WriteByte(unsigned char dat){delayNms(5);//延时5msRS=1;// 数据RW=0;// 写E=1;// 使能LCD1602DPORT=dat;// 将待写数据送到数据端口delay10us(); // 短暂延时10usE=0; // 关闭LCD1602使能,释放总线 } 清屏指令 // 清屏命令:清除显示内容,将1602内部RAM全部填入空白的ASCII码20H// 光标归位,将光标撤回到屏幕左上角的坐标原点// 将1602内部显示地址设为0 void lcd1602Clear() {lcd1602WriteCmd(0x01);delayNms(50);//50ms} 设置光标 void lcd1602SetCursor(unsigned char Para) // 设置光标{switch(Para){case 0:{lcd1602WriteCmd(0x08);break; // 关显示}case 1:{lcd1602WriteCmd(0x0c);break; // 开显示但无光标}case 2:{lcd1602WriteCmd(0x0e);break; // 开显示有光标但不闪烁}case 3:{lcd1602WriteCmd(0x0f);break; // 开显示有光标且闪烁}default:break;}} 初始化 // LCD 1602初始化void lcd1602Init() {lcd1602WriteCmd(0x38); /*显示模式设置*/ delayNms(5); //5mslcd1602WriteCmd(0x38); //delayNms(5); //lcd1602WriteCmd(0x38); //delayNms(5); //lcd1602WriteCmd(0x38); lcd1602WriteCmd(0x08); // 显示关闭,不显示光标、光标不闪烁lcd1602WriteCmd(0x01); // 显示清屏lcd1602WriteCmd(0x06); // 显示光标移动位置delayNms(5);//5mslcd1602WriteCmd(0x0c); // 显示开及光标设置lcd1602Clear();} 函数封装

操作步骤:
1. 初始化
2. 写命令(RS=L) 设置显示坐标
3. 写数据(RS=H)

lcd1602.h文件

声明:请根据晶振自行编写延时函数

#include "delay.h" //请根据晶振自行编写延时函数sbitRS=P1^0; // 根据实际硬件连接修改sbitRW=P1^1; // 根据实际硬件连接修改sbitE=P1^2; // 根据实际硬件连接修改#define DPORTP0 // 根据实际硬件连接修改void lcd1602Init(); // 初始化void lcd1602Clear(); // 清屏命令void lcd1602SetCursor(unsigned char Para);//设置光标void lcd1602WriteChar(unsigned char xPos,unsigned char yPos,unsigned char Dat); // 写1个字符void lcd1602WriteString(unsigned char xPos,unsigned char yPos,unsigned char *s); // 写字符串 lcd1602.c文件 #include "lcd1602.h"void lcd1602WriteByte(unsigned char dat){}//写数据void lcd1602WriteCmd(unsigned char cmd){}//写命令void lcd1602Clear(){}//清屏void lcd1602SetCursor(unsigned char Para){} // 设置光标void lcd1602Init(){}//初始化// 内部函数用于设置显示字符起始坐标void lcd1602WritePos(unsigned char xPos,unsigned char yPos) {unsigned char tmp;xPos&=0x0f; // x位置范围是0~15yPos&=0x01; // y位置范围是0~1if(yPos==0) // 显示第一行tmp=xPos; // 第一行字符地址从 0x00 开始elsetmp=xPos+0x40; // 第二行字符地址从 0x40 开始tmp|=0x80; // 设置 RAM 地址lcd1602WriteCmd(tmp);}//在指定的行与列显示指定的字符,xpos:行,ypos:列,c:待显示字符void lcd1602WriteChar(unsigned char xPos,unsigned char yPos,unsigned char Dat){lcd1602WritePos(xPos,yPos);lcd1602WriteByte(Dat);}// 在液晶上显示字符串,xpos:行坐标,ypos:列坐标,str-字符串指针void lcd1602WriteString(unsigned char xPos,unsigned char yPos,unsigned char *s){unsigned char i=0;lcd1602WritePos(xPos,yPos); // 起始坐标while(s[i]){lcd1602WriteByte(s[i]);i++;if (i>=16) break; // 超出16个字符外的数据丢弃}}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。