【51单片机零基础-chapter6:LCD1602调试工具】

在这里插入图片描述

实验0-用显示屏LCD验证自己的猜想

如同c++的cout,前端的console.log()

#include <REGX52.H>
#include <INTRINS.H>
#include "LCD1602.h"
int var=0;
void main()
{LCD_Init();LCD_ShowNum(1,1,var+211,5);while(1){;}
}

在这里插入图片描述

实验1-编写LCD1602液晶显示屏驱动函数

LCD1602.c

#include <REGX52.H>
#include <INTRINS.H>
#include "LCD1602.h"sbit LCD_RS=P2^6;				//LCD1602 RS 数据/指令选择
sbit LCD_RW=P2^5;				//LCD1602 RW 读/写选择
sbit LCD_EN=P2^7;				//LCD1602 EN 使能 #define LCD_DataPort		P0	//LCD1602 D0~D7 数据端口/*** @brief  LCD1602延时函数,12MHz调用可延时1ms* @param  无* @retval 无*/
void LCD_Delay()		//@11.0592MHz 1ms
{unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);
}/*** @brief  LCD1602写命令* @param  Command 要写入的命令* @retval 无*/
void LCD_WriteCommand(unsigned Command)
{LCD_RS = 0;					//LCD1602指令LCD_RW = 0;					//LCD1602写LCD_DataPort = Command;		//写指令LCD_EN = 1;					//LCD1602 EN使能为高LCD_Delay();				//delay 1ms,防止时序太快LCD1602来不及执行LCD_EN = 0;					//LCD1602 EN使能为低LCD_Delay();				//delay 1ms
}/*** @brief  LCD1602写数据* @param  Data 要写入的数据* @retval 无*/
void LCD_WriteData(unsigned Data)
{LCD_RS = 1;				//LCD1602数据LCD_RW = 0;				//LCD1602写LCD_DataPort = Data;	//写数据LCD_EN = 1;				//LCD1602 EN使能为高LCD_Delay();			//delay 1ms,防止时序太快LCD1602来不及执行LCD_EN = 0;				//LCD1602 EN使能为低LCD_Delay();			//delay 1ms
}/*** @brief  LCD1602初始化函数* @param  无* @retval 无*/
void LCD_Init(void)
{LCD_WriteCommand(0x38);	//8位数据接口,两行显示,5*7点阵LCD_WriteCommand(0x0c);	//显示开,光标关,闪烁关	LCD_WriteCommand(0x06);	//数据读写操作后,光标自动加1,画面不动LCD_WriteCommand(0x01);	//清屏
}/*** @brief  LCD1602设置光标位置* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16* @retval 无*/
void LCD_SetCursor(unsigned char Line, unsigned char Column)
{unsigned char AC_DDRAM = 0;/* 计算写入到DDRAM(显示区)的光标AC的位置 */if(Line == 1){AC_DDRAM = 0x00 + (Column - 1);AC_DDRAM |= 0x80;}else if(Line == 2){AC_DDRAM = 0x40 + (Column - 1);AC_DDRAM |= 0x80;}LCD_WriteCommand(AC_DDRAM);	//设置光标地址
}/*** @brief  在LCD1602指定位置上显示一个字符* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16* @param  Char 要显示的字符* @retval 无*/
void LCD_ShowChar(unsigned char Line, unsigned char Column, char Char)
{LCD_SetCursor(Line, Column);	//设置光标位置LCD_WriteData(Char);
}/*** @brief  在LCD1602指定位置上显示一个字符* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16* @param  Char 要显示的字符* @retval 无*/
void LCD_ShowString(unsigned char Line, unsigned char Column, char *String)
{unsigned char i = 0;LCD_SetCursor(Line, Column);	//设置光标位置/* 打印字符串 */i = 0;while(String[i] != '\0'){LCD_WriteData(String[i]); //光标AC每次自动加1i++;}
}/*** @brief  返回值=X的Y次方*/
signed int LCD_Power(int x, int y)
{int result = 1;while(y > 0){result *= x;y--;}return result;
}/*** @brief  在LCD1602指定位置开始显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~65535* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowNum(unsigned char Line, unsigned char Column, unsigned int Num, unsigned char Length)
{unsigned char i = 0;unsigned char Chr;LCD_SetCursor(Line, Column);	//设置光标位置for(i=Length; i>0; i--){Chr = Num/LCD_Power(10,i-1)%10;if(Chr >=0 && Chr <= 9){Chr += 0x30;}LCD_WriteData(Chr);}
}/*** @brief  在LCD1602指定位置开始以有符号十进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:-32768~32767* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowSignedNum(unsigned char Line, unsigned char Column, int Num, unsigned char Length)
{unsigned char i = 0;unsigned char SingleNum;unsigned char Number1;LCD_SetCursor(Line, Column);	//设置光标位置if(Num>=0){LCD_WriteData('+');Number1 = Num;}else{LCD_WriteData('-');Number1 = -Num;			//-32768 转为32768之后可能会溢出}for(i=Length; i>0; i--){SingleNum = Number1/LCD_Power(10,i-1)%10;if(SingleNum >=0 && SingleNum <= 9){SingleNum += 0x30;}LCD_WriteData(SingleNum);}
}/*** @brief  在LCD1602指定位置开始以十六进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~0xFFFF* @param  Length 要显示数字的长度,范围:1~4* @retval 无*/
void LCD_ShowHexNum(unsigned char Line, unsigned char Column, unsigned int Num, unsigned char Length)
{unsigned char i = 0;unsigned char SingleNum;LCD_SetCursor(Line, Column);	//设置光标位置for(i=Length; i>0; i--){SingleNum = Num/LCD_Power(16,i-1)%16;if(SingleNum >=0 && SingleNum <= 9){SingleNum += 0x30;				}else if(SingleNum >=10 && SingleNum <= 15){SingleNum = SingleNum - 10 + 'A';		//16进制A,B,C,D,E,F}LCD_WriteData(SingleNum);}
}/*** @brief  在LCD1602指定位置开始以二进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~1111 1111 1111 1111* @param  Length 要显示数字的长度,范围:1~16* @retval 无*/
void LCD_ShowBinaryNum(unsigned char Line, unsigned char Column, unsigned int Num, unsigned char Length)
{unsigned char i = 0;unsigned char SingleNum;LCD_SetCursor(Line, Column);	//设置光标位置for(i=Length; i>0; i--){SingleNum = Num/LCD_Power(2,i-1)%2;SingleNum += 0x30;LCD_WriteData(SingleNum);}
}

