数码管扫描显示-单片机通用模板
数码管扫描显示-单片机通用模板
- 一、数码管扫描的原理
- 二、display.c的实现
- 1、void Display(void) 各模式界面定义数据
- 2、void BackupRamToDisRam(void)从缓存区刷新显示映射Ram
- 3、void FreshDisplay(void) 映射显示Ram到主控的IO口
- 4、void LcdDisplay_8bit(void) 映射显示Ram到主控的IO口
- 三、display.h的外部接口
- 四、显示功能的使用、Note
一、数码管扫描的原理
- ①人的眼睛中的画面在0.02S(50Hz)左右,光源的闪烁频率高于50-60赫兹时,人眼通常无法察觉到光的闪烁;
- ②通过控制LED的亮灭透过模具贴纸从而控制数字和图案的亮灭;

二、display.c的实现
1、void Display(void) 各模式界面定义数据
u8 CxSegData[]={0,0,0,0}; //显示Ram缓存区
//=============================================================================
//函数名称:Display
//输 入:无
//输 出:无
//功 能:界面菜单显示
//=============================================================================
void Display(void)
{ if(b_Display_Flag== 0) return; //更新显示b_Display_Flag=0; //显示标志清0switch(Mode){case 0: //全灭显示界面CxSegData[0]=0x00;CxSegData[1]=0x00;CxSegData[2]=0x00;CxSegData[3]=0x00;b_Fresh_Flag=1; //刷新显示Rambreak;case 1: //全显显示界面CxSegData[0]=0xff;CxSegData[1]=0xff;CxSegData[2]=0xff;CxSegData[3]=0xff; b_Fresh_Flag=1; //刷新显示Rambreak;case 2: //自定义界面显示1CxSegData[3]=Unb_Red;CxSegData[3]=Unb_Inf;CxSegData[3]=Unb_Twi; //不显示某一个点b_Fresh_Flag=1; //刷新显示Rambreak;case 3: //自定义界面显示2CxSegData[3]=b_Red;CxSegData[3]=b_Inf;CxSegData[3]=b_Twi; //显示某一个点b_Fresh_Flag=1; //刷新显示Rambreak;case 4: //自定义界面显示2LcdDisplay_8bit(LzLcdNum1,LedNumCoding[6]);LcdDisplay_8bit(LzLcdNum2,LedNumCoding[6]); //数码管显示66b_Fresh_Flag=1; //刷新显示Rambreak;case 5: //自定义界面显示3b_Fresh_Flag=1; //刷新显示Rambreak;case 6: //自定义界面显示4b_Fresh_Flag=1; //刷新显示Rambreak; }
}
2、void BackupRamToDisRam(void)从缓存区刷新显示映射Ram
u8 CxSeg[]={0,0,0,0}; //显示Ram
//=============================================================================
//函数名称:BackupRamToDisRam
//输 入:无
//输 出:无
//功 能:更新显示RAM
//=============================================================================
void BackupRamToDisRam(void)
{if(b_Fresh_Flag){b_Fresh_Flag=0;CxSeg[0]= CxSegData[0];CxSeg[1]= CxSegData[1];CxSeg[2]= CxSegData[2];CxSeg[3]= CxSegData[3];}
}
3、void FreshDisplay(void) 映射显示Ram到主控的IO口
sbit b_Com1 = P3^4; //C_0
sbit b_Com2 = P3^5; //C_1
sbit b_Com3 = P3^6; //C_2
sbit b_Com4 = P3^7; //C_3 COM口定义sbit b_Seg1 = P1^4; //S1
sbit b_Seg2 = P1^2; //S2
sbit b_Seg3 = P1^1; //S3
sbit b_Seg4 = P1^0; //S4
sbit b_Seg5 = P0^3; //S5
sbit b_Seg6 = P0^2; //S6 SEG口定义
//=============================================================================
//函数名称:FreshDisplay
//输 入:无
//输 出:无
//功 能:LED全部刷新显示
//=============================================================================
void FreshDisplay(void)
{static u8 disIndex=0;P3 |=0xf0; //关闭所有屏幕显示if(disIndex==PwmLevel) //PwmLevel= 5 100%亮度 =10 1/2亮度 =15 1/3亮度 =20 1/4亮度disIndex=0; //20分频亮度disIndex++;b_Seg1 = CxSeg[0]&0x01;b_Seg2 = CxSeg[0]&0x02;b_Seg3 = CxSeg[0]&0x04;b_Seg4 = CxSeg[0]&0x08;b_Seg5 = CxSeg[0]&0x10;b_Seg6 = CxSeg[0]&0x20;switch(disIndex){case 1:b_Com1 = 0; //刷新第一个Com显示break;case 2:b_Com2 = 0; //刷新第二个Com显示break;case 3:b_Com3 = 0; //刷新第三个Com显示break;case 4:b_Com4 = 0; //刷新第四个Com显示break;}
}
4、void LcdDisplay_8bit(void) 映射显示Ram到主控的IO口
#define b_Red CxSegData[3]|0x01
#define b_Inf CxSegData[3]|0x02
#define b_Twi CxSegData[3]|0x04
#define b_P1 CxSegData[2]|0x04
#define b_P2 CxSegData[2]|0x08
#define b_P3 CxSegData[2]|0x10
#define b_P4 CxSegData[2]|0x20 //对应一个点图案显示#define Unb_Red CxSegData[3]&~0x01
#define Unb_Inf CxSegData[3]&~0x02
#define Unb_Twi CxSegData[3]&~0x04
#define Unb_P1 CxSegData[2]&~0x04
#define Unb_P2 CxSegData[2]&~0x08
#define Unb_P3 CxSegData[2]&~0x10
#define Unb_P4 CxSegData[2]&~0x20 //对应一个点图案不显示u8 code LzLcdNum1[]={COM1,SEG1, //ACOM1,SEG2, //BCOM1,SEG3, //CCOM1,SEG4, //DCOM1,SEG5, //ECOM1,SEG6, //FCOM3,SEG1, //G0xff,0xff
};u8 code LzLcdNum2[]={COM2,SEG1, //ACOM2,SEG2, //BCOM2,SEG3, //CCOM2,SEG4, //DCOM2,SEG5, //ECOM2,SEG6, //FCOM3,SEG2, //G0xff,0xff
};unsigned char code LedNumCoding[]={0x3F, //0 0 1 1 1 1 1 1 as 0 00x06, //0 0 0 0 0 1 1 0 as 1 10x5B, //0 1 0 1 1 0 1 1 as 2 20x4F, //0 1 0 0 1 1 1 1 as 3 30x66, //0 1 1 0 0 1 1 0 as 4 40x6D, //0 1 1 0 1 1 0 1 as 5 50x7D, //0 1 1 1 1 1 0 1 as 6 60x07, //0 0 0 0 0 1 1 1 as 7 70x7F, //0 1 1 1 1 1 1 1 as 8 80x6F, //0 1 1 0 1 1 1 1 as 9 90x00, //0 0 0 0 0 0 0 0 as "全灭" 10 0x40, //0 1 0 0 0 0 0 0 as "-" 110x76, //0 1 1 1 0 1 1 0 as "H" 120x38, //0 0 1 1 1 0 0 0 as "L" 130x50, //0 1 0 1 0 0 0 0 as "r" 140x39, //0 0 1 1 1 0 0 1 as “C” 150x37, //0 0 1 1 0 1 1 1 as “n” 160x77, //0 1 1 1 0 1 1 1 as “A” 170x71, //0 1 1 1 0 0 0 1 as “F” 18 0x7F}; //0 1 1 1 1 1 1 1 as 全显 //=============================================================================
//函数名称:LcdDisplay_8bit
//输 入:无
//输 出:无
//功 能:LED按位显示数据到CxSegData缓存区
//=============================================================================
void LcdDisplay_8bit(u8 *Table_Seg,u8 Value)
{u8 i=0,j=0;u8 Seg,Com;Com=Table_Seg[i]; Seg=Table_Seg[i+1];i+=2; //表的内容为一个seg一个com所以每移一次需要加2for(;Com!=0xff;){if((Value & 0x01)==1)CxSegData[Com]=CxSegData[Com] | Seg;elseCxSegData[Com]=CxSegData[Com] & ~Seg;//CxSegData[Com] &= (Value & 0x01); //优化if elseValue=Value>>1;Com=Table_Seg[i];Seg=Table_Seg[i+1];i+=2;}
}
三、display.h的外部接口
extern bit b_Display_Flag; //更新显示
extern void Display(void); //各个界面模式显示
extern void BackupRamToDisRam(void);//更新缓冲区数据到映射Ram
extern void FreshDisplay(void); //显示Ram映射到硬件IO
四、显示功能的使用、Note
- 在主函数main的while循环里调用,等标志更新显示
void main(void)
{//_nop_(); //自定义初始化和上电功能
/**************************************************************************************************/while(1){Display(); //显示数据更新BackupRamToDisRam();//更新显示Ram数据if(b_16Hz_Flag){F_16HzTask(); //以频率16Hz进行的任务}if(b_2Hz_Flag){F_2HzTask(); //以频率2Hz进行的任务}}
/***********************************************************************************/
}
- 在2~4kHz的定时器里面调用FreshDisplay() 映射到IO功能函数,频率偏低可能观察到有闪烁,可以调节PwmLevel 的大小从而调节亮度,降低功耗;
//=============================================================================
// Function:Time2中断
//=============================================================================
void TIM2_INT(void) interrupt 5 //4kHz 频率
{TF2=0; //清理中断标志位FreshDisplay(); //刷新LED数字显示
- 该框架可使用于LCD、数码管、LED显示,可以通过修改映射关系进而移植到其它项目上;
- 数码管显示难点是如何建立映射关系?如何将IO和显示Ram建立关系?如何控制每个LED的亮灭关系?如何显示数字和字母?
- 需要更新屏幕显示注意b_Display_Flag是否需要更新缓存区CxSegData的数据,需要更新缓存数据到硬件IO注意b_Fresh_Flag标志;
- 显示功能基本战项目的50%的代码量,模块化功能程序可以很好定位Bug的位置,缩短开发周期;
相关文章:
数码管扫描显示-单片机通用模板
数码管扫描显示-单片机通用模板 一、数码管扫描的原理二、display.c的实现1、void Display(void) 各模式界面定义数据2、void BackupRamToDisRam(void)从缓存区刷新显示映射Ram3、void FreshDisplay(void) 映射显示Ram到主控的IO口4、void LcdDisplay_8bit(void) 映射显示Ram到…...
IDEA中的神仙插件——Smart Input (自动切换输入法)
IDEA中的神仙插件——Smart Input (自动切换输入法) 设置 更多功能详见官方文档:Windows版SmartInput使用入门...
shell编程:求稀疏数组中元素的和(下标不连续)
#!/bin/basharr([2]3 [5]2 [6]2 [9]1)for i in "${!arr[]}" dosum$((sumarr[i])) doneecho $sumBash 脚本中,* 和 符号在数组上下文中有不同的用途。当使用它们来遍历数组时,必须了解它们之间的区别。 * (无前置感叹号 !): 在索引…...
Rust 学习笔记 - 详解数据类型
前言 任何一门编程语言几乎都脱离不了:变量、基本类型、函数、注释、循环、条件判断,这是一门编程语言的语法基础,只有当掌握这些基础语法及概念才能更好的学习 Rust。 标量类型(Scalar Types) 在 Rust 中ÿ…...
构建本地yum源
下载repo数据文件 根据需要修改下载路径和reposync参数 #!/bin/bashlocal_path/repo/remote/rhel9 enabled_repos$(yum repolist enabled | awk NR>3{print $1}) tempfile$(mktemp -t reposync.XXXX)check() {echo "目标目录剩余空间: $(df -h ${local_path} | awk …...
常用的正则表达式,收藏必备!!!
正则表达式是一种强大的文本模式匹配工具,用于在字符串中查找、替换和验证特定模式的文本。下面是一些常用的正则表达式示例: 匹配Email地址: ^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$匹配URL: ^(https?|ftp)://[^\s/$.?#…...
js---webAPI
01 声明变量 js组成: DOM:操作网页内容的,开发页面内容特效和实现用户交互 BOM: DOM树:将 HTML 文档以树状结构直观的表现出来,我们称之为文档树或 DOM 树 文档树直观的体现了标签与标签之间的关系 CSS获取元素的方法 document.querySele…...
git的常用命令有哪些?
Git 是一个流行的分布式版本控制系统,用于跟踪文件的变化、协作开发和管理代码。以下是一些常用的 Git 命令: 创建和克隆仓库: git init:在当前目录初始化一个新的 Git 仓库。git clone <仓库URL>:克隆一个远程仓…...
《动手学深度学习(PyTorch版)》笔记8.5
注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过&…...
【蓝桥杯单片机入门记录】LED灯(附多个例程)
目录 一、LED灯概述 1.1 LED发光原理 1.2电路原理图 1.3电路实物图 1.4 开发板LED灯原理图 1.4.1共阳极LED灯操控原理(本开发板) (非实际原理图,便于理解版本)由图可以看出,每个LED灯的左边…...
c语言简单json库
文章目录 写在前面头文件源代码使用示例 写在前面 用c语言实现的一个简单json库,极其轻量 仅1个四百多行源码的源文件,和1个头文件 支持对象、数组、数值、字符串类型 github仓库 头文件 对主要的json API的声明 #ifndef ARCOJSON_ARCOJSON_H #defin…...
Linux操作系统基础(七):Linux常见命令(二)
文章目录 Linux常见命令(二) 一、kill命令 二、ifconfig命令 三、clear命令 四、重启与关机命令 五、which命令 六、hostname命令 七、grep命令 八、|管道 九、useradd命令 十、userdel命令 十一、tar命令 十二、su命令 十三、ps命令 Linu…...
进程状态
广义概念: 从广义上来讲,进程分为新建、运行、阻塞、挂起、退出五个状态,其中新建和退出两个状态可以直接理解字面意思。 运行状态: 这里涉及到运行队列的概念,CPU在读取数据的时候,需要把内存中的进程放入…...
STM32固件库简介与使用指南
1. STM32官方标准固件库简介 STM32官方标准固件库是由STMicroelectronics(ST)提供的一套软件开发工具,旨在简化STM32微控制器的软件开发过程。该固件库提供了丰富的功能和模块,涵盖了STM32微控制器的各种外设,包括但不…...
【开源】SpringBoot框架开发智能教学资源库系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 课程档案表3.2.2 课程资源表3.2.3 课程作业表3.2.4 课程评价表 四、系统展示五、核心代…...
融资项目——获取树形结构的数据
如下图所示,下列数据是一个树形结构数据,行业中包含若干子节点。表的设计如下图,设置了一个id为1的虚拟根节点。(本树形结构带虚拟根节点共三层) 实现逻辑: 延时展示方法,先展现第二层的信息&a…...
Crypto-RSA2
题目:(BUUCTF在线评测 (buuoj.cn)) 已知e,n,dp/(dq),c求明文: 首先有如下公式: dp ≡ d mod (p-1) ,ed ≡ 1 mod φ(n) ,npq ,φ(n)(p-1)(q-1) python代码实现如下: import libnu…...
IEEE Internet of Things Journal投稿经验
期刊名:IEEE Internet of Things Journal 期刊分区:中科院一区 Top 影响因子:10.6 投稿状态 (1)2023.11.3,投稿成功,状态为:under review(大u大r)࿱…...
实例分割论文阅读之:FCN:《Fully Convolutional Networks for Semantica Segmentation》
论文地址:https://openaccess.thecvf.com/content_cvpr_2015/papers/Long_Fully_Convolutional_Networks_2015_CVPR_paper.pdf 代码链接:https://github.com/pytorch/vision 摘要 卷积网络是强大的视觉模型,可以产生特征层次结构。我们证明,…...
apk反编译修改教程系列---简单去除apk登陆 修改vip与一些反编译基础常识【十二】
往期教程: 安卓玩机-----反编译apk 修改apk 去广告 去弹窗等操作中的一些常识apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中…...
杰理701N可视化SDK:从stream.bin生成到工程导入的EQ调音闭环
1. 杰理701N可视化SDK与EQ调音基础 第一次接触杰理701N的开发者可能会好奇,这个可视化SDK到底能做什么?简单来说,它就像给声学工程师配了一把"声音雕刻刀"。通过图形化界面,你可以实时调整蓝牙耳机、音箱等设备的音效表…...
【技术解析】基于主成分分析与神经网络的航空安全风险建模:从QAR数据预处理到实时预警仿真
1. 航空安全风险建模的技术背景 每次坐飞机时,你可能都好奇过:机长是如何确保飞行安全的?其实背后有一整套数据驱动的安全体系在支撑。QAR(快速存取记录器)就像飞机的"黑匣子",记录了上百项飞行参…...
怎么判断一家工厂还在不在正常生产?6 类活跃度信号,从纸面到现场
跑工厂的销售员都遇到过这种事:手机里存着一份名单,导航开两小时,到门口才发现卷帘门焊死、车间长草、保安说"厂子去年就搬了"。 问题出在哪?大多数人判断"这家工厂在不在",靠的是工商登记——执照…...
终极指南:如何使用League-Toolkit英雄联盟工具箱快速提升游戏效率
终极指南:如何使用League-Toolkit英雄联盟工具箱快速提升游戏效率 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟中…...
AI智能体GUI交互实战:从原理到实现,让AI玩转桌面应用
1. 项目概述:一个能“玩”游戏的AI智能体最近在AI智能体(Agent)的圈子里,一个名为“ChattyPlay-Agent”的开源项目引起了我的注意。乍一看名字,你可能会觉得它又是一个基于大语言模型(LLM)的聊天…...
自建轻量级Docker镜像中心:聚合管理与加速部署实践
1. 项目概述:一个面向容器化开发者的中心化镜像仓库最近在和一些做容器化开发的朋友交流时,大家普遍提到一个痛点:随着团队项目增多,Docker镜像的管理变得越来越零散。有的镜像放在Docker Hub,有的放在阿里云镜像服务&…...
创业团队如何利用Taotoken以更低成本快速验证AI产品创意
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 创业团队如何利用Taotoken以更低成本快速验证AI产品创意 对于资源有限的创业团队而言,在产品原型阶段验证AI创意的可行…...
Logseq Full House Templates 终极指南:如何用智能模板提升知识管理效率
Logseq Full House Templates 终极指南:如何用智能模板提升知识管理效率 【免费下载链接】logseq13-full-house-plugin Logseq Templates you will really love ❤️ 🏛️ 项目地址: https://gitcode.com/gh_mirrors/lo/logseq13-full-house-plugin …...
从零实现神经网络:前向传播、反向传播与梯度下降原理详解
1. 项目概述:从“黑箱”到“白箱”的探索之旅“人工神经网络”这个词,听起来总带着点科幻和神秘色彩,仿佛一个能自己思考的“黑箱”。很多刚接触的朋友,包括几年前的我,都曾被它吓住——又是矩阵运算,又是梯…...
MEMS传感器机械臂姿态检测【附代码】
✨ 长期致力于MEMS传感器、机械臂、惯性测量单元、数据融合、姿态检测系统研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)设计基于ICM20948的惯性测量…...
