当前位置: 首页 > article >正文

单片机——LCD1602

1.基础知识介绍
1.1、为什么叫1602
因为可以显示两行,一行16个
1.2、LCD1602管脚认识
在这里插入图片描述

编号符号引脚说明
1VSS电源地
2VDD电源正极
3VEE液晶显示偏压信号
4RS数据/命令选择(H/L)
5R/W读/写选择(H/L)
6E使能端
7D0数据
8D1数据
9D2数据
10D3数据
11D4数据
12D5数据
13D6数据
14D7数据

1.3、LCD1602关键性指令设置
1.3.1、清屏指令

管脚对应二进制
RS0
R/W0
DB70
DB60
DB50
DB40
DB30
DB20
DB10
DB01

功能:

<1> 清除液晶显示器,即将 DDRAM 的内容全部填入"空白"的 ASCII
码 20H;
<2> 光标归位,即将光标撤回液晶显示屏的左上方;
<3> 将地址计数器(AC)的值设为 0。

1.3.2、模式选择指令

管脚对应二进制
RS0
R/W0
DB70
DB60
DB50
DB40
DB30
DB21
DB1I/D
DB0S

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

位名设置
I/D0=写入新数据后光标左移
I/D1=写入新数据后光标右移
S0=写入新数据后显示屏不移动
S1=写入新数据后显示屏整体右移 1 个字符

1.3.3、显示开关控制指令

管脚对应二进制
RS0
R/W0
DB70
DB60
DB50
DB40
DB31
DB2D
DB1C
DB0B

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

位名设置
D0=显示功能关
D1=显示功能开
C0=无光标
C1=有光标
B0=光标闪烁
B1=光标不闪烁

设置完成之后,要判断液晶模块是否处于忙状态。

1.3.4功能设置指令

管脚对应二进制
RS0
R/W0
DB70
DB60
DB51
DB4DL
DB3N
DB2F
DB1X
DB0X

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

位名设置
DL0=数据总线为 4 位
DL1=数据总线为 8 位
N0=显示 1 行
N1=显示 2 行
F0=5×7 点阵/每字符
F1=5×10 点阵/每字符

0x38:00111000,就是数据总线8位,显示两行,以5×7 点阵/每字符 进行显示。

2、程序解释
2.1、宏定义
头文件,宏定义,根据连接定义端口
在这里插入图片描述

#include <reg52.h>
#include <intrins.h>//定义端口
sbit duan=P2^6;
sbit wei=P2^7;sbit RS=P1^0;
sbit RW=P1^1;
sbit E=P2^5;#define uchar unsigned char
#define uint unsigned int
#define Data P0 //	  数据接在P0#define	  RS_commad	 RS=0 	//命令
#define	  RS_data	 RS=1 	//数据
#define	  RS_write	 RW=0	//写
#define	  RS_read	 RW=1	//读
#define	  E_close	 E=0	//使能关
#define	  E_open	 E=1	//使能开	

2.2 、延时部分(具体解释见之前的博客)

void delay(uint k)
{uint i,j;for(i=0;i<k;i++){for(j=0;j<113;j++){;}}}

2.3、数码管关闭程序
在1602程序中需要调用数码管的程序,是因为其中的cmg函数用于关闭数码管,在LCD控制时需要先关闭数码管,避免两者的干扰。

void cmg ()
{
duan=1;
wei=1;
P0=0x00;
duan=0;
wei=0;	  
}

2.4、写命令
2.4.1、程序里面用到了延时,原因是在写命令时,需要给液晶一定的响应时间。如果没有延时,液晶可能无法正确地接收到指令,从而无法正常显示。一般情况下,液晶的响应时间为几微秒至几毫秒不等,具体时间取决于液晶型号和工作状态。这里的5毫秒延时是为了确保液晶能够正确地接收到指令。
2.4.2、nop
nop(); 是汇编指令,表示“空操作(no operation)”,也就是不执行任何操作,只是占用一个CPU周期。在这个代码中,可能是为了等待指令执行完毕,延长执行时间,确保程序的正确性。

void writecom (uchar command)
{delay(10)RS_command;	 RW_write;E_open;Data=data;_nop_();E_close; 	 
}

2.5、写数据
与上面写命令逻辑是相同的

void writedata (uchar da)
{delay(10);RS_data;	 RW_write;E_open;Data=da;_nop_();E_close;}

2.6、写字符
先进行写命令,让它写在哪一行,之后写入数据。x,y代表横纵坐标