LCD1602.h

#ifndef __LCD1602_H__
#define __LCD1602_H__void LCD_Init(void);
void LCD_WriteCommand(unsigned Command)
void LCD_ShowChar(unsigned char Line, unsigned char Column, char Char);
void LCD_ShowString(unsigned char Line, unsigned char Column, char *String);
void LCD_ShowNum(unsigned char Line, unsigned char Column, unsigned int Num, unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line, unsigned char Column, int Num, unsigned char Length);
void LCD_ShowHexNum(unsigned char Line, unsigned char Column, unsigned int Num, unsigned char Length);
void LCD_ShowBinaryNum(unsigned char Line, unsigned char Column, unsigned int Num, unsigned char Length);
#endif

main.c

#include <REGX52.H>
#include <INTRINS.H>
#include "LCD1602.h"void main()
{LCD_Init();LCD_ShowChar(1, 1, 'Y');//显示一个字符:1行1列LCD_ShowString(1, 3, "POSTGRADUATE");//显示一个字符串:1行3列开始LCD_ShowNum(2, 1, 985, 3);//2行1列显示数字985,如果指定两位则不显示高位,为85,如果是四位则高位补零显示,为0985//LCD_ShowSignedNum(2, 5, -5, 1);//显示有符号数(符号不计入位数)//LCD_ShowHexNum(2, 8, 0xA8, 2);	//显示十六进制LCD_ShowBinaryNum(2, 5, 0xAA, 8);//显示二进制while(1){;}
}

比较核心的
在这里插入图片描述
在这里插入图片描述

实验2-动态显示

#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"
int var=0;
void main()
{LCD_Init();while(1){var++;Delay(1000);	LCD_ShowNum(1,1,var,3);Delay(1000);}
}

