51单片机基础04 LCD1602时序;Proteus仿真单片机、总线、网络标号等;

目录

一、LCD显示字符

1、写指令

(1)、LCD状态配置

(2)、显示开关与光标

2、写数据

(1)、设置地址

(2)、设置数据

3、初始化代码

(1)、初始化流程

(2)、初始化代码

4、数据显示

(1)、地址写入

(2)、数据写入

二、按键控制LED流水灯-总线与网络标号

1、原理图

2、代码


一、LCD显示字符

        打开LCD1602的控制时序图,其采用了HD44780及兼容芯片,可以看到:

        当然一般对LCD,我们都是写指令和写输入,可以先不看读的部分,注意到写指令和写数据最重要的就是RS控制进行区分。

1、写指令

(1)、LCD状态配置

        看手册关于指令码,常用的有4.1.1,00111000=0x38;

(2)、显示开关与光标

        显示开、关与光标设置,一般如果不进行输入操作的时候不显示光标,而在每次上电的时候,最好先设置关显示,进行清屏后再打开,因此一般为00001100/00001000即0X0C/0X08;

2、写数据

(1)、设置地址

        可以看到通过输入80H+地址码设置好要写的地方,即对应上面的图。

(2)、设置数据

3、初始化代码

(1)、初始化流程

        手册也提供了一个比较好的初始化流程:

(2)、初始化代码

void LCD1602_init(void)
{ Delay1602(1500);               //调用延时函数LCD1602_Write_com(0x38);       //8位数据总线,两行显示模式,5*7点阵显示Delay1602(500);                //调用延时函数LCD1602_Write_com(0x38);       //8位数据总线,两行显示模式,5*7点阵显示Delay1602(500);                //调用延时函数LCD1602_Write_com(0x38);       //8位数据总线,两行显示模式,5*7点阵显示LCD1602_Write_com_busy(0x38);  //8位数据总线,两行显示模式,5*7点阵显示LCD1602_Write_com_busy(0x08);  //显示功能关,无光标LCD1602_Write_com_busy(0x01);  //清屏LCD1602_Write_com_busy(0x06);  //写入新的数据后,光标右移,显示屏不移动LCD1602_Write_com_busy(0x0C);  //显示功能开,无光标
} 

        相关的寄存器设置都在上面进行了清晰的展示。

前面说到写数据需要检测忙或者不检测,因此需要进行两个代码进行展示

①不忙写入

//1602液晶相关I/O设置
sbit E=P2^3;               //1602液晶的E脚接在P2.3口上
sbit RW=P2^4;              //1602液晶的RW脚接在P2.4口上
sbit RS=P2^5;              //1602液晶的RS脚接在P2.5口上
//写指令 不检测忙信号
void LCD1602_Write_com(unsigned char combuf)
{ RS=0;                //选择指令寄存器RW=0;                //选择写状态P0=combuf;           //将命令字通过P0口送至DBE=1;                 //E高电平将命令字写入1602液晶E=0;                 //写完以后,恢复E的电平
} 

②忙检测

void LCD1602_busy(void)
{ P0_7=1;              //将P0.7置1,为读状态做准备 RS=0;                //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入RW=1;                //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入E=1;                 //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入while(P0_7==1);      //由P0.7读入1,表示1602液晶忙,需要等待//单片机处理完当前任务,忙信号P0_7自动置0(无效),即不忙E=0;                 //读完以后,恢复E的电平
} 

        本质上忙检测就是检测那个IO是否被LCD置位0。

4、数据显示

(1)、地址写入

void LCD1602_Write_address(unsigned char x,unsigned char y)
{ x&=0x0f;             //列地址限制在0-15间y&=0x01;             //行地址限制在0-1间if(y==0)             //如果是第一行LCD1602_Write_com_busy(x|0x80);        //将列地址写入else                 //如果是第二行LCD1602_Write_com_busy((x+0x40)|0x80); //将列地址写入//x列数加上0x40是要从第二行的40的存储单元算起。1602共2行(每行40个存储单元)
} 

        前文提到,需要地址码+0X80,在数据语言中,|可以用来表示加法,但是如果直接用0-27、40-67在用户态很麻烦,因此一般用户端就写具体的行列,加地址在bsp驱动层完成。

