八位数码管动态扫描
实验工程可以在学习通上面下载
程序设计流程图
在程序启动的初期,需要对硬件有抽象的定义,这由我们的.h头文件表示,初始化硬件,实际是对一些寄存器的初始化,和上一个流水灯的init
函数差不多。然后就是主要逻辑,扫描位选,并完成端口的赋值。
原理说明
什么是段选和位选
简单说:段选信号是选择数码管的那一段灯管亮起,位选信号是选择八个数码管的哪一个。
如下图,由于这八个数码管是通用的同一个GND,也就是共地的。(一次只能一个开漏地级接给一个数码管,否则不同的二极管会冲突)因此,一次只能有一个数码管亮起,比如下图中八个数码管一次显示0-7,则只能够从左到右,D1先显示0,D1熄灭,D2再显示1,D2熄灭,…,然后轮流下去,如果速度够快,人眼看起来就像灯是一起亮着的。
段选进一步说明
位选就是第几个数码管,段选是怎么来的?
比如我们要左起第3个(01234567)数码管显示6,因此位选就是2,也就是P2 = 2,当然也可以用程序中的方法(多此一举)
P2 = weixuan[2]
然后段选要显示6根据上面的图,我们知道,显示6,需要“a, c, d, f, g, e”这些灯管亮起。所以位选信息如下
所以因此段选信息就是:
duanxuan[6] = 0b0111101 = 0x7d
所以对应P0.7-P0.0就是0x7d
类似上面的方法就可以枚举出所有的段选情况:
1 uchar duanxuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
代码说明
1 | /* 对硬件各个端口的定义的头文件,直接使用即可 */ |