void writechar(uchar x,uchar y,uchar c)
{if (y==0){writecom(0x80+x);//10000000,写在第一行}else{writecom(0xc0+x);}writedata(c);}

2.7、写字符串
与写字符的区别在于,字符串是很多构成的所以说要进行循环,不断写,直到写完,跳出循环。

void writestring(uchar x,uchar y,uchar *s)
{if (y==0){writecom(0x80+x);//10000000,写在第一行}else{writecom(0xc0+x);}while(*s){writedata(*s);s++;}}

2.8、初始化
主要参照我上面列出的表格,确定LCD的显示模式,例如设置光标,以及光标移不移动,等等。
设置显示模式需要发送三次指令0x38,每次发送可以确保指令被正确接收。0x38表示设置显示模式为8位数据总线,2行显示,5x7点阵字符,这是一种常用的基本显示模式。

void Init()
{cmg();delay(10);writecom(0x38);  //设置显示模式writecom(0x38);writecom(0x38);writecom(0x0e);	//显示开关控制,显示功能开,有光标,	光标不闪烁writecom(0x06);   // 写入数据光标右移,显示屏不移动writecom(0x01);  //清屏}

2.9、主函数
进行初始化,调用写字符和字符串进行写入显示

void main()
{
Init();
while(1)
{writechar(1,0,'d');	//第一行1位置上写字符dwritechar(2,0,'a');	// 第一行位2置上写字符awritestring(3,0,"npianji");writestring(1,1,"tainanle");}}

3、完整代码

#include <reg52.h>
#include <intrins.h>//定义端口
sbit duan=P2^6;
sbit wei=P2^7;sbit RS=P1^0;
sbit RW=P1^1;
sbit E=P2^5;#define uchar unsigned char
#define uint unsigned int
#define Data P0 //	  数据接在P0#define	  RS_command	 RS=0 	//命令
#define	  RS_data	 RS=1 	//数据
#define	  RW_write	 RW=0	//写
#define	  RW_read	 RW=1	//读
#define	  E_close	 E=0	//使能关
#define	  E_open	 E=1	//使能开	//延时部分
void delay(uint k)
{uint i,j;for(i=0;i<k;i++){for(j=0;j<113;j++){;}}}//数码管部分,注意是关数码管
void cmg ()
{
duan=1;		  //段开启
wei=1;
P0=0x00;
duan=0;
wei=0;	  
}//写命令
void writecom (uchar command)
{delay(10);RS_command;	 RW_write;E_open;Data=command;_nop_();E_close;	 
}//写数据
void writedata (uchar da)
{delay(10);RS_data;	 RW_write;E_open;Data=da;_nop_();E_close;}//写字符  (确定坐标)
void writechar(uchar x,uchar y,uchar c)
{if (y==0){writecom(0x80+x);//10000000,写在第一行}else{writecom(0xc0+x);}writedata(c);}//写字符串
void writestring(uchar x,uchar y,uchar *s)
{if (y==0){writecom(0x80 + x);//10000000,写在第一行}else{writecom(0xc0+x);}while(*s){writedata(*s);s ++;}}//初始化
void Init()
{cmg();delay(15);writecom(0x38);  //设置显示模式writecom(0x38);writecom(0x38);writecom(0x0e);	//显示开关控制,显示功能开,有光标,	光标不闪烁writecom(0x06);   // 写入数据光标右移,显示屏不移动writecom(0x01);  //清屏}//主函数
void main()
{
Init();
while(1)
{writestring(1,0,"danpianji");writestring(1,1,"tainanle");}}

4、运行结果
猜猜运行结果是什么
在这里插入图片描述

http://www.lryc.cn/news/2420920.html

相关文章:

  • 移动测试之-流量测试方案
  • Visual Studio 2008 试用版评估期已结束的解决方法
  • 一步步优化JVM七:其他
  • 无法启动计算机上的服务msdtc,MSDTC服务无法启动解决方法
  • 分享116个ASP搜索链接源码,总有一款适合您
  • Hello C++
  • 纳什均衡定义、举例、分类
  • 开启游戏别样体验:《下一站江湖2》风灵月影六十项修改器使用手册
  • ubuntu9.10 软件推荐
  • Oracle DB Time 解读
  • 收集一些有质感、有内涵的网站 (转载)
  • 实时监控系统介绍
  • MapInfo是一种流行的地理信息系统(GIS)软件,它提供了丰富的功能和工具,用于处理、分析和可视化地理空间数据
  • CAN总线学习笔记 | CAN基础知识介绍
  • 2024年最全在线查询默认密码网站--分享_hawel-lutuo默认密码(1),分析网络安全未来几年的发展前景
  • java计算机毕业设计电商网站在线客服(附源码+springboot+开题+论文+部署)
  • 递归和迭代_深究递归和迭代的区别、优缺点及实例对比
  • 网络层 IPV4报文格式
  • 中国网站广告联盟大集合
  • 5.秒杀模块-基于redis缓存商品秒杀信息
  • ‘真三国无双5’完美存档修改
  • 图像对抗生成网络 GAN学习01:从头搭建最简单的GAN网络,利用神经网络生成手写体数字数据(tensorflow)
  • gitgitlab 修改本地分支名称和远程分支名称
  • 初探Spark-使用大数据分析2000W行数据
  • 博客屋网址导航自适应主题php源码
  • 驱动python_光驱驱动下载_万能光驱驱动(万能DVD光驱CD光驱驱动) 2018 官方版_极速下载站...
  • MFC框架机制详解
  • 【C语言经典例题100解答】
  • web自动化测试_web自动化测试工具和框架有哪些?
  • 基于深度学习的车牌识别项目的APP部分之图像预处理(一):C语言读取bmp图像信息