实验3-滚动显示

在这里插入图片描述
在这里插入图片描述

在Main.c中增加LCD1602移屏指令

#include <REGX52.H>
#include <INTRINS.H>
#include "LCD1602.h"
#include "Delay.h"
void main(){LCD_Init();while(1){LCD_ShowString(1, 16, "CONGRATULATIONS!");LCD_ShowString(2, 16, "WELCOME TO UESTC , WANG XIAO !");Delay(500);LCD_WriteCommand(0x18);//调用一次左移一次//LCD_WriteCommand(0x1c);//调用一次右移一次		Delay(500);}
}

在这里插入图片描述
参考1:LCD显示时期
参考2:笔记
参考3:笔记
参考4:lcd位移
参考5:lcd驱动程序

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

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

相关文章

【GO基础学习】gin的使用

文章目录 模版使用流程参数传递路由分组数据解析和绑定gin中间件 模版使用流程 package mainimport ("net/http""github.com/gin-gonic/gin" )func main() {// 1.创建路由r : gin.Default()// 2.绑定路由规则&#xff0c;执行的函数// gin.Context&#x…

杰盛微 JSM4056 1000mA单节锂电池充电器芯片 ESOP8封装

JSM4056 1000mA单节锂电池充电器芯片 JSM4056是一款单节锂离子电池恒流/恒压线性充电器&#xff0c;简单的外部应用电路非常适合便携式设备应用&#xff0c;适合USB电源和适配器电源工作&#xff0c;内部采用防倒充电路&#xff0c;不需要外部隔离二极管。热反馈可对充电电流进…

Linux实验报告14-Linux内存管理实验

目录 一&#xff1a;实验目的 二&#xff1a;实验内容 1、编辑模块的源代码mm_viraddr.c 2、编译模块 3、编写测试程序mm_test.c 4、编译测试程序mm_test.c 5、在后台运行mm_test 6、验证mm_viraddr模块 一&#xff1a;实验目的 (1)掌握内核空间、用户空间&#xff…

供需平台信息发布付费查看小程序系统开发方案

供需平台信息发布付费查看小程序系统主要是为了满足个人及企业用户的供需信息发布与匹配需求。 一、目标用户群体 个人用户&#xff1a;寻找兼职工作、二手物品交换、本地服务&#xff08;如家政、维修&#xff09;等。 小微企业&#xff1a;推广产品和服务&#xff0c;寻找合…

overleaf写学术论文常用语法+注意事项+审阅修订

常用语法 导入常用的宏包 \usepackage{cite} \usepackage{amsmath,amssymb,amsfonts} \usepackage{algorithmic} \usepackage{algorithm} \usepackage{graphicx} \usepackage{subfigure} \usepackage{textcomp} \usepackage{xcolor} \usepackage{lettrine} \usepackage{booktab…

动态规划<八> 完全背包问题及其余背包问题

目录 例题引入---找到解决问题模版 LeetCode 经典OJ题 1.第一题 2.第二题 3.第三题 其余的一些背包问题 1.二维费用的背包问题 例题引入---找到解决问题模版 OJ 传送门 牛客 DP42 【模板】完全背包 画图分析: 使用动态规划解决(第二问与第一问的不同之处用绿色来标记) 1.…

TP8 前后端跨域访问请求API接口解决办法

报错&#xff1a;Access to XMLHttpRequest at http://www.e.com/api/v1.index/index?t1735897901267 from origin http://127.0.0.1:5500 has been blocked by CORS policy: Response to preflight request doesnt pass access control check: The value of the Access-Contr…

【前端系列】Pinia状态管理库

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、Pinia状态管理库&#xff1a;☀️☀️☀️2.1 pinia基本使用① pinia充当中转站存放token② 使用步骤 2.1 axios请求拦截器 一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 回报不在行动之后&#xff0c;…

打造三甲医院人工智能矩阵新引擎(四):医疗趋势预测大模型篇 EpiForecast与DeepHealthNet合成应用

一、引言 1.1 研究背景与意义 在当今数字化时代,医疗领域积累了海量的数据,涵盖电子病历、医学影像、基因序列、临床检验结果等多源异构信息。这些数据蕴含着疾病发生发展、治疗反应、疫情传播等规律,为医疗趋势预测提供了数据基础。准确的医疗趋势预测能辅助医疗机构提前…

C# 服务调用RFC函数获取物料信息,并输出生成Excel文件

这个例子是C#服务调用RFC函数&#xff0c;获取物料的信息&#xff0c;并生成Excel文件 上接文章&#xff1a;C#服务 文章目录 创建函数创建结构编写源代码创建批处理文件运行结果-成功部署服务器C#代码配置文件注意&#xff01;&#xff01; 创建函数 创建结构 编写源代码 创建…

OFDM学习-(二)长短序列和PPDU整体数据处理流程

OFDM学习 &#xff08;二&#xff09;长短序列和PPDU整体数据处理流程 OFDM学习前言一、短序列短序列的作用 二、长序列三、PLCP/SIGNAL/DATA数据处理流程三、fpga实现STS模块LTS模块训练序列模块仿真波形 总结 前言 根据框图可以知道发射机这部分信号在DA转换之前&#xff0c…

leetcode 173.二叉搜索树迭代器栈绝妙思路

以上算法题中一个比较好的实现思路就是利用栈来进行实现&#xff0c;以下方法三就是利用栈来进行实现的&#xff0c;思路很好&#xff0c;很简练。进行next的时候&#xff0c;先是一直拿到左边的子树&#xff0c;直到null为止&#xff0c;这一步比较好思考一点&#xff0c;下一…

商用车自动驾驶,迎来大规模量产「临界点」?

商用车自动驾驶&#xff0c;正迎来新的行业拐点。 今年初&#xff0c;交通部公开发布AEB系统运营车辆标配征求意见稿&#xff0c;首次将法规限制条件全面放开&#xff0c;有望推动商用车AEB全面标配&#xff0c;为开放场景的商用车智能驾驶市场加了一把火。 另外&#xff0c;…

kubernetes学习-kubectl命令、探针(二)

一、在任意节点使用 kubectl # 在master节点获取节点信息 [rootk8s-master k8s]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane,master 16h v1.23.6 k8s-node1 Ready <none> …

关于IDE的相关知识之三【插件安装、配置及推荐的意义】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于ide插件安装、配置及推荐意义的相关内容…

Node 如何生成 RSA 公钥私钥对

一、引入crypto模块 crypto 为node 自带模块&#xff0c;无需安装 const crypto require(crypto);二、封装生成方法 async function generateRSAKeyPair() {return new Promise((resolve, reject) > {crypto.generateKeyPair(rsa, {modulusLength: 2048, // 密钥长度为 …

数字PWM直流调速系统设计(论文+源码)

2.1 系统方案设计 2.2.1开环控制方案 采用开环方案的系统架构如图2.1所示&#xff0c;这种方式不需要对直流电机的转速进行检测&#xff0c;在速度控制时单片机只需要直接发出PWM就可以实现直流电机速度的控制。这种方式整体设计难度较低&#xff0c;但是无法准确得知当前的…

w~多模态~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/12663226 #Vista-LLaMA Vista-LLaMA 在处理长视频内容方面的显著优势&#xff0c;为视频分析领域带来了新的解决框架。AI解读视频张口就来&#xff1f;这种「幻觉」难题给解决了 近年来&#xff0c;大型语言模型如 GPT、…

2025年第五届控制理论与应用国际会议 | Ei Scopus双检索

会议简介 Brief Introduction 2025年第五届控制理论与应用国际会议(ICoCTA 2025) 会议时间&#xff1a;2025年9月19 -21日 召开地点&#xff1a;中国成都 大会官网&#xff1a;www.icocta.org 控制理论作为一门科学技术&#xff0c;已经广泛地运用于我们社会生活方方面面。随着…

SASS 简化代码开发的基本方法

概要 本文以一个按钮开发的实例&#xff0c;介绍如何使用SASS来简化CSS代码开发的。 代码和实现 我们希望通过CSS开发下面的代码样式&#xff0c;从样式来看&#xff0c;每个按钮的基本样式相同&#xff0c;就是颜色不同。 如果按照传统的方式开发&#xff0c;需要开发btn &…