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

这篇具有很好参考价值的文章主要介绍了数码管扫描显示-单片机通用模板。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、数码管扫描的原理

  • ①人的眼睛中的画面在0.02S(50Hz)左右,光源的闪烁频率高于50-60赫兹时,人眼通常无法察觉到光的闪烁;
  • ②通过控制LED的亮灭透过模具贴纸从而控制数字和图案的亮灭;

数码管扫描显示-单片机通用模板,实战~单片机通用功能模板,单片机,程序人生,学习方法文章来源地址https://www.toymoban.com/news/detail-825691.html

二、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;					//显示标志清0
	
	switch(Mode)
	{
		case 0:					//全灭显示界面
			CxSegData[0]=0x00;
			CxSegData[1]=0x00;
			CxSegData[2]=0x00;
			CxSegData[3]=0x00;
			b_Fresh_Flag=1;		//刷新显示Ram
			break;
		case 1:					//全显显示界面
			CxSegData[0]=0xff;
			CxSegData[1]=0xff;
			CxSegData[2]=0xff;
			CxSegData[3]=0xff;	
			b_Fresh_Flag=1;		//刷新显示Ram
			break;
		case 2:					//自定义界面显示1
			CxSegData[3]=Unb_Red;
			CxSegData[3]=Unb_Inf;
			CxSegData[3]=Unb_Twi;	//不显示某一个点
			b_Fresh_Flag=1;		//刷新显示Ram
			break;

		case 3:				  //自定义界面显示2
			CxSegData[3]=b_Red;
			CxSegData[3]=b_Inf;
			CxSegData[3]=b_Twi;	//显示某一个点
			b_Fresh_Flag=1;		//刷新显示Ram
			break;
		
		case 4:				 //自定义界面显示2
			LcdDisplay_8bit(LzLcdNum1,LedNumCoding[6]);
			LcdDisplay_8bit(LzLcdNum2,LedNumCoding[6]);		//数码管显示66
			b_Fresh_Flag=1;	//刷新显示Ram
			break;
		
		case 5:				//自定义界面显示3

			b_Fresh_Flag=1;	//刷新显示Ram
			break;
		case 6:				//自定义界面显示4
			
			b_Fresh_Flag=1;	//刷新显示Ram
			break;	
	}
}

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,			//A
	COM1,SEG2,			//B
	COM1,SEG3,			//C
	COM1,SEG4,			//D
	COM1,SEG5,			//E
	COM1,SEG6,			//F
	COM3,SEG1,			//G
	0xff,0xff
};

u8	code	LzLcdNum2[]={
	COM2,SEG1,			//A
	COM2,SEG2,			//B
	COM2,SEG3,			//C
	COM2,SEG4,			//D
	COM2,SEG5,			//E
	COM2,SEG6,			//F
	COM3,SEG2,			//G
	0xff,0xff
};


