51单片机数码管动态显示的过程中,怎么实现让最后一个闪烁,其他的不受影响?

2024-11-20 18:47:00
推荐回答(1个)
回答1:

闪烁原理,别的数码管都是反复刷新,需要闪烁的那一位则刷新几十次后再有几十次不显示
下例是20次亮 20次灭
uchar modtable[6][4]={ {0,0,0,0},{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1},{1,1,1,1} };
//有1的那一位数码管不亮 {0,0,0,0}不闪烁 {1,1,1,1} 4位全闪烁
uchar ia;

uchar bai,shi,ge;
uchar flag=0;
uint a=0;
//共阴数码管七段码,转成共阳的需取反,程序中已这样做了

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};
void Delay1ms(uint i) //1ms延时程序
{
uchar j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void display(uint m,uchar mode )//4位显示子程序 带某位闪烁功能
//mode=0,都不闪烁 mode=1 千位闪烁 mode=2 百位闪烁 mode=3 十位闪烁 mode=4 个位闪烁

//mode=5 全部闪烁
{
uchar a1,a2,a3,a4;
uchar modeaa;
a1=m/1000;
a2=m/100%10;
a3=m/10%10;
a4=m%10;

if(ia<20)
{
modeaa=mode;//可闪烁也可不闪烁,闪烁位有20次不亮
}
else
{
modeaa=0;//正常显示
}

dataport=~(table[a1]);
sm1=modtable[modeaa][0]; Delay1ms(2);sm1=1;

dataport=~(table[a2]);
sm2=modtable[modeaa][1]; Delay1ms(2);sm2=1;

dataport=~(table[a3]);
sm3=modtable[modeaa][2]; Delay1ms(2);sm3=1;

dataport=~(table[a4]);
sm4=modtable[modeaa][3]; Delay1ms(2);sm4=1;
ia++;

if(ia==40) ia=0;//40次一轮

}