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;          //允许读取    1602
			
    sbp=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;          //允许读取    1602
			
    sbp=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 1111
	
	  LCD1602(0,0,0x41);//选中 自定义字符 00H 第二行
		LCD1602(1,0,0x04);//存入第二行数据     0000 0100
	
	  LCD1602(0,0,0x42);//选中 自定义字符 00H 第三行
		LCD1602(1,0,0x04);//存入第三行数据     0000 0100
	
	  LCD1602(0,0,0x43);//选中 自定义字符 00H 第四行
		LCD1602(1,0,0x1f);//存入第四行数据     0001 1111
	
    LCD1602(0,0,0x44);//选中 自定义字符 00H 第五行
		LCD1602(1,0,0x04);//存入第五行数据     0000 0100
	
	  LCD1602(0,0,0x45);//选中 自定义字符 00H 第六行
		LCD1602(1,0,0x04);//存入第六行数据     0000 0100
		
	  LCD1602(0,0,0x46);//选中 自定义字符 00H 第七行
		LCD1602(1,0,0x1f);//存入第七行数据     0001 1111
		
		
	  LCD1602(0,0,0x80);  //设置显示在那个字符 DDRAM 一行显示时范围为  00H-4FH
		LCD1602(1,0,0x00);    //显示自定义字符!
		
		
	
	
	while(1);
		


}





void LCD1602(unsigned char RSA,unsigned char RWA,unsigned char date)    //1602写入操作

{
		
    RS=RSA;        //传递寄存器选择
    RW=RWA;        //传递读写选择
    E=1;          //允许读取    1602
			
    sbp=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;          //允许读取    1602

    sbp=date;
    delay(200);
    E=0;          //拉低使能控制 下降沿允许写入!      1602


}


