51单片机快速入门之 LCD1602 液晶显示屏2024/10/19

51单片机快速入门之 LCD1602 液晶显示屏

Proteus 电路图 :

74HC595 拓展电路可以不用,给 p0-p17 添加上拉电阻也可以!,我这里是方便读取和节省电阻线路

(因为之前不知道 在没有明确循环的情况下,Keil编译器可能会在main()中自动添加类似以下的汇编代码:jump main ; 跳转到main函数的开始处) 所以显示效果就成了 输入   删除   输入  删除

期间各种排查,所以后面的电路图有所更改 

指令集 :

代码实现: 

#include <STC89C5xRC.H>
//定义接口
#define sbp P1
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;void delay(unsigned int t)  ;//声明
void LCD1602(unsigned char RSA,unsigned char RWA,unsigned char date) ;//声明
void LCD1602RED(unsigned char RSB,unsigned char RWB);  //声明void main()
{LCD1602(0,0,0x01);//清屏指令LCD1602(0,0,0x0e);//打开显示 光标不闪烁LCD1602(0,0,0x30);//设置8位使用LCD1602(1,0,0x30);//写入0  while(1); //防止keil 添加的自动跳回起点导致无限循环执行main函数}void LCD1602(unsigned char RSA,unsigned char RWA,unsigned char date)    //1602写入操作{RS=RSA;        //传递寄存器选择RW=RWA;        //传递读写选择E=1;          //允许读取    1602sbp=date;delay(200);E=0;          //拉低使能控制 下降沿允许写入!      1602}
void LCD1602RED(unsigned char RSB,unsigned char RWB)     //读取操作
{unsigned char reddat;//声明一个中间变量E=1;//允许读取reddat=P0;//获取 P0端口信息}void delay(unsigned int t)      //简单延迟函数
{while(t--);}

在Keil等嵌入式开发环境中,如果你没有在main函数中明确地包含一个无限循环(如while(1)),编译器可能会自动在main函数的末尾添加代码,以确保程序不会意外退出。

这种自动添加的代码通常是一个跳转指令,它会跳回到main函数的开始处,从而形成一个隐式的无限循环。这样做是为了确保单片机程序能够持续运行,因为单片机通常不需要像桌面应用程序那样有一个明确的退出过程。相反,它们需要不断地执行其预定的任务,直到被外部事件(如复位按钮)终止。

效果展示:

显示16个字符代码:

#include <STC89C5xRC.H>
//定义接口
#define sbp P1
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;void delay(unsigned int t)  ;//声明
void LCD1602(unsigned char RSA,unsigned char RWA,unsigned char date) ;//声明
void LCD1602RED(unsigned char RSB,unsigned char RWB);  //声明void main()
{unsigned char y;   //声明一个变量LCD1602(0,0,0x01);//清屏指令LCD1602(0,0,0x0e);//打开显示 光标不闪烁LCD1602(0,0,0x30);//设置8位使用for(y=0;y<16;y++){												LCD1602(1,0,0x30);//写入0  }while(1);}void LCD1602(unsigned char RSA,unsigned char RWA,unsigned char date)    //1602写入操作{RS=RSA;        //传递寄存器选择RW=RWA;        //传递读写选择E=1;          //允许读取    1602sbp=date;delay(200);E=0;          //拉低使能控制 下降沿允许写入!      1602}
void LCD1602RED(unsigned char RSB,unsigned char RWB)     //读取操作
{unsigned char reddat;//声明一个中间变量E=1;//允许读取reddat=P0;//获取 P0端口信息}void delay(unsigned int t)      //简单延迟函数
{while(t--);}

显示效果:

 显示中文:

        因为1602中一般不会储存中文字库,所以我们得自己建立.

首先我们知道其有两种点阵模式 也就是说 2行16列 (16字符) 还可以向下细分为 5x7点阵/字符 或者 5x10 点阵/字符 这意味着每个字符占据5列宽和7行高的空间 

首先我们用操作单个字符 以王字为例(这里要用到1602的CGRAM:自定义字符)

1602液晶模块中的CGRAM(Character Generator RAM)是用户可以自定义的字符图形存储区。它允许用户创建和存储自定义的字符图案,从而在液晶屏幕上显示独特的字符或图形。
CGRAM的基本概念
  1. 存储容量:CGRAM通常有8个字节的存储空间,每个字节可以存储一个自定义字符的点阵图案。
  2. 地址范围:CGRAM的地址范围通常是0x40到0x47,对应于8个自定义字符的存储位置。

 

由上图结合数据手册和下方点位图可知 :

列为 4 3 2 1 0

行为(注意该图只是第一个字符00H 的  | 第二个字符01H 的第一行 0x48 )

 数据手册中明确指出我们可自定义 8 个 字符  00H-07H 或者 08H-0FH (00H==08H)

所以我们想要显示王这个字应该如下

              4  3  2   1 0

0x40 行 1   1  1  1  1

0x41 行 0   0  1 0  0

0x42 行 0   0  1 0  0

0x43 行 1   1  1  1  1

0x44 行 0   0  1 0  0

0x45 行 0   0  1 0  0

0x46 行 1   1  1  1  1

0x47 行  有光标时:   光标会占用这一行!

代码如下 :

可以用循环简化,为了更直观,便于理解这里没有用循环! 

#include <STC89C5xRC.H>
//定义接口
#define sbp P1
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;void delay(unsigned int t)  ;//声明
void LCD1602(unsigned char RSA,unsigned char RWA,unsigned char date) ;//声明
void LCD1602RED(unsigned char RSB,unsigned char RWB);  //声明void main()
{unsigned char y;   //声明一个变量LCD1602(0,0,0x01);//清屏指令LCD1602(0,0,0x0e);//打开显示 光标不闪烁LCD1602(0,0,0x30);//设置8位使用LCD1602(0,0,0x40);//选中 自定义字符 00H 第一行LCD1602(1,0,0x1f);//存入第一行数据     0001 1111LCD1602(0,0,0x41);//选中 自定义字符 00H 第二行LCD1602(1,0,0x04);//存入第二行数据     0000 0100LCD1602(0,0,0x42);//选中 自定义字符 00H 第三行LCD1602(1,0,0x04);//存入第三行数据     0000 0100LCD1602(0,0,0x43);//选中 自定义字符 00H 第四行LCD1602(1,0,0x1f);//存入第四行数据     0001 1111LCD1602(0,0,0x44);//选中 自定义字符 00H 第五行LCD1602(1,0,0x04);//存入第五行数据     0000 0100LCD1602(0,0,0x45);//选中 自定义字符 00H 第六行LCD1602(1,0,0x04);//存入第六行数据     0000 0100LCD1602(0,0,0x46);//选中 自定义字符 00H 第七行LCD1602(1,0,0x1f);//存入第七行数据     0001 1111LCD1602(0,0,0x80);  //设置显示在那个字符 DDRAM 一行显示时范围为  00H-4FHLCD1602(1,0,0x00);    //显示自定义字符!while(1);}void LCD1602(unsigned char RSA,unsigned char RWA,unsigned char date)    //1602写入操作{RS=RSA;        //传递寄存器选择RW=RWA;        //传递读写选择E=1;          //允许读取    1602sbp=date;delay(200);E=0;          //拉低使能控制 下降沿允许写入!      1602}
void LCD1602RED(unsigned char RSB,unsigned char RWB)     //读取操作
{unsigned char reddat;//声明一个中间变量E=1;//允许读取reddat=P0;//获取 P0端口信息}void delay(unsigned int t)      //简单延迟函数
{while(t--);}
显示效果:

1602的忙碌状态 :

可以称呼其为  锁 

但是需要硬件支持,也就是说 得 8个io 对应单片机 8个引脚 直接链接

其原理为(读取模式下,判断最高位否为0)

首先设置  单片机 所有 io为 高电平 ,初始化!

P1=1;

然后进入读取操作

RS=0;

RW=1; //选择读!

E=0;

delay(100);

E=1; //读取状态

此时 如果 其忙,不能接受数据   p1.7-p1.0顺序  当p1.7 为 还是为高电平 1

  表示1602 很忙 不干其他活  不接受任何外部指令和数据!

当p1.7为 0时 表示其不忙       无论是读还是写都可以!

懒人必备之字符串输出:

原理:

void LCDDD(unsigned char *strr) 是一个函数,它接受一个指向无符号字符的指针 strr 作为参数。这个函数的作用是在LCD1602显示屏上显示一个字符串。

  1. while(*strr) 是一个循环,它会一直执行直到指针 strr 所指向的字符为空字符('\0')通常是C语言字符串的结束标志。

  2. strr++; 将指针 strr 向前移动一个字符,指向下一个字符。可以理解为“往右移动”,因为它意味着指针从当前位置向字符串或数组的尾部方向移动。

这里要说一下 DDRAM 

1602的DDRAM(Display Data RAM)是显示数据随机存储器的简称,常应用于LCD1602等字符设备中。DDRAM是一个80字节的RAM,能够最多存储80个8位字符代码作为显示数据,对应于显示屏上的各个位置。在LCD1602中,第一行的地址为00H到27H,第二行为40H到67H。 

 比方说我们要在00H显示  这里先设置

RS=0 RW=0 E=1   发送设置     延时   E=0

00H 0000 0000 但是这里设置DDRAM最高位固定是一

所以 是 1000 0000  0x80 为第一行第一个字符

同理第二行第一个是 40 0100 0000 因固定位  所以 是1100 0000 0xc0

代码实现:

#include <STC89C5xRC.H>
//定义接口
#define sbp P1
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;void delay(unsigned int t)  ;//声明
void LCD1602(unsigned char RSA,unsigned char RWA,unsigned char date) ;//声明
void LCD1602RED(unsigned char RSB,unsigned char RWB);  //声明
unsigned char y=0;   //声明一个变量void LCDDD(unsigned char *strr);   //声明
void main()
{LCD1602(0,0,0x01);//清屏指令LCD1602(0,0,0x0e);//打开显示 光标不闪烁LCD1602(0,0,0x38);//设置8位使用   这里要为设置显示为2行LCDDD("abcdefghigklmn0123456789");while(1);}void LCDDD(unsigned char *strr)
{while(*strr) {LCD1602(1,0,*strr);  //写入当前位置字符strr++;                              //往右移动y++;                                       //字符检测当字符超出时执行换行if(y==16) {LCD1602(0,0,0xC0) ;//切换到第二行}}}void LCD1602(unsigned char RSA,unsigned char RWA,unsigned char date)    //1602写入操作{RS=RSA;        //传递寄存器选择RW=RWA;        //传递读写选择E=1;          //允许读取    1602sbp=date;delay(200);E=0;          //拉低使能控制 下降沿允许写入!      1602}void delay(unsigned int t)      //简单延迟函数
{while(t--);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/452067.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT Plus 升级全攻略

ChatGPT Plus 升级全攻略 最近有很多人想知道如何顺利升级到 ChatGPT Plus。这里有详细步骤,确保你不会错过任何环节。 第一步:登录 OpenAI 首先,你需要去 chat.openai.com。 然后,点击“登录”,输入你的邮箱和密码。 接下来,确保你输入的信息是正确的。 第二步:点击“升级…

HttpURLConnection构造请求体传文件

HttpURLConnection构造请求体传文件 在Java中&#xff0c;使用HttpURLConnection构造请求体传输文件&#xff0c;你需要做以下几步&#xff1a; 1、创建URL对象指向你想要请求的资源。 2、通过URL打开连接&#xff0c;转换为HttpURLConnection实例。 3、设置请求方法为POST。 …

软件测试工程师:如何写出好的测试用例?

软件测试用例(Test Case)是软件测试过程中的一种详细文档或描述&#xff0c;用于描述在特定条件下&#xff0c;对软件系统或组件进行测试的步骤、输入数据、预期输出和预期行为。编写高质量的测试用例是确保软件质量的关键步骤之一。以下是一些编写优秀测试用例的建议&#xff…

StarRocks产品简介

StarRocks概念 StarRocks 是新一代极速全场景 MPP (Massively Parallel Processing) 数据库。StarRocks 的愿景是能够让用户的数据分析变得更加简单和敏捷。用户无需经过复杂的预处理&#xff0c;就可以用 StarRocks 来支持多种数据分析场景的极速分析。 StarRocks架构 Star…

使用Arcgis批量自动出图

操作方法如下&#xff1a; 1 2 3 4 5 6 7 设置好选项&#xff0c;开始打印。 8 生成pdf。 第一步&#xff1a;shp放到数据库中&#xff0c;标注转注记&#xff0c;然后编辑注记&#xff0c;符号样式设置好。准备出图&#xff1a;&#xff08;转注记时候尽量压盖监测等选最…

MXO44-2410数字示波器

MXO44-2410数字示波器 R&SMXO 4 系列是新一代示波器的首款产品&#xff0c;在性能和价值方面均表现出色。这些仪器提供十年一遇的工程突破&#xff0c;以加速洞察。 它们具有世界上最快的 450 万波形/秒的实时更新速率&#xff0c;这意味着工程师可以看到比任何其他仪器更…

李宏毅机器学习2022-HW7-BERT-Question Answering

文章目录 TaskBaselineMediumStrongBoss Code Link Task HW7的任务是通过BERT完成Question Answering。 数据预处理流程梳理 数据解压后包含3个json文件&#xff1a;hw7_train.json, hw7_dev.json, hw7_test.json。 DRCD: 台達閱讀理解資料集 Delta Reading Comprehension …

react 中的hooks中的useState

(1). State Hook让函数组件也可以有state状态, 并进行状态数据的读写操作 (2). 语法: const [xxx, setXxx] React.useState(initValue) (3). useState()说明:参数: 第一次初始化指定的值在内部作缓存返回值: 包含2个元素的数组, 第1个为内部当前状态值, 第2个为更新状态值的…

jmeter用csv data set config做参数化1

在jmeter中&#xff0c;csv data set config的作用非常强大&#xff0c;用它来做批量测试和参数化非常好用。 csv data set config的常用配置项如下&#xff1a; Variable Names处&#xff0c;写上源文件中的参数名&#xff0c;用于后续接口发送请求时引用 Ignore first line…

【Linux】waitpid函数 及其 非阻塞等待和阻塞等待

父进程等待子进程结束可以通过两种方式实现&#xff1a;阻塞等待和非阻塞等待。这两种方式各有优缺点&#xff0c;适用于不同的场景。 简单来说&#xff1a; 阻塞等待&#xff1a;先等你&#xff0c;我再继续 非阻塞等待&#xff1a;不等你&#xff0c;我继续做自己的事&…

初识适配器模式

适配器模式 引入 生活中的例子&#xff1a;当我们使用手机充电时&#xff0c;充电器起到了转换器的作用&#xff0c;它将家用的220伏特电压转换成适合手机充电的5伏特电压。 适配器模式的三种类型 命名原则&#xff1a;适配器的命名应基于资源如何传递给适配器来进行。 类适配…

Web架构演变历程~

1、背景 对于服务架构&#xff0c;这个名词大家应该都很熟悉了吧&#xff0c;一个好的架构并不是一个最合适的架构&#xff0c;在对于选择那种架构&#xff0c;对于一个项目后续发展致关重要&#xff0c;接下来我们一起走进web服务架构的演变历程看看吧&#xff01; 2、服务架…

基于STM32F407VGT6芯片----跑马灯实验

一、在STM32F407VGT6芯片中配置GPIO环境 对于一个跑马灯实验&#xff0c;首先&#xff0c;要了解的就是&#xff0c;芯片是如何构造出来的&#xff0c;设计GPIO引脚&#xff1a;根据原理图&#xff0c; PC4&#xff0c;PC5,PC6,PC7 为 LED 输出控制管脚&#xff0c;PE0 为蜂鸣…

Spring Boot视频网站:安全与可扩展性设计

4 系统设计 4.1系统概要设计 视频网站系统并没有使用C/S结构&#xff0c;而是基于网络浏览器的方式去访问服务器&#xff0c;进而获取需要的数据信息&#xff0c;这种依靠浏览器进行数据访问的模式就是现在用得比较广泛的适用于广域网并且没有网速限制要求的B/S结构&#xff0c…

SpringDataRedis快速入门

SpringDataRedis 什么是SpringDataRedis SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis SpringDataRedis中提供了RedsiTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类…

Atlas800昇腾服务器(型号:3000)—YOLO全系列NPU推理【检测】(五)

服务器配置如下&#xff1a; CPU/NPU&#xff1a;鲲鹏 CPU&#xff08;ARM64&#xff09;A300I pro推理卡 系统&#xff1a;Kylin V10 SP1【下载链接】【安装链接】 驱动与固件版本版本&#xff1a; Ascend-hdk-310p-npu-driver_23.0.1_linux-aarch64.run【下载链接】 Ascend-…

YOLOv11模型改进-注意力机制-引入自适应稀疏自注意力ASSA

随着目标检测领域的快速发展&#xff0c;YOLO系列模型凭借其端到端、高效的检测性能逐渐成为工业界和学术界的标杆。然而&#xff0c;如何进一步优化YOLOv11的特征提取能力&#xff0c;减少冗余信息并提升模型对复杂场景的适应性&#xff0c;仍是一个值得深入探讨的问题。为此&…

Atlas800昇腾服务器(型号:3000)—驱动与固件安装(一)

服务器配置如下&#xff1a; CPU/NPU&#xff1a;鲲鹏 CPU&#xff08;ARM64&#xff09;A300I pro推理卡 系统&#xff1a;Kylin V10 SP1【下载链接】【安装链接】 驱动与固件版本版本&#xff1a; Ascend-hdk-310p-npu-driver_23.0.1_linux-aarch64.run【下载链接】 Ascend-…

scrapy 爬虫学习之【中医药材】爬虫

本项目纯学习使用。 1 scrapy 代码 爬取逻辑非常简单&#xff0c;根据url来处理翻页&#xff0c;然后获取到详情页面的链接&#xff0c;再去爬取详情页面的内容即可&#xff0c;最终数据落地到excel中。 经测试&#xff0c;总计获取 11299条中医药材数据。 import pandas as…

特斯拉Robotaxi发布会2024:自动驾驶未来的开端

引言 2024年10月&#xff0c;特斯拉在洛杉矶举行了一场引发全球科技界高度关注的发布会&#xff0c;主题为“We Robot”。这场发布会展示了特斯拉的最新自动驾驶技术&#xff0c;包括无人驾驶出租车Cybercab和无人驾驶厢式货车Robovan&#xff0c;并且还展示了人形机器人Optim…