STC89C51基础及项目第10天:LCD显示字符(非标协议外设)

news2025/1/12 1:50:27

1. 初识LCD1602(233.79)

非标协议外设

LCD1602显示

  • LCD1602(Liquid Crystal Display)是一种工业字符型液晶,能够同时显示 16×02 即 32 字符(16列两行)
    在这里插入图片描述
  • 引脚说明
    在这里插入图片描述
    • 第 1 脚: VSS 为电源地
    • 第 2 脚: VDD 接 5V 正电源
    • 第 3 脚: VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个 10K 的电位器调整对比度。
    • 第 4 脚: RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
    • 第 5 脚: R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 RS 和 R/W 共同为低电平时可以写入指令或者显示地址,当 RS 为低电平 R/W 为高电平时可以读忙信号,当 RS 为高电平 R/W 为低电平时可以写入数据。
    • 第 6 脚: E 端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。
    • 第 7-14 脚 D0~D7 为 8 位双向数据线。
    • 第 15 脚: 背光源正极。
    • 第 16 脚: 背光源负极。
//和上官一号的接线
//(工作)电源
VSS -- GND
VDD -- 5V
//对比度
VO -- GND
//控制线
RS -- P1.0
R/W -- P1.1
E -- P1.4
//背光灯(电源)
A -- 5V
K -- GDN
//数据(类似串口的SBUF)
D0到D7 -- P0.到P0.7

在这里插入图片描述

2. LCD在一个位置显示一个字母的逻辑(234.80)

开发逻辑

在这里插入图片描述

  • 在哪里显示
    • 例如第二行第一个字符的地址是 40H,那么是否直接写入 40H 就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位 D7 恒定为高电平 1 所以实际写入的数据应该是 01000000B(40H) +10000000B(80H)=11000000B(C0H)
      在这里插入图片描述
  • 显示什么(ASCII码,so代码时直接输入字符即可)
    在这里插入图片描述

3. LCD1602读写操作时序分析(235.81)

读操作时序

在这里插入图片描述

写操作时序

在这里插入图片描述

数序参数

在这里插入图片描述

4. 编程实现LCD1602显示字符C101(236.82)

  • 代码(16./LCD1602显示一个字符C)
#include "reg52.h"
#include "intrins.h"
/*
RS  -- P1.0
RW  -- P1.1 
E   -- P1.4*/
#define dataBuffer P0 //定义8位数据线,P0端口组
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^4;

void check_busy(){
	char tmp = 0x80;
	dataBuffer =0x80;
	
	while(tmp & 0x80){//1000 0000
		RS = 0; 
		RW = 1; //RS为低电平、R/W为高电平时可读忙信号
	
		EN = 0;
		_nop_();
		EN = 1;
		_nop_();
		_nop_();
		tmp = dataBuffer;//数据建立时间(读操作)tD时读数据
		EN = 0;
		_nop_();	
	}


}

void wirte_cmd(char cmd){
	check_busy();
	RS = 0; //低电平时为指令寄存器
	RW = 0; //全程低电平
	
	EN = 0;
	_nop_();//延迟(低电平+tR)的时间,so>=25ns(tR)即可,1us就足够
	dataBuffer = cmd;//把指令传给P0 //数据建立时间(写操作)tSP2时写数据
	_nop_();//最好在拉高之前延迟一会,因为还有一段tR的时间
	EN = 1;
	_nop_();//延迟一个机器周期(@11.0592MHz):1.085us即1085ns
	_nop_();//延迟(tPW+TF)的时间
	EN = 0;
	_nop_();//给低电平一点延迟
}
void wirte_data(char dataShow){
	check_busy();
	RS = 1; //高电平时为数据寄存器
	RW = 0; 
	
	EN = 0;
	_nop_();
	dataBuffer = dataShow;//把数据传给P0
	_nop_();
	EN = 1;
	_nop_();
	_nop_();
	EN = 0;
	_nop_();
}

void Delay15ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 27;
	j = 226;
	do
	{
		while (--j);
	} while (--i);
}
void Delay5ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 9;
	j = 244;
	do
	{
		while (--j);
	} while (--i);
}
void LCD1602_INIT(){
//(1)延时 15ms
	Delay15ms();
//(2)写指令 38H(不检测忙信号)
	wirte_cmd(0x38);
//(3)延时 5ms
	Delay5ms();
//(4)以后每次写指令,读/写数据操作均需要检测忙信号
//(5)写指令 38H:显示模式设置
	wirte_cmd(0x38);
//(6)写指令 08H:显示关闭
	wirte_cmd(0x08);
//(7)写指令 01H:显示清屏
	wirte_cmd(0x01);
//(8)写指令 06H:显示光标移动设置
	wirte_cmd(0x06);
//(9)写指令 0CH:显示开及光标设置
	wirte_cmd(0x0C);
}

void main(){
	char position = 0x80+0x05;
	char dataShow = 'C';
	LCD1602_INIT();
	wirte_cmd(position);
	wirte_data(dataShow);
}

5. 编程实现LCD1602显示一行(238.84)

  • 代码(17./LCD1602显示一行)
void showLine(char line,char list,char* string){
	switch(line){
		case 1:
			wirte_cmd(0x80+list);
			while(*string){
				wirte_data(*string);
				string++;
			}
			break;
		
		case 2:
			wirte_cmd(0x80+0x40+list);
			while(*string){
				wirte_data(*string);
				string++;
			}
			break;
	}
}

void main(){
	char position = 0x80+0x05;
	//char dataShow = 'C';
	LCD1602_INIT();
	showLine(1,5,"NO.1");
	showLine(2,0,"Jes is handsome");
}

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

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

相关文章

vue3前端开发-flex布局篇

