有些人会问
单片机控制一位数码管和控制多位数码管有什么不同呢?首先我们看一下
电路上的不同,电路见下图,图中为4位共阴级数码管,4位数码管的A-B-C-D-E-F-G-Dp共用了单片机P2口。看到这里,我请大家思考一下,我们要如何实现数码管显示不同的数字呢?或许会有朋友问了,为什么要共用单片机P2呢?这是因为单片机的资源有限,不可能使用这么多的IO口来做数码管显示。如果不共用P2.0,单片机的IO口开销太大。实际应用中,不可能用如此多的IO来控制数码管。
作者在第一次看到这个图的时候,感觉一脸“懵逼”,心想这这么可能实现吗?明显同一时刻只能显示一个数码管,实际也确实是这样子的,同一时刻只能让一个数码管显示数字。那么我们到底如何实现多位数码管显示呢?这里要引入“刷新频率”这个概念了,比如现在的
手机屏幕刷新频率可以做到120Hz,也就是说一秒钟手机屏幕刷新120次。一般来说当事物刷新频率超过50Hz的时候,我们人眼就感知不到事物的变化了。也就是说,在很短的时间内,只要我们让图中四位数码管显示不同的数字,便可以骗过人的眼睛,让人感觉数码管再显示不同的数字,这样我们就可以用这个电路来实现计数器了。
核心代码如下:
备注:按键每按下一次,计数变量SysDataVar.u16SegNumber增加1,增加后的数字实时显示在数码管上面。刷新频率计算:每5ms扫描一次,一共有4个数码管,所以F=1000ms/5ms/4=50Hz。
if(p
tiM_Delay(2,4))//定时2 每5ms执行一次
{
switch(SEGnumber)
{
case 0x00:
{
CloseALLSEG();
LED =SEG_ComAnodeTable[SysDataVar.u16SegNumber/1000];
OpenOneSEG(0);
}break;
case 0x01:
{
CloseALLSEG();
LED =SEG_ComAnodeTable[SysDataVar.u16SegNumber%1000/100];
OpenOneSEG(1);
}break;
case 0x02:
{
CloseALLSEG();
LED = SEG_ComAnodeTable[SysDataVar.u16SegNumber%100/10];
OpenOneSEG(2);
}break;
case 0x03:
{
CloseALLSEG();
LED = SEG_ComAnodeTable[SysDataVar.u16SegNumber%10];
OpenOneSEG(3);
}break;
}
SEGnumber++;
if(SEGnumber 》 3)
{
SEGnumber = 0x00;
}
}
看一下效果图: