详细介绍:学习STC51单片机27(芯片为STC89C52RCRC)

news/2025/10/6 13:21:31/文章来源:https://www.cnblogs.com/wzzkaifa/p/19127553

每日一言

        你读过的书、走过的路、流过的汗,终将成就独一无二的你。

 

硬件:LCD1602液晶显示

非标协议外设 

概述

LCD1602(Liquid Crystal Display)是一种工业字符型液晶,能够同时显示 16×02 即 32 字符(16列两行)

那我们会发现明明就是屏幕上面只有32个位置来存放字符啊,那为什么要8位呢,明明5位就好啦(2的5次方等于32),因为其实这个他是可以移位的,就是其实不止我们看到的屏幕那么大的地方能够存放数据,后面还有看解释:

屏幕位置

地址范围

实际显现区域

第一行

0x00~0x27

0x00~0x0F(前 16 字节)

第二行

0x40~0x67

0x40~0x4F(前 16 字节)

LCD1602 的 8 位数据线(D0~D7)中,每一位都独立代表 1 个二进制数据位,共同组成 8 位数据(即 1 字节),用于传输指令或显示内容

反正就用8位数据线(代表8位数据)(当然也有4位的,4位就是每次每次传输的字节是8位的一半)

我们的接线

因为写入表明地址是要求最高位D7恒定位高电平

所以要在05这个位置写入字符的话,那其实这个位置的地址为0x85(0x80+0x05)也就是0x80+5  1000 0101

看时序图

