基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD1602显示整数、小数应用

基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD1602显示整数、小数应用

  • STC12C5A60S2系列1T 8051单片机管脚图
  • STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置
  • STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍
  • 液晶显示器LCD1602简单介绍
  • IIC通信简单介绍
  • 掉电保存数据芯片24C02简单介绍
    • 通过液晶显示器LCD1602显示整数、小数

STC12C5A60S2系列1T 8051单片机管脚图

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

STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置

在这里插入图片描述

STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍

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

液晶显示器LCD1602简单介绍

在这里插入图片描述在这里插入图片描述
DDRAM : 数据显示随机存储器 液晶显示器显示数据是来于数据显示随机存储器
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
CGRAM:字符生成随机存储器 用户自定义字符会存储在字符生成存储器
在这里插入图片描述
CGROM:字符库只读存储器 只提供字符 用液晶显示器显示这些字符

总结:不管是CGRAM(字符生成随机存储器)自定义的字符 还是CGROM(字符库只读存储器)原有的字符 写进DDRAM(数据显示随机存储器)内存地址上 才能在液晶显示器屏幕显示出来
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

IIC通信简单介绍

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

掉电保存数据芯片24C02简单介绍

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

通过液晶显示器LCD1602显示整数、小数

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

#include <stc12c5a60s2.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint 
#define LCD1602PinMode1 0x38//自定义液晶显示器LCD1602八位数据接口的两行5*8点阵 
#define LCD1602PinMode2 0x28//自定义液晶显示器LCD1602四位数据接口的两行5*8点阵
#define LCD1602CleanScreen 0x01//自定义液晶显示器LCD1602清屏变量
#define LCD1602CursorRst 0x02//自定义液晶显示器LCD1602光标复位 
#define LCD1602DisplayCursorGlint 0x0f//自定义液晶显示器LCD1602开显示开光标开光标闪烁 
#define LCD1602DisplayCursorNoGlint 0x0e//自定义液晶显示器LCD1602开显示开光标不开光标闪烁  
#define LCD1602DisplayNoCursorNoGlint 0x0c//自定义液晶显示器LCD1602开显示不开光标不开光标闪烁  
#define LCD1602NoDisplayCursorNoGlint 0x08//自定义液晶显示器LCD1602不开显示不开光标不开光标闪烁  
#define LCD1602CursorRightMoveDisplayNoMove 0x06//自定义液晶显示器LCD1602光标右移 显示不移动
#define LCD1602CursorLeftMoveDisplayNoMove 0x04//自定义液晶显示器LCD1602光标左移 显示不移动
#define LCD1602PictureLeftMove 0x07//自定义液晶显示器LCD1602画面左移 AC自增
#define LCD1602PictureRightMove 0x05//自定义液晶显示器LCD1602画面右移 AC自减
#define LCD1602CursorRightMove 0x10//自定义液晶显示器LCD1602光标右移
#define LCD1602CursorLeftMove 0x14//自定义液晶显示器LCD1602光标左移
#define LCD1602DisplayRightMove 0x18//自定义液晶显示器LCD1602显示右移
#define LCD1602DisplayLeftMove 0x1c//自定义液晶显示器LCD1602显示左移
#define LCD1602DisplayData P0//自定义液晶显示器LCD1602显示数据为单片机P0组引脚
sbit LCD1602RS P2^5;//位定义液晶显示器LCD1602数据指令变量为单片机P2.5引脚
sbit LCD1602RW P2^6;//位定义液晶显示器LCD1602读写变量为单片机P2.6引脚 
sbit LCD1602EN P2^6;//位定义液晶显示器LCD1602使能变量为单片机P2.7引脚 void LCD1602Init()//液晶显示器初始化函数
{LCD1602WriteCommand(LCD1602PinMode1);//液晶显示器LCD1602八位数据接口的两行5*8点阵 LCD1602WriteCommand(LCD1602DisplayNoCursorNoGlint);//液晶显示器LCD1602开显示不开光标不开光标闪烁LCD1602WriteCommand(LCD1602CursorRightMove);//液晶显示器LCD1602光标右移LCD1602WriteCommand(LCD1602CleanScreen);//液晶显示器LCD1602清屏}void LCD1602ReadBusy()//液晶显示器读忙函数
{uchar i;//声明一个计数变量uchar State;//声明状态变量LCD1602DisplayData = 0xff;//液晶显示器LCD1602显示数据变量拉高LCD1602RS = 0;//液晶显示器LCD1602写入指令LCD1602RW = 1;//读取液晶显示器LCD1602do{LCD1602EN = 1;//液晶显示器LCD1602使能State = LCD1602DisplayData;//液晶显示器LCD1602显示数据赋给状态变量LCD1602EN = 0;//关液晶显示器LCD1602使能i++;if(i > 200)//防止液晶显示器LCD1602因损坏陷入do{}while循环中 导致无法执行其他程序break;}while(State & 0x80);//判断状态变量是否为1 为1表示液晶显示器LCD1602在忙 否则不忙}void LCD1602WriteCommand(uchar Command)//液晶显示器LCD1602写命令函数
{LCD1602ReadBusy();//液晶显示器读忙函数LCD1602RS = 0;//液晶显示器LCD1602写入指令LCD1602RW = 0;//写入液晶显示器LCD1602LCD1602DisplayData = Command;//指令变量含有的数据赋给液晶显示器LCD1602显示数据变量LCD1602EN = 1;//液晶显示器LCD1602使能LCD1602EN = 0;//关液晶显示器LCD1602使能} void LCD1602WriteData(uchar Data)//液晶显示器LCD1602写数据函数
{LCD1602ReadBusy();//液晶显示器LCD1602读忙函数LCD1602RS = 1;//液晶显示器LCD1602写入数据LCD1602RW = 0;//写入液晶显示器LCD1602LCD1602DisplayData = Data;//数据变量含有的数据赋给液晶显示器LCD1602显示数据变量LCD1602EN = 1;//液晶显示器LCD1602使能LCD1602EN = 0;//关液晶显示器LCD1602使能} void LCD1602SetDisplayPosition(uchar x,uchar y)//液晶显示器LCD1602设置显示位置
{if(0 == y)//液晶显示器LCD1602第一行显示{LCD1602WriteCommand(0x80 | x);//液晶显示器LCD1602第一行第一位显示}else{LCD1602WriteCommand(0x80 | (0x40 + x));//液晶显示器LCD1602第二行第一位显示}}void LCD1602ShowString(uchar x,uchar y,uchar *String)//液晶显示器LCD1602显示字符串函数 x变量为液晶显示器LCD1602横向显示 相当于列 y变量为液晶显示器LCD1602纵向显示 相当于行
{LCD1602SetDisplayPosition(x,y);//液晶显示器LCD1602设置显示位置while(*String != ' \0 ')//判断字符串是否全部显示 {LCD1602WriteData(*String ++);//液晶显示器LCD1602写入字符串}}uchar IntegerTransformedToHexString(uint Data,uchar *String)//整型数转化为十六进制数的字符串据函数 
{uchar i;//声明循环变量uchar StringLength;//声明字符串长度变量uchar StringCache[6];//声明字符串缓存数组变量if(Data < 0)//判断数据变量是否小于0{Data = -Data;//取数据变量的绝对值*String++ = '-';//字符串变量前取负号StringLength++;//字符串长度变量自加}do{StringCache[i++] = Data % 10 + '0';//取数据变量包含的个位数据赋给字符串缓存数组变量 为什么数据分解后+'0'? 因为液晶显示器LCD1602要显示整数的字符串 而单片机运算字符串的字符是字符对应的ASCII码的二进制数值或十进制数值或十六进制数值 这里取单片机运算字符串的字符对应的ASCII码十进制数值 如:字符'0'的ASCII码的十进制数是48 字符'1'的ASCII码的十进制数是49 字符'2'的ASCII码的十进制数是50 .... 字符'9'的ASCII码的十进制数是57 而编译器对于'0'会自动视为是'0'ASCII码的十进制数48 举例:拿Data = 251来分解 则有:Data/100=2 Data/10%10=5 data%10=1 要把数据型251转化成字符串为"251" 可拆开看成'2' '5' '1' 它们对应的ASCII码十进制数分别为50 53 49 而Data/100=2+'0'=2+48=50 Data/10%10=5+'0'=5+48=53 data%10=1+'0'=1+48=49 算出50 53 49这三个十进制数分别对上字符'2' '5' '1'的ASCII码十进制数为50 53 49 这就是为什么数据分解后+'0'的原因Data /= 10;//取数据变量包含的十位数据}while(Data > 0);//判断数据变量是否大于0StringLength += i;//字符串长度自加while(i-- > 0)//字符串反取循环{*String++ = StringCache[i];//字符串缓存数组变量包含的数据赋给字符串变量}*String = '\0';//字符串结束return StringLength;//返回字符串长度}void main()//主函数
{//uchar String1[] = "Hello World";//uchar String2[] = "Hello LCD1602";uchar String[6];//声明字符串数组变量uchar StringCache[10];//声明字符串数组变量uint Data = 123456;//给整型数据变量赋值 也可以取uint Data = 123456来显示uint Temp;//声明临时变量float Number1 = 1.25;//给单个小数点数字变量赋值float Number2 = 1.2234;//给单个小数点数字变量赋值 也可以取float Number2 = 1.2234来显示LCD1602Init();//液晶显示器初始化函数//LCD1602ShowString(0,0,String1);//显示字符串//LCD1602ShowString(0,1,String2);//显示字符串LCD1602ShowString(0,0,String);//液晶显示器LCD1602第一行第一个位置显示字符串 IntegerTransformedToHexString(Data,String);//整型数转化为十六进制数的字符串据函数Temp = Number1 * 100;//把单个小数点数字变量含有的数值扩大100倍转化成整数变量赋给临时变量LCD1602SetDisplayPosition(0,1);//液晶显示器LCD1602第二行第一个位置显示字符串LCD1602WriteData(Temp/100 + '0');//液晶显示器LCD1602写数据函数 显示百位数据 为什么数据分解后+'0'? 因为液晶显示器LCD1602要显示数据型字符串 而单片机运算字符串的字符是字符对应的ASCII码 如:字符'0'的ASCII码十进制数是48 字符'1'的ASCII码十进制数是49 字符'2'的ASCII码十进制数是50 .... 字符'9'的ASCII码十进制数是57 而编译器对于'0'会自动视为是'0'的ASCII码 即ASCII码十进制数48 举例:拿Data = 251来分解 则有:Data/100=2 Data/10%10=5 data%10=1 要把数据型251转化成字符串为"251" 可拆开看成'2' '5' '1' 它们对应的ASCII码十进制数分别为50 53 49 而Data/100=2+'0'=2+48=50 Data/10%10=5+'0'=5+48=53 data%10=1+'0'=1+48=49 算出50 53 49这三个ASCII码十进制数分别对上字符'2' '5' '1'的ASCII码十进制数为50 53 49 这就是为什么数据分解后+'0'的原因LCD1602WriteData('.');//液晶显示器LCD1602显示小数点LCD1602WriteData(Temp/10%10 + '0');//液晶显示器LCD1602写数据函数LCD1602WriteData(Temp%10 + '0');//液晶显示器LCD1602写数据函数sprintf(StringCache,%0.4f",Number2);//把数字变量Number2含有的数据给格式化成字符串保存到字符串数组变量StringCache中LCD1602ShowString(8,1,StringCache);//液晶显示器LCD1602第二行第九个位置显示字符串 while(1);//主循环}

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

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

相关文章

IP地址的地理位置:固定性与动态性的平衡

IP地址的地理位置是网络通信中一个重要的元素&#xff0c;常被用于定位设备和用户。然而&#xff0c;很多人好奇&#xff0c;IP地址的地理位置是否会发生变化&#xff1f;本文将深入讨论IP地址地理位置的固定性与动态性之间的平衡&#xff0c;以及造成这种变化的因素。 1. IP地…

【稳定检索|投稿优惠】2024年经济管理与安全科学国际学术会议(EMSSIC 2024)

2024年经济管理与安全科学国际学术会议(EMSSIC 2024) 2024 International Conference on Economic Management and Security Sciences(EMSSIC 2024) 一、【会议简介】 2024年经济管理与安全科学国际学术会议(EMSSIC 2024)&#xff0c;将于繁华的上海城召开。这次会议的主题是“…

【shell】shell脚本编程作业

1 编写bash脚本&#xff0c;要求用户输入源目录和目标目录(绝对路径&#xff09;&#xff0c;然后列出源目录下所有的文件&#xff0c;并将这些文件拷贝到目标目录&#xff0c;并在文件名后面加上时间戳。&#xff08;提交源代码和运行截图&#xff09; if [ -d $1 ] || [ -d…

使用FFMPEG转码,转单声道,转标准WAV,转PCM

本文为使用FFMPEG命令行的方式处理音频&#xff0c;来获取想要得到的音频文件。 零、使用命令行查看编码封装信息 格式&#xff1a;ffprobe.exe -show_format inputfile 例子&#xff1a;ffprobe.exe -show_format .\stereo_44_16bit.wav 运行结果为下图&#xff1a; 如图可…

一起学习生成式人工智能(一)|生成式人工智能基础与负责任的 AI

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun 微软 Reactor 为帮助广开发者&#xff0c;技术爱好者&#xff0c;更好的学习 .NET Core, C#, Python&#xff0c;数据科学&#xff0c;机器学习&#xff0c;AI&#xff0c;区块链, IoT 等技术&#xff0…

指纹芯片的工作原理及应用领域详解

指纹芯片是一种利用指纹识别技术的电子设备,可以通过扫描人体指纹的纹理特征,将其转化为数字化信息并进行存储和识别。指纹芯片广泛应用于各个领域,包括智能手机、银行和金融、门禁系统、身份验证等,因其高度准确、快速便捷的特点,得到了广大用户的青睐。 指纹芯片的原理是基于…

达索系统SOLIDWORKS 2024工程图新功能

工程图概述 设计模型不仅能比绘制直线更快&#xff1b;SOLIDWORKS 从模型中生成工程图&#xff0c;模型的参数和几何关系在工程图中被保留&#xff0c;这样工程图可反映模型的设计意图&#xff1b;模型或工程图中的更改反映在其相关文件中&#xff0c;这样更改起来更容易&…

【Docker】安装RabbitMQ

1.拉取镜像 docker pull rabbitmq 2.运行容器 docker run \-e RABBITMQ_DEFAULT_USERitcast \-e RABBITMQ_DEFAULT_PASS123321 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \-d \rabbitmq 3.安装管理页面的插件 进入容器内部 dock…

认识JVM 一个Java文件的JVM之旅

准备 我是一个java文件&#xff0c;如何实现我的功能呢&#xff1f;需要去JVM(Java Virtual Machine)这个地方旅行。 变身 我高高兴兴的来到JVM&#xff0c;想要开始JVM之旅&#xff0c;它确说&#xff1a;“现在的我还不能进去&#xff0c;需要做一次转换&#xff0c;生成c…

Jmeter测试移动接口性能 —— 压测

一般的公司都想知道自己产品的性能瓶颈和以及提升性能&#xff0c;以期大流量来了还撑得住。其实性能测试很难&#xff0c;难点在你不知道性能要达到怎样的需求。难点在于你没有实际的环境场景给你测试&#xff0c;总不能给线上环境你测试吧&#xff1f; 难点在于找性能瓶颈&a…

前端笔记:React的form表单全部置空或者某个操作框置空的做法

原创/朱季谦 在React框架前端开发中&#xff0c;经常会有弹出框的开发&#xff0c;涉及到弹出框&#xff0c;难免就会有表单。一般在关闭弹出框或者对表单联动时&#xff0c;往往都需要考虑对表单进行置空操作了。 我以前在工作就遇到过这类问题&#xff0c;正好顺便对表单置空…

数据结构-04-队列

1-队列的结构和特点 生活中我们排队买票&#xff0c;先来的先买&#xff0c;后来的人只能站末尾&#xff0c;不允许插队。先进者先出&#xff0c;这就是典型的"队列"。队列跟栈非常相似&#xff0c;支持的操作也很有限&#xff0c;最基本的操作也是两个&#xff1a;入…