一、动态显示的原理
在数码管的静态显示的基础上我们要是想实现动态是非常容易的。 单片机为了节省控制数码管的IO口资源,往往是多个数码管的数据位都是相同的,这就产生了一个问题,我们每次都只能点亮一个数码管,或者是所有的数码管都显示相同的内容,无法实现不同数码管显示不同内容的效果,但真的无法实现吗?
好在我们人眼识别视觉的变化有一定的限制,当这个变化小于0.2s时人类就察觉不了,我们就利用人类视觉的这个特点来实现动态显示。 数码管:只要我够快,你就不知道我黑了,我又亮了!
二、代码
1.显示 2021–11
这部分代码和上一节及其相似,就不再讲解,大家一看就懂了。 延时的时间我们可以通过调试来设定最佳的延时时间就可以了,大家也可以了解一下单片机内部的时钟资源,通过计算写出较为准确的延时函数。
```c
#include "reg52.h"
unsigned char code SMG_duanma[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
void InitHC138(unsigned char n)
{
switch(n)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;
break;
}
}
void DelaySMG(unsigned int t)
{
while(t--);
}
void DisplaySMG_Bit(unsigned char dat, unsigned pos)
{
InitHC138(6);
P0 = 0x01 << pos;
InitHC138(7);
P0 = dat;
}
void Display_dynamic(){
DisplaySMG_Bit(SMG_duanma[2],0);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[0],1);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[2],2);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[0],3);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[16],4);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[16],5);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[1],6);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[6],7);
DelaySMG(500);
}
void delay(unsigned char t )
{
while(t--){
Display_dynamic();
}
}
void system_init(){
InitHC138(5);
P0=0x00;
InitHC138(4);
P0=0xff;
}
void main()
{ system_init ();
while(1)
{
Display_dynamic();
}
}
|