C51单片机LCD1602驱动程序

发布者:天涯拾遗最新更新时间:2022-05-26 来源: eefocus关键字:C51  单片机  LCD1602  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

LCD1602简介

LCD1602字符型液晶(每行显示16个字符,一共可以显示两行)——一种专门用来显示字母、数字、符号的点阵型液晶模块。它由若干个5x7或者5x10的点阵字符组成,每个点阵字符位都可以用来显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片。


1602的引脚

我们只需要关注以下几个管脚:

3 脚:VL,液晶显示偏压信号,用于调整LCD1602 的显示对比度,一般会外接电位器用以调整偏压信号,注意此脚电压为0时可以得到最强的对比度。

4 脚:RS,数据/命令选择端,当此脚为高电平时,可以对1602 进行数据字节的传输操作,而为电平时,则是进行命令字节的传输操作。命令字节,即是用来对LCD1602 的一些工作方式作设置的字节;数据字节,即使用以在1602 上显示的字节。值得一提的是,LCD1602的数据是8 位的。

5 脚:R/W,读写选择端。当此脚为高电平可对LCD1602 进行读数据操作,反之进行写数据操作。

6 脚:E,使能信号,其实是LCD1602 的数据控制时钟信号,利用该信号的上升沿实现对LCD1602 的数据传输。

7~14 脚:8 位并行数据口,使得对LCD1602 的数据读写大为方便。

1602技术参数图

操作时序

由于我们不需要读1602,因此下面只看写操作:

① 当我们要写指令字时,设置LCD1602 的工作方式时:需要把RS置为低电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。

② 当我们要写入数据字,在1602 上实现显示时:需要把RS置为高电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E 引脚一个高脉冲将数据写入。

发现了么,写指令和写数据,差别仅仅在于RS的电平不一样而已。以下是LCD1602的时序图:


写操作时序

时序参数

当要写命令字节的时候,时间由左往右,RS 变为低电平,R/W 变为低电平,注意看是RS的状态先变化完成。然后这时,DB0~DB7 上数据进入有效阶段,接着E引脚有一个整脉冲的跳变,接着要维持时间最小值为tpw=400ns的E脉冲宽度。然后E引脚负跳变,RS电平变化,R/W 电平变化。这样便是一个完整的LCD1602写命令的时序。


LCD1602关键性指令操作

一、清屏指令

清除液晶显示器,即将DDRAM的内容全部填入“空白”的ASCII码20H;

光标归位,将光标撤回液晶显示屏的左上方;

将地址计数器(AC)的值设置为0;


二、进入模式设置指令

功能:设定每次定入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。参数设定的情况如下所示:

位名 ———— 设置;

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

S —— 0=写入新数据后显示屏不移动 ;1=写入新数据后显示屏整体右移1个字符;


三、显示开关控制指令

功能 : 控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下:

位名 ———— 设置

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

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

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


四、功能设定指令

功能 : 设定数据总线位数、显示的行数及字型。参数设定的情况如下:

位名 ———— 设置

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

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

F —— 0=5×7点阵/每字符 ; 1=5×10点阵/每字符;


五、RAM地址映射图

在设置完成之后我们就要明白具体是在哪显示,在哪个位置显示?在对液晶模块的初始化中要先设置其显示模式在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否还处于忙的状态。DDRAM就是显示数据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);//延时5ms

RS=0;// 命令

RW=0;// 写

E=1;// 使能LCD1602

DPORT=cmd;// 将命令码输出在数据端口上

delay10us();            // 短暂延时10us

E=0; // 关闭LCD1602使能,释放总线

}


写数据

// 向LCD1602液晶写入一字节数据,dat-待写入数据值 

// 写数据时序:RS=1,RW=0,D7——D0 = 数据,E=正脉冲,液晶在脉冲下降沿采样数据。

void lcd1602WriteByte(unsigned char dat)

{

delayNms(5);//延时5ms

RS=1;// 数据

RW=0;// 写

E=1;// 使能LCD1602

DPORT=dat;// 将待写数据送到数据端口

delay10us();            // 短暂延时10us

E=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); //5ms

lcd1602WriteCmd(0x38); 

//delayNms(5); 

//lcd1602WriteCmd(0x38); 

//delayNms(5); 

//lcd1602WriteCmd(0x38);

lcd1602WriteCmd(0x08);     // 显示关闭,不显示光标、光标不闪烁

lcd1602WriteCmd(0x01);     // 显示清屏

lcd1602WriteCmd(0x06);     // 显示光标移动位置

delayNms(5);//5ms

lcd1602WriteCmd(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~15

yPos&=0x01;      // y位置范围是0~1

if(yPos==0)         // 显示第一行

tmp=xPos;  // 第一行字符地址从 0x00 开始

else

tmp=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个字符外的数据丢弃

}

}

关键字:C51  单片机  LCD1602  驱动程序 引用地址:C51单片机LCD1602驱动程序

上一篇:C51入门小项目——双向路口交通信号灯
下一篇:C51单片机入门——按键篇

推荐阅读最新更新时间:2024-11-11 12:17

