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

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

  • 一、数码管扫描的原理
  • 二、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的位置,缩短开发周期;

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

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

相关文章

数据结构——单链表专题

目录 1. 链表的概念及结构2. 实现单链表初始化尾插头插尾删头删查找在指定位置之前插入数据在指定位置之后插入数据删除指定位之前的节点删除指定位置之后pos节点销毁链表 3. 完整代码test.cSList.h 4. 链表的分类 1. 链表的概念及结构 在顺序表中存在一定的问题: …

【论文阅读笔记】Contrastive Learning with Stronger Augmentations

Contrastive Learning with Stronger Augmentations 摘要 基于提供的摘要,该论文的核心焦点是在对比学习领域提出的一个新框架——利用强数据增强的对比学习(Contrastive Learning with Stronger Augmentations,简称CLSA)。以下…

考研高数(导数的定义)

总结: 导数的本质就是极限。 函数在某点可导就必连续,连续就有极限且等于该点的函数值。 例题1:(归结原则的条件是函数可导) 例题2: 例题3:

星宸科技SSC369G 双4K高性价比AI IPC方案

一、方案描述 SSC369G 双4K高性价比AI IPC方案采用主芯片SSC369G,内核为CA55四核最高主频为1.5Ghz处理器。SOC内置集成一个64位的四核RISC处理器,先进的图像信号处理器(ISP),高性能的H.265/H.264/MJPEG视频编解码器&a…

01.数据结构篇-链表

1.找出两个链表的交点 160. Intersection of Two Linked Lists (Easy) Leetcode / 力扣 例如以下示例中 A 和 B 两个链表相交于 c1: A: a1 → a2↘c1 → c2 → c3↗ B: b1 → b2 → b3 但是不会出现以下相交的情况,因为每个节点只有一个…

代码随想录算法训练营 DAY20 | 二叉树(7)

一、LeetCode 530 二叉搜索树的最小绝对值 题目链接:530.二叉搜索树的最小绝对值https://leetcode.cn/problems/minimum-absolute-difference-in-bst/ 思路一:利用搜索二叉树的中序遍历结果为有序数组的性质,将遍历结果保存到数组中&#xf…

扭蛋机小程序开发:发展优势

商场中精美的扭蛋机一直都是年轻人的心头好,目前,扭蛋机商品也不在局限于各种小型玩具,也逐渐与各类热门IP合作,打造出了各类手办、周边等,深受各个年龄层的喜爱。 如今,扭蛋机在互联网的推动下&#xff0…

Spring Security基础学习

一、SpringSecurity框架简介 二、SpringSecurity入门案例 三、SpringSecurity Web权限方案 四、SpringSecurity微服务权限方案 五、SpringSecurity原理总结

milvus insert api的数据结构源码分析

insert api的数据结构 一个完整的insert例子: import numpy as np from pymilvus import (connections,FieldSchema, CollectionSchema, DataType,Collection, )num_entities, dim 10, 3print("start connecting to Milvus") connections.connect("default&q…

【FastAPI】P1 安装与第一个 FastAPI 应用

目录 FastAPI 安装第一个 FastAPI 应用代码拆解分析 FastAPI 安装 FastAPI 是用于快速构建 API 的 web 框架,依赖 Python 3.8 及更高版本。使用 pip 命令安装 fastapi: pip install fastapi安装异步处理 ASGI 的服务器 Uvicorn: pip insta…

设置墙、楼板每层的厚度和材质——群问题整理003

你好,这里是BIM的乐趣,我是九哥~ 今天分享的是设置墙、楼板等每层的厚度和材质。 我们都知道,Revit中墙、板这类系统族,厚度设置和普通族是不太一样的,他的厚度参数可读,但是并不可设置,因为我…

【数据仓库】主题域和数据域

数据域与主题域区别 https://www.cnblogs.com/datadance/p/16898254.html 数据域是自下而上,以业务数据视角来划分数据,一般进行完业务系统数据调研之后就可以进行数据域的划分。针对公共明细层(DWD)进行主题划分。主题域则自上而…

LabVIEW智能监测系统

LabVIEW智能监测系统 设计与实现一个基于LabVIEW的智能监测系统,通过高效的数据采集和处理能力,提高监测精度和响应速度。系统通过集成传感器技术与虚拟仪器软件,实现对环境参数的实时监测与分析,进而优化监控过程,提…

后端开发怎么学?

后端开发怎么学? 后端开发可以简单地理解为与前端开发相对应的开发方向。前端开发主要负责构建用户界面、维护用户体验等方面的工作,而后端开发则主要负责处理数据、逻辑和算法等方面的工作。后端开发旨在为前端应用程序提供支持,以帮助实现可…

前端vue金额用逗号分隔

实现效果 代码 template部分 <el-input v-model"state.val"></el-input><div>{{ priceFor(state.val) }}</div> js部分 const state reactive({ val: });const priceFor (val)> {if(!val){return }else if(val.length<4){return…

简单介绍数据结构的基本概念

数据结构的基本概念 常用术语 数据 数据&#xff08;Data&#xff09;是客观事物的符号表示&#xff0c;是所有能输入到计算机中并被计算机程序处理的符号的总称。例如&#xff1a;整数、字符串、图形、图像、声音和动画等 数据元素 数据元素&#xff08;Data Element&…

RocketMQ(四):功能特性——备份

1 消息发送重试和流控机制 本节介绍Apache RocketMQ的消息发送重试机制和消息流控机制 1.1 消息发送重试机制 1.1.1 重试基本概念 Apache RocketMQ 客户端连接服务端发起消息发送请求时&#xff0c;可能会因为网络故障、服务异常等原因导致调用失败。为保证消息的可靠性&…

华为配置旁挂二层组网直接转发示例

配置旁挂二层组网直接转发示例 组网图形 图1 配置旁挂二层组网直接转发示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件扩展阅读 业务需求 企业用户通过WLAN接入网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff…

关于Sora的一些紧迫问题...

OpenAI Sora 概述 OpenAI最新的创新&#xff0c;Sora&#xff0c;在人工智能领域开辟了新的天地。Sora是一个文本到视频的扩散模型&#xff0c;可以将文本描述转化为逼真的视频内容。它解决了一个重大的技术挑战&#xff0c;即在视频中保持主体的一致性&#xff0c;即使它们暂…

Vue3快速上手(八) toRefs和toRef的用法

顾名思义&#xff0c;toRef 就是将其转换为ref的一种实现。详细请看&#xff1a; 一、toRef 1.1 示例 <script langts setup name"toRefsAndtoRef"> // 引入reactive,toRef import { reactive, toRef } from vue // reactive包裹的数据即为响应式对象 let p…