unsigned char code 	LedNumCoding[]={
									0x3F,                 //0	0	1	1	1	1	1	1    as 0    0
									0x06,                 //0	0	0	0	0	1	1	0    as 1    1
									0x5B,                 //0	1	0	1	1	0	1	1    as 2    2
									0x4F,                 //0	1	0	0	1	1	1	1    as 3    3
									0x66,                 //0	1	1	0	0	1	1	0    as 4    4
									0x6D,                 //0	1	1	0	1	1	0	1    as 5    5
									0x7D,                 //0	1	1	1	1	1	0	1    as 6    6
									0x07,                 //0	0	0	0	0	1	1	1    as 7    7
									0x7F,                 //0	1	1	1	1	1	1	1    as 8    8
									0x6F,                 //0	1	1	0	1	1	1	1    as 9    9
									0x00,                 //0	0	0	0	0	0	0	0    as "全灭"    10		
									0x40,		      	  //0	1	0	0	0	0	0	0    as "-"    11
 									0x76,                 //0	1	1	1	0	1	1	0    as "H"    12
									0x38,                 //0	0	1	1	1	0	0	0    as "L"    13
									0x50,                 //0	1	0	1	0	0	0	0    as "r"    14
									0x39,                 //0	0	1	1	1	0	0	1    as “C”    15
									0x37,                 //0	0	1	1	0	1	1	1    as “n”    16
									0x77,                 //0	1	1	1	0	1	1	1    as “A”    17
									0x71,                 //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所以每移一次需要加2
	for(;Com!=0xff;)
	{
		if((Value & 0x01)==1)
			CxSegData[Com]=CxSegData[Com] | Seg;
		else
			CxSegData[Com]=CxSegData[Com] & ~Seg;
		//CxSegData[Com] &= (Value & 0x01);		//优化if else
		Value=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的位置,缩短开发周期;

到了这里,关于数码管扫描显示-单片机通用模板的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机(四)静态数码管和动态数码管显示

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月09日
    浏览(37)
  • 单片机数码管显示原理

    1、数码管的基本介绍 先给大家提供一张原理图看一下,如图1所示。 图1 数码管原理图 这是比较常见的数码管的原理图,我们板子上一共有6只数码管。前边有了LED小灯的学习,数码管学习就会轻松的多了。从图1能看出来,数码管共有a,b,c,d,e,f,g,dp这8个段,而实际上,这8个段

    2024年02月07日
    浏览(30)
  • 单片机——数码管动态显示

    1.头文件和定义,代码还使用了 sbit 定义来声明了两个变量 duan 和 wei,它们实际上是 P2.6 和 P2.7 端口的别名,用于控制数码管的段选和位选信号。这种方法可以使代码更具可读性,并提高代码的可维护性。定义无符号整数便于后面应用。 2.使用一个 16 个元素的数组 table,该数

    2024年02月11日
    浏览(30)
  • 单片机数码管滚动显示学号

    单片机数码管滚动显示学号 在这篇文章中,我们将学习如何使用单片机控制数码管实现学号的滚动显示效果。通过这个项目,我们将展示如何编程控制数码管,以及如何使用循环和延时函数来创建滚动显示效果。下面是代码示例和详细说明。 硬件准备: 单片机开发板(如

    2024年02月03日
    浏览(91)
  • 51单片机数码管显示(三)

    目录 一、静态数码管显示 1、一位数码管 (1)LED数码管各段名称 (2)数码管引脚定义 (3) 共阴极(89C52RC单片机LED数码管采用共阴极方式) (4)共阳极 2、四位一体数码管 (1)四位一体数码管引脚定义 (2)上面共阴极和下面共阳极  3、数码管模块原理图详解 4、编写

    2024年02月08日
    浏览(32)
  • 51单片机静态数码管显示

    51单片机静态数码管显示 数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件。   数码管从上右下左中有ABCDEFGDP,共10个引脚,其中3、8号引脚是连接到所有二极管的阴极,A二级管对应7号和38号引脚,B二极管对应6号和38号引脚。所有阴极

    2024年02月08日
    浏览(54)
  • 51单片机入门————数码管显示

    我们在马路上看到的红绿灯,就是由数码管来实现的,就是其中可能加入了一些延时和转换 数码管是通过控制138译码器与74HC245来控制数码管的亮灭与数字的显示 我们先讨论一个数码管 数码管有共阳极和共阴极,我们现在使用的STC89C52是共阴极的,说明数码管共用阴极 上面是

    2024年02月13日
    浏览(30)
  • 单片机学习笔记---静态数码管显示

    目录 数码管是什么? 一位数码管的引脚定义 四位一体的数码管引脚定义 数码管的原理图解析 数码管怎么显示数据?(总结+代码显示) 今天开始学习数码管,它比LED和独立按键复杂一点 LED数码管是一种简单、廉价的 显示器 ,是由多个发光二极管封装在一起组成“8”字型

    2024年02月20日
    浏览(33)
  • 单片机-如何让数码管动态显示

    单片机IO口输出难稳定,需要数码管与单片机连接需要增加驱动电路, 使用 74HC245 abcdefgDP并联导出  74HC245 对数码管进行驱动,P0 是输出电流 来驱动各个段的 驱动芯片 增加电阻 是为了防止电流过大烧坏数码管 。P0输出段选的 共阴 就是所有阴极 连接 在一起,连接在公共端

    2024年02月09日
    浏览(34)
  • 51单片机控制数码管动态显示

    首先打开proteus,导入8位数码管和89c51。 然后如图连线,分清断码和位码, 断码就是一个数码管的7个LED灯。 位码:就是第几位显示,由于是共阴极,所以哪位接地就显示哪位。 下面通过改变位码的接线就可以看出不同的效果 下面就编写程序,从第1位到第8位显示从0到7的八

    2023年04月21日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包