✨文章内容会不断优化,如果你感兴趣的话,欢迎点藏收藏关注我哟
🧨如果文章有哪里看不懂的欢迎评论区或私信留言,我会及时回复的
⏰如果文章出现错误,欢迎指正,看到后我会马上改正
文章目录
- 一、动态显示原理
- 二、动态显示的目的
- 2.1 单片机IO口有限
- 2.2 节省IO口资源
- 2.3 节能
- 三、代码编写
一、动态显示原理
在数码管动态显示中,工作原理主要基于视觉暂留效应。视觉暂留效应是一种生理现象,当图像快速闪烁或移动时,它在我们眼睛中留下的影像会持续留存短暂的时间,这使得我们可以看到一个连续不断的图像,而不是一系列单独的闪烁或移动的图像。
数码管动态显示具体来说是这样实现的:首先,你选中其中一个数码管(通常由硬件电路如译码器完成),并且将你想要在数码管上显示的数字或字符传送到相应的段上。然后,你迅速切换(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);
}
📌数码管刷新频率指的是,所有用到的数码管刷新的频率,并不是单个数码管的刷新频率!
📌如何解决数码管“串台”,导致数码管显示不正常!
📌利用软件延时或定时器实现动态数码管显示有什么区别?
📌动态数码管显示有一个重要的细节——消影
未完待续…