单片机流水线计数器设计
几年晚上一个网友找我做流水线计数器,于是想起了半年前我上传到百度文库的这个文档。呵呵,当年 潍坊学院第二届电子设计大赛 #include AT89X52.H #define uint unsigned int #define uchar unsigned char uchar code tabel ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};// 这个数组存放0~9 uint counter;//定义计数器,用来计量脉冲次数 sbit wei_ge=P1^0; //定义位选引脚 sbit wei_shi=P1^1; sbit wei_bai=P1^2
[单片机]
单片机通过ESP8266将温度数据上传到OneNET平台
本帖内容为82C52单片机通过wifi模块(ESP8266)将温度传感器(DS18B20)的温度数据通过HTTP协议上传到OneNET云平台。 所需的硬件设备: 单片机一块; ESP8266模块一个; DS18B20一个。 软件: 需要在OneNET平台注册一个账号,并建立相关产品设备。 如图所示: 部分代码如下: #include reg52.h #include intrins.h #define uint unsigned int #define uchar unsigned char sbit DQ=P2^4; sbit k1=P1^0; uchar aa = ; uint i,temp; void delay(
[单片机]
<font color='red'>单片机</font>通过ESP8266将温度数据上传到OneNET平台
单片机LED点阵的纵向移动
点阵的动画显示,说到底就是对多张图片分别进行取模,使用程序算法巧妙的切换图片,多张图片组合起来就成了一段动画了,我们所看到的动画片、游戏等等,它们的基本原理也都是这样的。 上一节我们学了如何在点阵上画一个❤形,有时候我们希望这些显示是动起来的,而不是静止的。对于点阵本身已经没有多少的知识点可以介绍了,主要就是编程算法来解决问题了。比如我们现在要让点阵显示一个 I ❤ U 的动画,首先我们要把这个图形用取模软件画出来看一下,如图7-10所示。 图7-10 上下移动横向取模 这张图片共有40行,每8行组成一张点阵图片,并且每向上移动一行就出现了一张新图片,一共组成了32张图片。 用一个变量 index 来代表每张图片的起始位置,每
[单片机]
<font color='red'>单片机</font>LED点阵的纵向移动
51单片机【三】静态与动态驱动数码管
数码管结构及分类 数码管是发光器件之一,内部由七个条形发光二极管(a,b,c,d,e,f,g)和一个小圆点发光二极管(dp)构成,51单片机开发板上为八段数码管,如下图所示,根据各段的组合不同,显示的字符也就不同。 按八个数码管的公共端接线不同,数码管又可分类为共阴极数码管和共阳极数码管两种。共阴极数码管的公共端接地,而共阳极数码管的公共端接电源,接线如下图所示(左为共阴极,右为共阳极)。当连接的单片机接口为高电平时共阴极数码管亮;反之,连接的接口为低电平时则共阳极数码管亮。 void DigDisplay(void) { unsigned char i = 0; // 首先确定位码,选中最左侧数码管,注意查3
[单片机]
51<font color='red'>单片机</font>【三】静态与动态驱动数码管
单片机中断函数的编写
interrupt m修饰符 C51中断函数必须通过该修饰符进行修饰。在C51程序设计中,当函数定义时用了interrupt m修饰符,系统编译时把对应函数转化为中断函数,自动加上程序头段和尾段,并按51系统中断的处理方式自动把它安排在程序存储器中的相应位置。 在该修饰符中,m的取值为0~31,对应的中断情况如下: 0——外部中断0 1——定时/计数器T0 2——外部中断1 3——定时/计数器T1 4——串行口中断 5——定时/计数器T2 其它值预留。 C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。 【例】编写一个用于统计外中断0的中
[单片机]
8051单片机教程第二课:单片机的内部、外部结构(一)
一、单片机的外部结构 拿到一块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为89C51的芯片,下面我们就看一下如何给它连线。1、电源:这当然是必不可少的了。单片机使用的是5V电源,其中正极接40引脚,负极(地)接20引脚。2、振蒎电路:单片机是一种时序电路,必须提供脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。只要买来晶振,电容,连上就可以了,按图1接上即可。3、复位引脚:按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。4、EA引脚:EA引脚接到正电源端。至此,一个单片机就接好,通上电,单片机就开始工作了。 我们的第一个任务是要用单片机点亮一只发光二极
[单片机]
8051<font color='red'>单片机</font>教程第二课:<font color='red'>单片机</font>的内部、外部结构(一)
51单片机入门教程(2)——实现流水灯
一、搭建流水灯电路 在Proteus中搭建流水灯电路如图 二、流水灯程序 我们可以把流水灯看作依次点亮若干个灯。 程序如下: #include reg52.h sbit led1 = P2^0; sbit led2 = P2^1; sbit led3 = P2^2; sbit led4 = P2^3; sbit led5 = P2^4; sbit led6 = P2^5; sbit led7 = P2^6; sbit led8 = P2^7; void main() { //点亮第一个灯 led1 = 1; led2 = 0; led3 = 0; led4 = 0; led5 = 0; l
[单片机]
51<font color='red'>单片机</font>入门教程(2)——实现流水灯
如何计算8051单片机的波特率
8051单片机使用定时器1工作在方式2的情况下作为串口波特率发生器,其波特率=(2smod/32)×(定时器T1溢出率),其中smod是PCON《7》,表示是否波特率加倍,Fsoc是系统的晶振大小。 波特率公式中:T1溢出率=溢出周期的倒数;溢出周期=(256-TH1)×12/Fosc; 最终公式: 波特率:Baud=(2smod× Fsoc)/(32 ×12×(256-TH1)) 我们一般不太关注波特率的计算,而是关心选用的传输速度(波特率)去反算定时器1(自动重装模式)的初值(TH1),所以将上面的公式导一下,得到TH1的公式: TH1=256-(Fsoc×2smod)/(12×32×Baud) 下面针对串口发送程序,
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved