当前位置: 首页 > news >正文

数码管扫描显示-单片机通用模板

数码管扫描显示-单片机通用模板

  • 一、数码管扫描的原理
  • 二、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

  1. 在主函数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进行的任务}}
/***********************************************************************************/		
}
  1. 在2~4kHz的定时器里面调用FreshDisplay() 映射到IO功能函数,频率偏低可能观察到有闪烁,可以调节PwmLevel 的大小从而调节亮度,降低功耗;
//=============================================================================
// Function:Time2中断
//=============================================================================
void TIM2_INT(void) interrupt 5  //4kHz 频率
{TF2=0;			//清理中断标志位FreshDisplay();	//刷新LED数字显示
  1. 该框架可使用于LCD、数码管、LED显示,可以通过修改映射关系进而移植到其它项目上;
  2. 数码管显示难点是如何建立映射关系?如何将IO和显示Ram建立关系?如何控制每个LED的亮灭关系?如何显示数字和字母?
  3. 需要更新屏幕显示注意b_Display_Flag是否需要更新缓存区CxSegData的数据,需要更新缓存数据到硬件IO注意b_Fresh_Flag标志;
  4. 显示功能基本战项目的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 中&#xff…...

构建本地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 是一个流行的分布式版本控制系统&#xff0c;用于跟踪文件的变化、协作开发和管理代码。以下是一些常用的 Git 命令&#xff1a; 创建和克隆仓库&#xff1a; git init&#xff1a;在当前目录初始化一个新的 Git 仓库。git clone <仓库URL>&#xff1a;克隆一个远程仓…...

《动手学深度学习(PyTorch版)》笔记8.5

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…...

【蓝桥杯单片机入门记录】LED灯(附多个例程)

目录 一、LED灯概述 1.1 LED发光原理 1.2电路原理图 1.3电路实物图 1.4 开发板LED灯原理图 1.4.1共阳极LED灯操控原理&#xff08;本开发板&#xff09; &#xff08;非实际原理图&#xff0c;便于理解版本&#xff09;由图可以看出&#xff0c;每个LED灯的左边&#xf…...

c语言简单json库

文章目录 写在前面头文件源代码使用示例 写在前面 用c语言实现的一个简单json库&#xff0c;极其轻量 仅1个四百多行源码的源文件&#xff0c;和1个头文件 支持对象、数组、数值、字符串类型 github仓库 头文件 对主要的json API的声明 #ifndef ARCOJSON_ARCOJSON_H #defin…...

Linux操作系统基础(七):Linux常见命令(二)

文章目录 Linux常见命令&#xff08;二&#xff09; 一、kill命令 二、ifconfig命令 三、clear命令 四、重启与关机命令 五、which命令 六、hostname命令 七、grep命令 八、|管道 九、useradd命令 十、userdel命令 十一、tar命令 十二、su命令 十三、ps命令 Linu…...

进程状态

广义概念&#xff1a; 从广义上来讲&#xff0c;进程分为新建、运行、阻塞、挂起、退出五个状态&#xff0c;其中新建和退出两个状态可以直接理解字面意思。 运行状态&#xff1a; 这里涉及到运行队列的概念&#xff0c;CPU在读取数据的时候&#xff0c;需要把内存中的进程放入…...

STM32固件库简介与使用指南

1. STM32官方标准固件库简介 STM32官方标准固件库是由STMicroelectronics&#xff08;ST&#xff09;提供的一套软件开发工具&#xff0c;旨在简化STM32微控制器的软件开发过程。该固件库提供了丰富的功能和模块&#xff0c;涵盖了STM32微控制器的各种外设&#xff0c;包括但不…...

【开源】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 课程评价表 四、系统展示五、核心代…...

融资项目——获取树形结构的数据

如下图所示&#xff0c;下列数据是一个树形结构数据&#xff0c;行业中包含若干子节点。表的设计如下图&#xff0c;设置了一个id为1的虚拟根节点。&#xff08;本树形结构带虚拟根节点共三层&#xff09; 实现逻辑&#xff1a; 延时展示方法&#xff0c;先展现第二层的信息&a…...

Crypto-RSA2

题目&#xff1a;&#xff08;BUUCTF在线评测 (buuoj.cn)&#xff09; 已知e,n,dp/(dq),c求明文: 首先有如下公式&#xff1a; dp ≡ d mod (p-1) &#xff0c;ed ≡ 1 mod φ(n) &#xff0c;npq &#xff0c;φ(n)(p-1)(q-1) python代码实现如下&#xff1a; import libnu…...

IEEE Internet of Things Journal投稿经验

期刊名&#xff1a;IEEE Internet of Things Journal 期刊分区&#xff1a;中科院一区 Top 影响因子&#xff1a;10.6 投稿状态 &#xff08;1&#xff09;2023.11.3&#xff0c;投稿成功&#xff0c;状态为&#xff1a;under review&#xff08;大u大r&#xff09;&#xff1…...

实例分割论文阅读之:FCN:《Fully Convolutional Networks for Semantica Segmentation》

论文地址:https://openaccess.thecvf.com/content_cvpr_2015/papers/Long_Fully_Convolutional_Networks_2015_CVPR_paper.pdf 代码链接&#xff1a;https://github.com/pytorch/vision 摘要 卷积网络是强大的视觉模型&#xff0c;可以产生特征层次结构。我们证明&#xff0c…...

apk反编译修改教程系列---简单去除apk登陆 修改vip与一些反编译基础常识【十二】

往期教程&#xff1a; 安卓玩机-----反编译apk 修改apk 去广告 去弹窗等操作中的一些常识apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...