看郭天祥的单片机书中数码管部分,使用 P0=0xff 的方法可以消除段选数据对位选的干扰,另外使用我下面的方法可以达到同样的效果。但即便这样数码管仍有影子,这种状况是,当前数码管有下一个数码管的影子,或者当前数码管有前一个数码管的影子。
分析一下产生原因,当我们点亮一个数码管后,总要先将段选或者位选改为下一个数码管的值,而不能同时改变。当先改变段选时,那么当前数码管就会有短暂的时间显示下一个数码管的数字。当先改变位选时,下一个数码管就会有短暂的时间显示当前数码管的数字。
那么解决方法是,先将段选置0送入锁存器,改变位选的值为下一个数码管,最后再改变段选值。同理另一种方法是,先将位选赋值 0xff 即关闭所有数码管,改变段选值,最后改变位选值。
另外一种勉强可以的方法是,增加延时时间,这样正常数字显示时间就相对影子数字的短暂时间变长,看起来影子就变得暗了,但延时太长导致数码管闪烁,所以这种方法不建议,郭天祥书中的示例程序使用这种方法。
只贴出前2种方法的代码。
#include
#include
sbit we=P2^7;
sbit du=P2^6;
unsigned char code table[] = {
0x3f , 0x06 , 0x5b , 0x4f,
0x66 , 0x6d , 0x7d , 0x07,
0x7f , 0x6f , 0x77 , 0x7c,
0x39 , 0x5e , 0x79 , 0x71,
0x00};
void show();
void delayms(unsigned time);
unsigned char num[6]={0,0,14,13,0,12};
unsigned char count=0;
unsigned char nums=0;
unsigned char numm=0;
void main()
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TR0=1;
show();
}
void t0_time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
count++;
if(count%20==0)
{
count=0;
nums++;
if(nums==60)
{
nums=0;
numm++;
num[2]=numm%10;
num[3]=numm/10;
}
num[0]=nums%10;
num[1]=nums/10;
}
}
void show()
{
unsigned char i;
while(1)
for(i=0;i<6;i++)
{
P0=0;
du=1;
du=0;
P0=~(0x20>>i);
we=1;
we=0;
P0=table[num[i]];
du=1;
du=0;
delayms(1);
}
}
void delayms(unsigned time)
{
unsigned i,j;
for(i=time;i>0;i--)
for(j=110;j>0;j--)
;
}
第二种
void show()
{
unsigned char i;
while(1)
for(i=0;i<6;i++)
{
P0=0xff;
we=1;
we=0;
P0=table[num[i]];
du=1;
du=0;
P0=~(0x20>>i);
we=1;
we=0;
delayms(1);
}
}
上一篇:单片机快速开平方的算法
下一篇:单片机键盘-示例程序代码
推荐阅读最新更新时间:2024-03-16 15:31
设计资源 培训 开发板 精华推荐
- 睿瀚医疗万斌:“脑机接口+AI+机器人”是康复赛道的未来
- 希润医疗孟铭强:手功能软体机器人,让脑卒中患者重获新生
- 柔灵科技陈涵:将小型、柔性的脑机接口睡眠设备,做到千家万户
- 微灵医疗李骁健:脑机接口技术正在开启意识与AI融合的新纪元
- USB Type-C® 和 USB Power Delivery:专为扩展功率范围和电池供电型系统而设计
- 景昱医疗耿东:脑机接口DBS治疗技术已实现国产替代
- 首都医科大学王长明:针对癫痫的数字疗法已进入使用阶段
- 非常见问题解答第223期:如何在没有软启动方程的情况下测量和确定软启动时序?
- 兆易创新GD25/55全系列车规级SPI NOR Flash荣获ISO 26262 ASIL D功能安全认证证书
- 新型IsoVu™ 隔离电流探头:为电流测量带来全新维度