蓝桥杯单片机组备赛——数码管动态显示

发布时间:2024年01月13日

?文章内容会不断优化,如果你感兴趣的话,欢迎点藏收藏关注我哟
🧨如果文章有哪里看不懂的欢迎评论区或私信留言,我会及时回复的
?如果文章出现错误,欢迎指正,看到后我会马上改正

一、动态显示原理

??在数码管动态显示中,工作原理主要基于视觉暂留效应。视觉暂留效应是一种生理现象,当图像快速闪烁或移动时,它在我们眼睛中留下的影像会持续留存短暂的时间,这使得我们可以看到一个连续不断的图像,而不是一系列单独的闪烁或移动的图像。
??数码管动态显示具体来说是这样实现的:首先,你选中其中一个数码管(通常由硬件电路如译码器完成),并且将你想要在数码管上显示的数字或字符传送到相应的段上。然后,你迅速切换(20ms左右)到下一个数码管,并将你想要显示的内容传送到这个数码管的相应段上。这个过程在所有的数码管之间快速循环,以达到同时显示在所有数码管上的效果。每个数码管的点亮时间非常短,但由于视觉暂留效应,我们看到的效果是所有的数码管都在同时显示内容。
??这种方式的优点是,尽管一次只能驱动一个数码管,但节省了大量的硬件资源。然而,缺点在于需要通过编程控制,以确保显示内容持续更新,从而创建出一种所有数码管都在持续显示的错觉。如果刷新速度过慢,我们可能会看到显示内容的闪烁。一般来说,如果刷新频率能够达到50Hz或以上,就足以避免人眼察觉到的闪烁现象。

二、动态显示的目的

2.1 单片机IO口有限

假设开发板上8个数码管都有独立的段码输入,8个数码管每个都要8个段选输入IO(a b c d e f g dp),且每一个都要有位选IO(com x),那么一共需要8*8+8=72个IO口,很明显51没有那么多IO口。如果8个数码管共用段码输入,那么只需要8+8=16个IO口,又因为段选和位选共用一个P0口,所以只需要8个IO口就能够实现段选和位选。

2.2 节省IO口资源

即使IO口够用的情况下,通常也不会采用每个数码管独立的段选信号,太浪费资源了。

2.3 节能

通过视觉暂留效应和数码管余辉效应,大脑感受不到数码管熄灭了一段时间,熄灭的这段时间就可以节省下大量的能力。

三、代码编写

动态数码管显示就是基于静态数码管显示的基础上
单个数码管显示代码

void display_SMG_Bit(unsigned char dat, unsigned pos)
{
	/*消影法2*/
	P0=0xff;
	selectHC573(7);
	selectHC573(0);
	
	P0=0x01<<(pos-1);
	selectHC573(6);
	selectHC573(0);


	P0=dat;
	selectHC573(7);
	selectHC573(0);
}

动态数码管显示代码

void display_D_SMG(int dat1)
{	
	display_SMG_Bit(dat[2],1);  // 显示第一个数码
	Delay(300);					// 延时一段时间2ms左右最佳
	
	display_SMG_Bit(dat[0],2);	// 显示第二个数码
	Delay(300);					// 延时一段时间
	
	display_SMG_Bit(dat[2],3);	// 显示第三个数码
	Delay(300);					// 延时一段时间

	display_SMG_Bit(dat[3],4);
	Delay(300);
	
	display_SMG_Bit(dat[16],5);
	Delay(300);
	
	display_SMG_Bit(dat[16],6);
	Delay(300);
	
	display_SMG_Bit(dat[dat1 / 10],7);
	Delay(300);

	display_SMG_Bit(dat[dat1 % 10],8);
	Delay(300);
}

📌数码管刷新频率指的是,所有用到的数码管刷新的频率,并不是单个数码管的刷新频率!
📌如何解决数码管“串台”,导致数码管显示不正常!
📌利用软件延时或定时器实现动态数码管显示有什么区别?
📌动态数码管显示有一个重要的细节——消影
在这里插入图片描述

未完待续…

文章来源:https://blog.csdn.net/struggle_success/article/details/135566631
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。