#include<reg52.h>
#include<intrins.h> //要用到库函数,先调包
#define uchar unsigned char
#define uint unsigned int
uchar code dis_code[]={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80}; //共阳数码管段码表
void delay(uint t) //可自定义延时函数,调用时给t赋值即可
{ //延时倍率是t乘200
uchar i;
while(t--) for(i=0;i<200;i++);
}
//从左到右点亮数码管
void main()
{
uchar j=0x80; //最左位赋值1
while(1)
{ uchar i;
for(i=0;i<8;i++)
{
j=_crol_(j,1); //库函数左移
//j=_cror_(j,1); //库函数右移
P0=dis_code[i]; //P0口输出段码
P2=j; //P2口输出位码
delay(180); //数码管顺序显示
//delay(2); //数码管同时显示
//P0 = 0xff; //数码管全灭消影
}
}
}
/* //从右往左倒数
void main()
{
uchar j=0x01; //最左位开始点亮
while(1)
{ uchar i;
for(i=0;i<8;i++)
{
j=_cror_(j,1); //库函数右移
P0=dis_code[7-i]; //要注意数组索引从0开始,所以要用7-i
P2=j;
delay(180);
}
}
} */
看到这里可能有小伙伴要问了,这样来看数码管的原理和流水灯也没什么不同,怎么样才能让数字同时出现呢。这就要用到我们人眼的余晖效应了。
余晖效应,即视觉暂留现象,是当人眼所看到的影像消失后,人眼仍能继续保留其影像0.1-0.4秒左右图像的情况。原因是眼睛依靠晶状体成像,感光细胞感光,并且将光信号转换为神经电流,传回大脑引起人体视觉,而感光细胞的感光需要感光色素,感光色素的形成消耗一定时间,这就形成了视觉暂留的机理。
从效果图上可以看到,数码管的点亮速度甚至超过了计算机截屏的速度,以至于截图也呈现出视觉暂留现象。
#include <reg52.h>
unsigned char code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C};//段码,共阴极真值表
unsigned char code Col[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //位码,类似于点亮流水灯
void Delay()
{
unsigned char i;
for(i=0;i<250;i++); //第二类延时函数
}
void main()
{
unsigned char j;
while(1)
{
for(j=1;j<7;j++) //段码位码都采用数组法,要注意j初值1
{
P0=Tab[j]; //段选j,因为不显示0
P1=Col[j-1]; //位选j-1
Delay();
P1=0xff; //关位选,防止出现鬼影
//P0=0; //关掉段选也可以,给低电平,
}
}
}
这里出现了第2类延时函数,单独的一个for循环,数量级为百,即0.1ms,用前面代码中提到的自定义延时函数也可以,传入个位数参数即可。相较于前面的移位符,数组法明显没有那么复杂。效果如图所示:
“影”指的是当切换一个数码管的数字时,由于数码管刷新频率有限,液晶分子需要一定的时间来重新排列,这可能会导致前一个数码管数字的残影留在屏幕上。我们可以通过切断段选或位选的方式来消除残影。
代码如图所示
两种方法采取一种即可,但要注意是共阴极接法还是共阳极,有可能一不小心把数码管全都打开了。
数码管动态显示循环点亮和视觉暂留
以上就是本篇文章的全部内容了,感谢观看。?