学习STC51单片机27(芯片为STC89C52RCRC)

news2025/6/6 23:09:43

每日一言

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

 

硬件:LCD1602液晶显示

非标协议外设  

概述

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

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

  • 容量:80 字节(地址范围 0x00~0x4F),但仅前 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根数据线

然后我们用宏定义 #define dataBuffer P0 这样来表示 ,因为我们的数据就是存放在这个dataBuffer里面的,然后这个P0组所有的数据都汇聚到这边,所以dataBuffer 就好像是一个SBUF的作用 ,也是后面的写操作要将指令写到这个dataBuffer里面做铺垫

要将写内容和写指令的代码写出来,这边我们将它们封装成了两个函数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 的指令寄存器(用于读取忙标志 BF指令寄存器,读的操作 所以是RS = 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.coloradmin.cn/o/2399414.html

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

相关文章

DA14531_beacon_大小信标设备开发

蓝牙信标是一款通过广播指定蓝牙信号,实现信标信号扫描、识别和获得辅助信息的电子产品。 不同品名的蓝牙信标采用相同的 UUID 和广播信号格式,但在 MAC 地址、工作寿命、体积和广播周期上有所差异。 小武编程巧用DA14531开发一款蓝牙信标.

【算法训练营Day06】哈希表part2

文章目录 四数相加赎金信三数之和四数之和 四数相加 题目链接:454. 四数相加 II 这个题注意它只需要给出次数,而不是元组。所以我们可以分治。将前两个数组的加和情况使用map存储起来,再将后两个数组的加和情况使用map存储起来,ke…

Word双栏英文论文排版攻略

word写双栏英文论文的注意事项 排版首先改字体添加连字符还没完呢有时候设置了两端对齐会出现这样的情况: 公式文献 等我下学期有时间了,一定要学习Latex啊,word写英文论文,不论是排版还是公式都很麻烦的,而Latex一键就…

乡村三维建模 | 江苏农田无人机建模案例

测绘是农田建设的基础工作,测绘的质量和效率直接影响农田建设的进度和成果。传统的人工测量、地面测量等测绘手段,存在效率低、精度差、受环境影响大、成本高等缺点,难以满足高标准农田建设的要求。而无人机倾斜摄影技术具有高效、精确、灵活…

2025 5 月 学习笔记

计算高斯半径,用于生成高斯热图 这个的意义是什么 有什么作用? 14 核心意义:平衡定位精度与检测鲁棒性 在基于热图的目标检测方法(如CenterNet、CornerNet等)中,计算高斯半径的核心意义在于​​在精确…

SpringBoot(七) --- Redis基础

目录 前言 一、Redis入门 二、Redis常用数据类型 三、Redis常用命令 1. 字符串操作命令 2. 哈希操作命令 3. 列表操作命令 4. 集合操作命令 5. 有序集合操作命令 6.通用命令 四、在Java中操作Redis 前言 Redis是一个基于内存的key-value结构数据库,有以下…

从OSI到TCP/IP:网络协议的演变与作用

个人主页:chian-ocean 文章专栏-NET 从OSI到TCP/IP:网络协议的演变与作用 个人主页:chian-ocean文章专栏-NET 前言网络发展LANWAN 协议举个例子: 协议的产生背景 协议的标准化OSI模型参考OSI各个分层的作用各层次的功能简介 TCP/…

Stream流性能分析及优雅使用

文章目录 摘要一、Stream原理解析1.1、Stream总概1.2、Stream运行机制1.2.1、创建结点1.2.1、搭建流水线1.2.3、启动流水线 1.3、ParallelStream 二、性能对比三、优雅使用3.1 Collectors.toMap()3.2 findFirst(),findAny()3.3 增删元素3.4 ParallelStream 四、总结…

【和春笋一起学C++】(十七)C++函数新特性——内联函数和引用变量

C提供了新的函数特性,使之有别于C语言。主要包括: 内联函数;按引用传递变量;默认参数值;函数重载(多态);模版函数; 因篇幅限制,本文首先介绍内联函数和引用…

proteus新建工程

1 点击新建工程 2 输入项目名,选择工程文件夹 3 下一步 4 不创建pcb 5 直接下一步 6 点击完成 7 创建完毕

RTC实时时钟DS1338Z-33/PT7C433833WEX国产替代FRTC1338S

FRTC1338S是NYFEA徕飞公司推出的一种高性能的实时时钟芯片,它采用了SOP8封装技术,这种技术因其紧凑的尺寸和出色的性能而被广泛应用于各类电子设备中。 FRTC1338S串行实时时钟(RTC)是一种低功耗的全二进制编码十进制(BCD)时钟/日历外加56字节的非易失性…

Redis命令使用

Redis是以键值对进行数据存储的,添加数据和查找数据最常用的2个指令就是set和get。 set:set指令用来添加数据。把key和value存储进去。get:get指令用来查找相应的键所对应的值。根据key来取value。 首先,我们先进入到redis客户端…

【免费数据】1980-2022年中国2384个站点的水质数据

水,是生命之源,关乎着地球上每一个生物的生存与发展。健康的水生生态系统维持着整个水生态的平衡与活力;更是确保人类能持续获得清洁水源的重要保障。水质数据在水质研究、海洋生物量测算以及生物多样性评估等诸多关键领域都扮演着举足轻重的…

Git 极简使用指南

Git 是一个强大的分布式版本控制系统,但入门只需要掌握几个核心概念和命令。本指南旨在帮助你快速上手,处理日常开发中最常见的 80% 的场景。 核心概念 仓库 (Repository / Repo): 你的项目文件夹,包含了项目的所有文件和完整的历史记录。…

力扣刷题Day 69:搜索二维矩阵(74)

1.题目描述 2.思路 首先判断target是否有可能在矩阵的某一行里,没可能直接返回False,有可能就在这一行里二分查找。 3.代码(Python3) class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> boo…

MySQL指令个人笔记

MySQL学习,SQL语言笔记 一、MySQL 1.1 启动、停止 启动 net start mysql83停止 net stop mysql831.2 连接、断开 连接 mysql -h localhost -P 3306 -u root -p断开 exit或者ctrlc 二、DDL 2.1 库管理 2.1.1 直接创建库 使用默认字符集和排序方式&#xf…

2022年 国内税务年鉴PDF电子版Excel

2022年 国内税务年鉴PDF电子版Excelhttps://download.csdn.net/download/2401_84585615/89784658 https://download.csdn.net/download/2401_84585615/89784658 2022年国内税务年鉴是对中国税收政策、税制改革和税务管理实践的全面总结。这份年鉴详细记录了中国税收系统的整体状…

基于Java的OPCDA采集中间件

1.软件功能及技术特点简介: 软件功能及技术特点简介: OPCDA是基于Java语言开发的OPC client(OPC客户端)跨平台中间件软件,他支持OPC SERVER的OPC DA1.0/2.0/3.0。OPCDA实时采集数据(包括实时数据、报警数…

vue2 项目中 npm run dev 运行98% after emitting CopyPlugin 卡死

今天在运行项目时,发现如下问题: 开始以为是node_modules依赖的问题,于是重新 npm install,重启项目后还是未解决。 在网上找了一圈发现有人说是 require引入图片地址没有写。在我的项目中排查没有这个问题,最后发现某…

JavaScript 性能优化实战:从原理到框架的全栈优化指南

在 Web 应用复杂度指数级增长的今天,JavaScript 性能优化已成为衡量前端工程质量的核心指标。本文将结合现代浏览器引擎特性与一线大厂实践经验,构建从基础原理到框架定制的完整优化体系,助你打造高性能 Web 应用。 一、性能优化基础&#x…