文章目录 1.传统布局与flex布局优缺点传统布局flex布局建议 2. flex布局原理2.1 布局原理 3. flex常见属性3.1 父项常见属性3.2 子项常见属性 4.案例实战(携程网首页) 1.传统布局与flex布局优缺点 传统布局 兼容性好布局繁琐局限性,不能再移动端很好的布局 flex布…

【C++入门到精通】C++入门 —— 红黑树(自平衡二叉搜索树)

阅读导航 前言一、红黑树的概念二、红黑树的性质三、红黑树节点的定义四、红黑树结构(带有头结点的红黑树)五、红黑树的插入操作1. 按照二叉搜索的树规则插入新节点2. 新节点插入后,红黑树的变色以及旋转情况1: cur为红&#xff0…

nginx-proxy反向代理缓存

介绍: 反向代理缓存,类似于动静分离,即通过nginx代理服务器根据客户端发送的url请求,去后台服务器获取数据,将静态数据缓存到nginx代理服务器上,并配置有过期时间,当客户端下次以相同的url请求…

【机器学习】决策树原理及scikit-learn使用

文章目录 决策树详解ID3 算法C4.5算法CART 算法 scikit-learn使用分类树剪枝参数重要属性和接口 回归树重要参数,属性及接口交叉验证代码示例 一维回归的图像绘制 决策树详解 决策树(Decision Tree)是一种非参数的有监督学习方法,…

blender 之视频渲染(以三维重建path为例)

blender 之视频渲染(以三维重建path为例) 1.新建轨迹路径2.设置相机,使其按照path运动3.将相机视角对准物体4.修改帧率5.设置输出路径6.设置输出格式7.渲染 1.新建轨迹路径 新建轨迹 选中新建的BezierCycle,按住S,拖…

基于支持向量机SVM和MLP多层感知神经网络的数据预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 一、支持向量机(SVM) 二、多层感知器(MLP) 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .…

mysql面试题23:如果某个表有近千万数据,CRUD比较慢,如何优化?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:如果某个表有近千万数据,CRUD比较慢,如何优化? 当某个表存在近千万数据且CRUD(增删改查)操作比较慢时,可以考虑以下优化策略: 使用索引:索…

3.1.OpenCV技能树--二值图像处理--图像腐蚀与膨胀

文章目录 1.文章内容来源2.图像膨胀处理2.1.图像膨胀原理简介2.2.图像膨胀核心代码2.3.图像膨胀效果展示 3.图像腐蚀处理3.1.图像腐蚀原理简介3.2.图像腐蚀核心代码3.3.图像腐蚀效果展示 4.易错点总结与反思 1.文章内容来源 1.题目来源:https://edu.csdn.net/skill/practice/o…

LVS+Keepalived 高可用集群负载均衡

一.keepalived介绍 1.1.Keepalived实现原理 由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务。 每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态。 若当前在线的路由器失效,则其他路由器会根据设置…

(论文调研) Multi-task的网络结构 在图像去噪问题中的应用

1.SNIDER: Single Noisy Image Denoising and Rectification for Improving License Plate Recognition 这是一篇用于实现端到端的车牌恢复 (LPR: License Plate Recognition) 网络, 其中使用去噪和校正网络来生成清晰的恢复图像, 以实现稳健的 LPR 性能. 这个网络的名称为SN…

内网渗透笔记之内网基础知识

0x01 内网概述 内网也指局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的历程安排、电子邮件和传真通信服务等功能。 内…

Maven(4)-利用intellij idea创建maven 多模块项目

本文通过一个例子来介绍利用maven来构建一个多模块的jave项目。开发工具:intellij idea。 一、项目结构 multi-module-project是主工程,里面包含两个模块(Module): web-app是应用层,用于界面展示&#xff…

基于瞬时无功功率ip-iq的谐波信号检测Simulink仿真

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

nodejs+vue快递管理服务系统elementui

电子商务改变了人们的传统经济活动中的交易方式和流通技术, 复杂的物流快递信息需要有效的进行处理,构建一个快递管理服务系统可以确保物流信息的一致性、员工登录:通过用户名和密码登录。这也间接带动了物流快递行业的高速发展。 &#xff0…

flutter开发实战-inappwebview实现flutter与Javascript方法调用

flutter开发实战-inappwebview实现flutter与Javascript方法调用 在使用inappwebview时候,需要flutter端与JS进行交互,调用相应的方法,在inappwebview中的JavaScript Handlers。 一、JavaScript Handlers 要添加JavaScript Handlers&#…

基于FPGA的图像形态学腐蚀算法实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将FPGA的仿真结果导入到MATLAB,结果如下所示: 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 timescale 1ns / 1ps…

界面组件DevExpress WinForms v23.1 - TreeList、UI模板全新升级

DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…

cpu的指令重排,禁用办法

上一篇博客 volatile关键字总结-CSDN博客,我们讲了两个volatile变量可以限制编译器对指令的重排,但是限制不了cpu层面的指令重排 这篇博客开始,我们演示下cpu层面的指令重排,以及如何禁止cpu层面的指令重排 实验一:复…

SpringBoot的error用全局异常去处理

记录一下使用SpringBoot2.0.5的error用全局异常去处理 在使用springboot时,当访问的http地址或者说是请求地址输错后,会返回一个页面,如下: 这是因为请求的地址不存在,默认会显示error页面 但我们实际需要一个接口&a…

lua 中文字符的判断简介

一般在工作中会遇到中文字符的判断、截断、打码等需求,之前一直没有总结,虽然网上资料也多,今天在这里简单的总结一下。 1 .UTF-8简单描述 UTF-8 是 Unicode 的实现方式之一,其对应关系(编码规则)如下表所…