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

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 0000RS = 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)延时 15msDelay15ms();
//(2)写指令 38H(不检测忙信号)wirte_cmd(0x38);
//(3)延时 5msDelay5ms();
//(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.hqwc.cn/news/127155.html

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

相关文章

模拟滤波器的基础知识和设计

信号处理工作中滤波器的应用是非常广泛的,可以分成模拟滤波器和数字滤波器两种,数字滤波器主要包括两种,IIR和FIR,这两种滤波器后面统一说,今天先来说一说模拟滤波器(主要是我先用Python实现了Matlab书里面…

【SQL Server】表死锁/解锁和sql语句分析

文章目录 表死锁查询锁的进程解锁 sql语句分析来源 表死锁 查询锁的进程 1 首先创建一个测试用的表: CREATE TABLE Test ( TID INT IDENTITY(1,1) ) 2 执行下面的SQL语句将此表锁住: SELECT * FROM Test WITH (TABLOCKX) 3 通过下面的语句可以查看…

Docker搭建MySQL8.0主从复制(一主一从)

0. 配置说明 宿主机使用的版本为19045的win10专业版,MySQL使用的是8.0,Docker容器使用Linux。 1. 安装Docker Desktop 略 修改Docker默认安装路径 安装包自己就提供了修改安装路径的功能,CMD中运行: “Docker Desktop Installe…

Django 前端模板显示换行符、日期格式

linebreaksbr 显示换行符 <td>{{ data.sku_list|default:"无"|linebreaksbr }}</td> date:"Y年m月d日 H:i" 设置日期格式 <td>{{ data.submit_time|date:"Y年m月d日 H:i" }}</td> 其他语法 forloop 获取循环的索引 …

从0开始学go第五天

gin框架返回JSON package mainimport ("net/http""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/json", func(c *gin.Context) {//用map序列化//方法一&#xff1a;用map&#xff0c;后面用接口类型// data : map[string…

Golang网络编程:即时通讯系统Instance Messaging System

系统基本架构 版本迭代 项目改造 无人机是client&#xff0c;我们是server&#xff0c;提供注册登入&#xff0c;场景选择等。信道模拟器是server&#xff0c;我们是client&#xff0c;我们向信道模拟器发送数据&#xff0c;等待信道模拟器计算结果&#xff0c;返回给无人机。…

Altium Designer培训 | 2 - 原理图库创建篇

目录 原理图界面屏幕放大&缩小&移动 元件库介绍及电阻容模型的创建 【SCH Library】面板 元件符号 绘制一只电阻的模型 设置栅格大小 绘制一只电容的模型 IC类元件模型的创建 排针类元件模型的创建 光耦及二极管元件模型 现有元件模型的调用 参考上一篇文章…

jira+confluence安装

准备如下所有包&#xff1a; atlassian-agent.jar jdk-8u241-linux-x64.tar.gz atlassian-confluence-8.0.0-x64.bin atlassian-jira-software-9.4.0-x64.bin mysql-8.0.31-1.el8.x86_64.rpm-bundle.tar mysql-connector-java-8.0.28.jar confluence-8.2.1破解 1.安装j…

yolov5 web端部署进行图片和视频检测

目录 1、思路 2、代码结构 3、代码运行 4、api接口代码 5、web ui界面 6、参考资料 7、代码分享 1、思路 通过搭建flask微型服务器后端&#xff0c;以后通过vue搭建网页前端。flask是第一个第三方库。与其他模块一样&#xff0c;安装时可以直接使用python的pip命令实现…

【audio】alsa pcm音频路径

文章目录 AML方案音频路径分析dump alsa pcm各个音频路径的原始音频流数据 AML方案音频路径分析 一个Audio Patch用来表示一个或多个source端到一个或多个sink端。这个是从代码的注释翻译来的&#xff0c;大家可以把它比作大坝&#xff0c;可以有好几个入水口和出水口&#xf…

【Kotlin精简】第1章 基础类型

1 Kotlin基础类型 Kotlin中&#xff0c;我们可以调用任何变量的成员函数和属性&#xff0c;从这个角度来说&#xff0c;一切皆对象。某些类型可以有特殊的内部表现。例如&#xff1a;数字、字符和布尔型在运行时可以表现为基础类型&#xff08;primitivetypes&#xff09;。 …

架构师选择题--计算机网络

架构师选择题--计算机网络 22年考题21年考题20年考题19年真题2017考题 22年考题 d http:80 https:httpssl &#xff1a;443 b b pop3是邮件接收协议&#xff1a;110 SMTP是邮件发送协议&#xff1a;25 http:80 A 网络隔离&#xff1a;防火墙&#xff08;逻辑&#xff09;&…