写的执行,写到LCD1602里面)就是写操作(我们的地址和内容其实都

RS为1的时候为内容

RS为0的时候是地址/指令

该8位数据线就很像SBUF的作用,因为这个LCD1602是没有SBUF的因此我们要等于是做了一个这样的功能,用这个8位数据线,每一条数据线代表一个位,

BF为忙标志位  1代表忙  0代表不忙

两个就是LCD1602 的状态寄存器(用于读取忙标志 BF)和数据寄存器(用于写入显示资料)独立的寄存器,它们的最高位功能不同,不会相互影响。

BF 的自动变化

当 LCD 执行内部操作(如清屏、初始化)时,硬件自动将 BF 置 1,表示忙碌。

执行完成后,硬件自动将 BF 置 0,表示空闲。

MCU 只需循环读取 BF,无需手动修改它。

精髓所在!!!

LCD1602 的初始化操作与忙信号检测是紧密关联的逻辑流程。初始化过程中需要执行清屏、显现模式设置等指令,这些操作需要一定时间完成,在此期间 LCD 处于 “忙碌” 状态(忙信号有效)。而忙信号检测的作用正是确认 LCD 是否已完成初始化及相关管理 —— 只有当检测到忙信号变为 “不忙” 时,才能确保后续的数据写入或指令发送能被正确执行。简而言之,初始化操作会触发 LCD 的忙碌状态,而忙信号检测则是判断初始化是否完成的关键依据,二者通过 “处理耗时→状态检测→后续执行” 的逻辑链条实现联动,以保证 LCD 显示控制的准确性和稳定性。

案例1:LCD实现显示一个字符C

代码解释

前期工作:我们先将RS RW 还有E 还有8位数据位都先做好工作

这边我们 将8位数据位用P0组来表示,因为刚好我的P0组够用这个8根数据线

后面的写操控要将指令写到该dataBuffer里面做铺垫就是随后我们用宏定义 #define dataBuffer P0 这样来表示 ,由于我们的素材就是存放在这个dataBuffer里面的,接着这个P0组所有的资料都汇聚到这边,所以dataBuffer 就好像是一个SBUF的作用 ,也

要将写内容和写指令的代码写出来,这边我们将它们封装成了两个函数data_Write_cmd 和data_Write_data

data_Write_cmd 将指令写到LCD1602的函数

这个函数我们通过手册知道写指令的操控需要将RS置为低电平,因为我们需要选择指令寄存器,RW呗是要一直为低电平因为RW为低电平就是写的操作

后面就要看时序图,和参数了

我们根据时序图写E和数据的写入,和变化

数据在E变高电平之前就进行了资料的写入,那么dataBuffer = cmd这个指令就要在E = 1之前写出来,后面就是我们根据参数,来给时间,那么这边他的单位是ns,我们单片机给一个_nop_()就够了,1个nop代表1us,

所以大家根据他的最低时间来穿插nop()函数

这个函数我们通过手册知道写内容的运行要求将RS置为高电平,缘于我们需要选择数据寄存器,RW呗是要一直为低电平因为RW为低电平就是写的操作

写内容和写指令,都是写的操作,所以时序图是一样的,只是RS不同,也就是寄存器不同应该选择对应的寄存器,所以改一下RS为高电平就好了

随后大家根据手册知道,还需要进行LCD初始化(这个是初始化的代码,和命令和意图)

又随后我们还需要进行忙信号的检测

那么忙信号,就是我们进行初始化,的那些操作所需要耗费的时间,在进行初始化的时候,忙信号就会为1,初始化结束的时候,不忙就会为0 ..

我们来写忙信号封装的函数

通过手册得知,这边说明一下

重点看这个

        LCD1602 的指令寄存器(用于读取忙标志 BFRS = 0; RW = 1;就是指令寄存器,读的管理 所以

读的操作就是那么我们肯定知道我们去读取忙信号

检测BF的话其实就是检测bit7为1,那么就是先检测bit7是否为1,为1的时候说明还在初始化(还忙),那么我们就让他卡在循环那,不断检测,直到bit7为0,说明忙信号为0(不忙了),不忙了我们才让他出不断检测忙信号的循环。说明这样的话我们需要将检测忙信号做一个while循环就像这样:

写内容都要先开始检测忙信号,不检测的话会导致数据丢失)就是        什么意思呢?就是刚开始就是忙的嘛所以我们先设置tmp和dataBuffer=0x80,为什么都设置0x80呢?           1、让强制进入检测忙信号的循环     2、缘于我们检测忙信号,只是检测最高位bit7的位置是否是1,所以dataBuffer设置为0x80,然后这个dataBuffer他是总线嘛,是传输数据的,当不忙的时候,指令寄存器就会传输数据为0x某某,那么bit7就不会等于1等于0了,那么随之改变的tmp也会改变,那么tmp & 0x80就会等于0了(按位与是有0为0,全1为1),然后就跳出循环了,那么我们的写操作就允许开始进行了(不管是写指令还

所以现在我们确认好根据时序图来写代码

最终main函数里面:

1定义一个位置和定义一个内容

2调用初始化函数,在调用3写指令函数4写内容函数

案例2:LCD实现显示一句话

字符串的话也是一样的,基本上大差不差

在原来代码上面添加这些代码

要说的点在

该地址哈0x80+6 那么这个就是很多工业的液晶显示的习惯就是  基址+移动

比如想显示在第一行  基址(0x80+0x00)+移动(6) 向右边偏移6个位置,如果不习惯的话也可以直接写成0x86

故而这个0x80+col  是0x80+6的这个写法不用太计较

我们的经典做法就是先写地址,写完地址后写入内容,我们输入一句话(字符数组,在其他语言里叫做字符串)肯定是用指针啊,用指针遍历

每一行有每一行的地址的写法,于是大家用switch

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

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

相关文章

[KaibaMath1001] 关于∀ε0,|a-b|ε = a=b的证明

[KaibaMath1001] 关于∀ε>0,|a-b|<ε => a=b的证明摘要:如能理解|a - b| < ε => a = b,则就可以轻松理解数列极限或函数极限的定义。 # 1 关于∀ε>0,|a - b| < ε => a = b的证明 # …

基于Web的分布式图集管理系统架构设计与实践 - 教程

基于Web的分布式图集管理系统架构设计与实践 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

做逆战网站的名字建网站学什么专业

URLEncoder到底是干什么用的&#xff1f;&#xff1f; 都说是对form表单里的请求编码解码用的&#xff0c;但是为什么在写中文文件下载的时候也用到了。 就是说国际通用的编码对中文支持不好&#xff0c;所以需要对着玩意进行转换。 因为中文读取的时候你不给一个编码&#xff…

完整教程:Deepseek/cherry studio中的Latex公式复制到word中

完整教程:Deepseek/cherry studio中的Latex公式复制到word中pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

网站ftp国内大型软件外包公司

文章目录 [toc]配置无线网和分区修改时区安装内核和驱动自动生成 fstab 文件配置 pacman切换到安装好的系统设置时区配置 pacman 国内源安装 gui安装 GRUB 引导建立引导 增加内核模块配置开机自启修改 root 用户密码创建普通用户配置 sudo 重启进入新系统配置 wlan 自动连接 wi…

TCP小结 - 指南

TCP小结 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Couri…

泰安营销型网站建设公司公司网络营销策略

税收问题&#xff0c;怎么把一个数按照部分进行计算呢&#xff1f;比如一个数大于10000&#xff0c;然后超过10000的部分按照5%计算&#xff0c;10000-5000的区间按照3%计算 在C中&#xff0c;你可以使用条件语句&#xff08;if-else语句&#xff09;来根据不同的条件计算税收…

亦庄网站建设wordpress单用户案例

无锁队列的基本介绍 一个关于无锁队列的多线程读写代码示例。在这里&#xff0c;我提供一个简单的示例来说明这个问题。 在使用无锁队列时&#xff0c;需要注意以下几点&#xff1a; 使用原子操作来实现对队列的读写操作&#xff0c;以避免多线程同时访问同一数据导致的竞争条…

石家庄网站建设公司黄页做网站建设 个体经营 小微企业

目录 一、为什么需要低代码平台 二、低代码平台的搭建能力 三、低代码其他能力 四、写在最后 随着互联网和信息技术的快速发展&#xff0c;各行各业都在积极拥抱数字化转型。在这个过程中&#xff0c;软件开发成为企业实现数字化转型的关键环节。然而&#xff0c;传统的软件开发…

国庆 Day2 强基物理

转动惯量又来了。相对论入门。前言:和暑假讲的有重合,上午主要是刚体转动力学、转动惯量、积分求解。那么就结合暑假的部分一起整理了。晚上等老师发了笔记再来更新。 讲了几乎一上午的积分。就当做是复习暑假自学的…

ZR 2025 十一集训 Day 6

100 + 100 + 10 + 0 = 210, Rank 5/22.良心模拟赛,吊打 MX。25十一集训day1 链接:link 题解:题目内 时间:4.5h (2025.10.06 08:30~13:00) 题目数:4 难度:A B C D\(\color{#F39C11} 橙\) \(\color{#3498DB} 蓝\)*…

AirSim 安装过程记录 - zzh

AirSim 安装简略教程与注意事项 Part 1: 安装摘要 本文旨在记录本人安装AirSim的过程,以便于后续在其他设备上的迁移安装 参考网站:微软官方下载指导:https://microsoft.github.io/AirSim/powershell 下载指导:htt…

LARAVEL安装报错:Illuminate\Database\QueryException could not find driver (Connection: sqlite, SQL:

安装LARAVEL12.32.5时,执行 composer global require laravel/installer cd example-appphp artisan serve后访问http://localhost:8000/ 时报错:Illuminate\Database\QueryException could not find driver (Conne…

unix/linux source 命令,其发展历程详细时间线、由来、历史背景 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

基于AXI模块的视频流传输(硬件连接篇)

初来乍到,先自我介绍,我是一所双非学校集成电路专业的学生,目标是成为一个合格的FPGA,数字ic设计,验证工程师,目前大三,此篇章仅以记录我打FPGA创新创业大赛过程的一些学习经验,是基于zynq7020开发板的开发项目…

四、函数调用具备单个参数之Double类型-mmword,movsd,mulsd,addsd指令,总结汇编的数据类型

四、函数调用具备单个参数之Double类型-mmword,movsd,mulsd,addsd指令,总结汇编的数据类型2025-10-06 12:55 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !impo…

商丘网站建设的公司哪家好企业所得税什么时候交

#include指令和头文件 例如#include <stdio.h>&#xff0c;我们经常看到C文件最上面会有类似这样的语句&#xff0c;它的作用相当于把stdio.h文件中的所有内容都输入该行所在的位置。实际上&#xff0c;这是一种“拷贝-粘贴”的操作。 #include这行代码是一条C预处理器…

深圳网站建设 利科技有限公司购物网站建设服务

如果对于二叉搜索树不是太清楚&#xff0c;为什么要使用二叉搜索树&#xff1f;作者推荐&#xff1a;二叉搜索树的初步认识_加瓦不加班的博客-CSDN博客 定义节点 static class BSTNode {int key; // 若希望任意类型作为 key, 则后续可以将其设计为 Comparable 接口Object val…

[GDOUCTF 2023]泄露的伪装

打开题目,根据题目提示扫描题目所在目录扫描完成后访问扫描到的两个文件 在压缩包文件中看到php文件直接访问php文件后,看到源码使用写入协议 ?cxk=data://text/plain;base64,Y3RybA==得到flag

仿射密码

前言 在密码学的发展历程中,从简单的凯撒密码到更具安全性的加密方式,仿射密码是重要的进阶。它基于数论知识,通过线性变换为信息加密,既保留了替换加密的简洁,又大幅提升了保密性,是理解现代加密算法的关键基础…