void delay(unsigned int t)      //简单延迟函数
{
    while(t--);

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot中药材进存销管理系统【附源码】

基于SpringBoot中药材进存销管理系统 效果如下&#xff1a; 系统注册界面 管理员主界面 员工界面 供应商界面 中药材类型界面 中药材界面 员工主界面 研究背景 随着中医药产业的快速发展&#xff0c;传统的管理方式已难以满足现代化、规模化的药材管理需求。中药材种类繁多&…

Vulnhub打靶-matrix-breakout-2-morpheus

基本信息 靶机下载&#xff1a;https://pan.baidu.com/s/1kz6ei5hNomFK44p1QT0xzQ?pwdy5qh 提取码: y5qh 攻击机器&#xff1a;192.168.20.128&#xff08;Windows操作系统&#xff09; 靶机&#xff1a;192.168.20.0/24 目标&#xff1a;获取2个flagroot权限 具体流程 …

基于FreeRTOS的LWIP移植

目录 前言一、移植准备工作二、以太网固件库与驱动2.1 固件库文件添加2.2 库文件修改2.3 添加网卡驱动 三、LWIP 数据包和网络接口管理3.1 添加LWIP源文件3.2 Lwip文件修改3.2.1 修改cc.h3.2.2 修改lwipopts.h3.2.3 修改icmp.c3.2.4 修改sys_arch.h和sys_arch.c3.2.5 修改ether…

【NOIP提高组】一元三次方程求解

【NOIP提高组】一元三次方程求解 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 有形如&#xff1a;ax3bx2cxd0 这样的一个一元三次方程。给出该方程中各项的系数(a&#xff0c;b&#xff0c;c&#xff0c;d均为实数)&#xff0c;并约定该方…

图像梯度-Sobel算子、scharrx算子和lapkacian算子

文章目录 一、认识什么是图像梯度和Sobel算子二、Sobel算子的具体使用三、scharrx算子与lapkacian(拉普拉斯)算子 一、认识什么是图像梯度和Sobel算子 图像的梯度是指图像亮度变化的空间导数&#xff0c;它描述了图像在不同方向上的强度变化。在图像处理和计算机视觉中&#x…

Unity使用Git及GitHub进行项目管理

git: 工作区,暂存区(存放临时要存放的内容),代码仓库区1.初始化 git init 此时展开隐藏项目,会出现.git文件夹 2.减小项目体积 touch .gitignore命令 创建.gitignore文件夹 gitignore文件夹的内容 gitignore中添加一下内容 # This .gitignore file should be place…

2025秋招八股文--网络原理篇

前言 1.本系列面试八股文的题目及答案均来自于网络平台的内容整理&#xff0c;对其进行了归类整理&#xff0c;在格式和内容上或许会存在一定错误&#xff0c;大家自行理解。内容涵盖部分若有侵权部分&#xff0c;请后台联系&#xff0c;及时删除。 2.本系列发布内容分为12篇…

《Linux从小白到高手》综合应用篇:深入理解Linux常用关键内核参数及其调优

1. 题记 有关Linux关键内核参数的调整&#xff0c;我前面的调优文章其实就有涉及到&#xff0c;只是比较零散&#xff0c;本篇集中深入介绍Linux常用关键内核参数及其调优&#xff0c;Linux调优80%以上都涉及到内核的这些参数的调整。 2. 文件系统相关参数 fs.file-max 参数…

VMware虚拟机的下载安装与使用

目录 一、下载VMware虚拟机 步骤1---找到需要的虚拟机下载位置 步骤2---找到下载的安装包安装程序 二、删除干净VMware虚拟机 步骤1--进去服务里面关闭虚拟机服务 步骤2---控制面板里面删除 步骤3---注册表删除HKEY_CURRENT_USER\Software\VMware, Inc. 步骤4---安装在…

政安晨【零基础玩转各类开源AI项目】基于本地Ubuntu (Linux ) 系统应用Gradio-Lite:无服务器 Gradio 完全在浏览器中运行

目录 简介 什么是gradio/lite&#xff1f; 入门 1.导入 JS 和 CSS 2. 创建标签 3. 在标签内编写你的 Gradio 应用程序 更多示例&#xff1a;添加其他文件和要求 多个文件 其他要求 SharedWorker 模式 代码和演示playground 1.无服务器部署 2.低延迟 3. 隐私和安全…

【C语言】文件操作(1)(文件打开关闭和顺序读写函数的万字笔记)

文章目录 一、什么是文件1.程序文件2.数据文件 二、数据文件1.文件名2.数据文件的分类文本文件二进制文件 三、文件的打开和关闭1.流和标准流流标准流 2.文件指针3.文件的打开和关闭文件的打开文件的关闭 四、文件的顺序读写1.fgetc函数2.fputc函数3.fgets函数4.fputs函数5.fsc…

AI开发-三方库-Hugging Face-Pipelines

1 需求 需求1&#xff1a;pipeline支持的任务类型 需求2&#xff1a;推理加速使用CPU还是GPU 需求3&#xff1a;基于pipeline的文本分类示例 需求4&#xff1a;pipeline实现原理 模型使用步骤&#xff08;Raw text -》Input IDs -》Logits -》Predictions&#xff09;&…

k8s 1.28.2 集群部署 harbor v2.11.1 接入 MinIO 对象存储

文章目录 [toc]提前准备什么是 HarborHarbor 架构描述Harbor 安装的先决条件硬件资源软件依赖端口依赖 Harbor 在 k8s 的高可用Harbor 部署Helm 编排YAML 编排创建 namespace导入镜像部署 Redis部署 PostgreSQL部署 Harbor core部署 Harbor trivy部署 Harbor jobservice部署 Ha…

前端考试总结

1HTML标签 h标题标签 块级标签 独占一行 p段落标签 同上 br换行标签 单标签 img图片标签 内联标签:不独占一行(src图片地址 alt图片的替代文字 title鼠标悬停提示文字) a超链接标签 同上 (href跳转路径 target属性{_blank新窗口打开 _self在当前窗口打开}) 列表标签(ul无…

VSCODE 导入cubeide工程

1.下载vscode及插件STM32 VS Code Ectersion 版本号1.0.0&#xff0c;之后这个有导入功能。 2.等待自动安装对应插件&#xff0c;提示缺少什么就补什么 3.在左侧出现stm32图标。点击Import a local project导入本地项目。 4.报错 [{"resource": "/f:V11/cmak…

前端html,css 样式巩固1

想做这样 一个效果 点击图片切换 当前的选中图片 我们使用 原生的js html 来开发这个 直接粘贴代码 相信大家 都能看懂的 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" …

抖音视频制作怎么暂停画面,抖音视频怎么让它有暂停的效果

千万别滥用视频特效&#xff0c;不然它能毁掉你的抖音作品。在创作过程中&#xff0c;应尽量使用类似暂停画面、隐形字幕这样的视觉特效&#xff0c;可以显著提高作品的视觉体验。增强视频表现力的同时&#xff0c;也不会让画面看起来过于夸张。有关抖音视频制作怎么暂停画面的…

Springboot 整合 Java DL4J 实现文物保护系统

&#x1f9d1; 博主简介&#xff1a;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编程&#xff0c;…

2011年国赛高教杯数学建模A题城市表层土壤重金属污染分析解题全过程文档及程序

2011年国赛高教杯数学建模 A题 城市表层土壤重金属污染分析 随着城市经济的快速发展和城市人口的不断增加&#xff0c;人类活动对城市环境质量的影响日显突出。对城市土壤地质环境异常的查证&#xff0c;以及如何应用查证获得的海量数据资料开展城市环境质量评价&#xff0c;研…

应用层协议 序列化

自定义应用层协议 例子&#xff1a;网络版本计算器 序列化反序列化 序列化&#xff1a;将消息&#xff0c;昵称&#xff0c;日期整合成消息-昵称-日期 反序列化&#xff1a;消息-昵称-日期->消息&#xff0c;昵称&#xff0c;日期 在序列化中&#xff0c;定义一个结构体…