(2)、数据写入

        直接调用LCD1602_Write_data_busy即可,写入的就是char字符,如果要多次显示,则多次调用即可。

LCD1602_Disp(0,0,DISbuf/100+'0');      //在第1行的第1列显示百位
LCD1602_Disp(1,0,(DISbuf%100)/10+'0'); //在第1行的第2列显示十位
LCD1602_Disp(2,0,DISbuf%10+'0');       //在第1行的第3列显示个位

二、按键控制LED流水灯-总线与网络标号

1、原理图

        可以看到本次采用了一个总线方式的连接,同时放置了网络标号。

        通过此总线可以放置蓝色的线,点击放置连线标号,输入字符串例如t1、再点击另一端也输入t1,即可实现该两端连接。

2、代码

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//延时
void DelayMS(uint x)
{uchar i;while(x--){for(i=0;i<120;i++);}
}
//主程序
void main()
{uchar i;P2=0x01;while(1){for(i=0;i<7;i++){P2=_crol_(P2,1); //P2的值向左循环移动DelayMS(150);}for(i=0;i<7;i++){P2=_cror_(P2,1); //P2的值向右循环移动DelayMS(150);}}
}

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

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

相关文章

性能优化(二):ANR

介绍 ANR全称Application Not Responding&#xff0c;意思就是程序未响应。如果一个应用无法响应用户的输入&#xff0c;系统就会弹出一个ANR对话框&#xff0c;用户可以自行选择继续等待亦或者是停止当前程序。 Android系统会监控程序的响应状况&#xff0c;一旦出现下面情况…

哑光电影人像自拍风景摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 哑光电影人像自拍风景摄影后期调色旨在通过 Lightroom 软件为照片营造出一种具有电影质感的哑光效果&#xff0c;同时突出人像与风景的融合之美。 预设信息 调色风格&#xff1a;电影风格预设适合类型&#xff1a;人像&#xff0c;风光&#xff0c;自拍&#xff0c;…

二五、pxe自动装机

pxe自动装机 pxe------------------------------自动安装系统必要的运行环境 无人值守--------------------为系统定制化的安装需要的软件 pxe的优点&#xff1a; 1、规模化&#xff1a;同时装配多台服务器&#xff08;20-30&#xff09; 2、自动化&#xff1a;系统安装和…

Cadence安装

记录一下安装过程&#xff0c;方便以后安装使用Cadence。 去吴川斌的博客下载安装包&#xff0c;吴川斌博客&#xff1a; https://www.mr-wu.cn/cadence-orcad-allegro-resource-downloads/ 下载阿狸狗破戒大师 我这边下载的是版本V3.2.6&#xff0c;同样在吴川斌的博客下载安装…

VScode-Java开发常用插件

中文——界面易读 字体主题——代码可观 头注释——项目信息明了 java开发包——java必备 git协作开发——版本控制

19.UE5道具掉落

2-21 道具掉落&#xff0c;回血、回蓝、升级提升伤害_哔哩哔哩_bilibili 目录 1.道具的创建&#xff0c;道具功能的实现 2.随机掉落 1.道具的创建&#xff0c;道具功能的实现 新建Actor蓝图&#xff0c;并命名为道具总类&#xff0c;添加一个Niagara粒子组件和一个碰撞箱bo…

算法--分解数字

#分解5位整数 12345# 定义一个函数x&#xff0c;用于将一个整数n转换为一个列表&#xff0c;列表中的元素是n的每一位数字 def x(n):# 如果n小于10&#xff0c;说明n是一个一位数&#xff0c;直接创建一个包含n的列表并返回if n < 10:list1 [] # 创建一个空列表list1.appe…

protobuf序列化

Protocol Buffers (protobuf) 是一种由 Google 开发的轻便、高效的结构化数据序列化格式&#xff0c;常用于数据存储或在应用程序之间传输数据。它可以将数据结构&#xff08;如对象、消息&#xff09;转换为字节流&#xff0c;以便在网络上进行传输或存储。 Protobuf序列化基…

M-LAG 技术笔记

M-LAG 简介 M-LAG&#xff08;Multichassis link aggregation&#xff0c;跨设备链路聚合&#xff09;将两台物理设备在聚合层面虚拟成一台设备来实现跨设备链路聚合&#xff0c;从而提供设备级冗余保护和流量负载分担。 M-LAG 基础概念 如 图1-1 所示&#xff0c;Device A …

【政策】正文关键词提取总结

附&#xff1a;样本构建流程&#xff1a; 候选样本圈选&#xff0c;这一步的目的是选出潜在的高质量样本&#xff0c;找到一部分高难度样本&#xff0c;并过滤掉可能的意图不明或无意义数据。样本圈选的方法见下文。 对圈选出的样本随机抽样一小部分进行人工标注。 利用少量的…

Vue3 虚拟列表组件库 virtual-list-vue3 的使用

Vue3 虚拟列表组件库 virtual-list-vue3 的基本使用 分享个人写的一个基于 Vue3 的虚拟列表组件库&#xff0c;欢迎各位来进行使用与给予一些更好的建议&#x1f60a; 概述&#xff1a;该组件组件库用于提供虚拟化列表能力的组件&#xff0c;用于解决展示大量数据渲染时首屏渲…

特征缩放的学习

两边同时除以最大范围&#xff0c;除了除以最大值以外&#xff0c;你还可以执行所谓的均值归一化。这看起来是&#xff0c;你从原始特征开始&#xff0c;然后你重新缩放他们&#xff0c;使两者其中以零为中心。以前它们只有大于零的值&#xff0c;现在他们既有负值又有正值这通…

【大模型实战篇】vLLM的由来以及大模型部署、推理加速实践

1. 问题背景分析及vLLM的由来 大模型毫无疑问&#xff0c;在工作、生活中已经逐渐扮演越来越重要的角色。但大模型的尺寸一般都比较大&#xff0c;处理一个大模型请求的成本可能比传统关键字查询高出 10 倍。推理的成本代价较高&#xff0c;因此提高大模型服务系统的吞吐量&…

[JAVAEE] 网络编程

目录 一. 什么是socket套接字 二. socket套接字 2.1 socket套接字根据传输层协议分类 2.2 TCP流套接字 UDP数据报套接字主要特点 三. UDP数据报套接字编程 3.1 DatagramSocket 是UDP socket, 用于发送和接受数据报 3.2 DatagramPacket 是UDP socket 发送和接收的数据报 …

SDF,一个从1978年运行至今的公共Unix Shell

关于SDF 最近发现了一个很古老的公共Unix Shell服务器&#xff0c;这个项目从1978年运行至今&#xff0c;如果对操作系统&#xff0c;对Unix感兴趣&#xff0c;可以进去玩一玩体验一下 SDF Public Access UNIX System - Free Shell Account and Shell Access 注册方式 我一…

物联网低功耗广域网LoRa开发(二):LoRa开发环境搭建及驱动移植

一、STM32CubeMX加载固件库 将F0固件库添加进来 二、IAR介绍、安装及快捷操作 &#xff08;一&#xff09;IAR介绍 1、简介 C/C编译器和调试器 集成开发环境(IDE) 实时操作系统和中间件 开发套件 硬件仿真器以及状态机建模工具2、IAR与Keil对比 MDK默认只创建工程&#xf…

RK3568平台开发系列讲解(设备树篇)device_node 转换成 platform_device

🚀返回专栏总目录 文章目录 一、DTB转换规则二、转换源码分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍通过设备树 device_node 转换成 platform_device 一、DTB转换规则 device 部分是用 platform_device 结构体来描述硬件资源的, 所以内核最终会…

深入理解 source 和 sh、bash 的区别

1 引言 在日常使用 Linux 的过程中&#xff0c;脚本的执行是不可避免的需求之一&#xff0c;而 source、sh、bash 等命令则是执行脚本的常用方式。尽管这些命令都能运行脚本&#xff0c;但它们之间的执行方式和效果却有着显著的区别。这些区别可能会影响到脚本的环境变量、工作…

基于Java Springboot鲜花商城系统

一、作品包含 源码数据库设计文档PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#xff1a;MySQL8.0 …

413: Quick Sort

解法&#xff1a; #include <bits/stdc.h> using namespace std; const int N1e55; int a[N]; int n;int main(int argc, char** argv) {cin>>n;for (int i0;i<n;i) cin>>a[i];sort(a,an);for (int i0;i<n;i) cout<<a[i]<<" "…