在点亮了LED后,我们来到了数码管。
关于数码管,我只会用数码管锁存器点亮数码管,应该还有其他方法,请大神指点。
我们来看一看清翔51板的原理图的数码管部分:
我们看到这个数码管由两部分组成,其中锁存器模块又有两个74HC573锁存器。
74HC573锁存器又是干什么的呢?
当LE输入高电平时,D端和Q端是同步的,当LE输入低电平时,Q端的状态会被锁定,那么我们就可以通过这个特性来控制数码管。
通过观察引脚,我们发现编号为U8的锁存器管理的是位选,也就是选择哪个8字形的单位量。(这里解释的不是很专业)
而编号为U9的锁存器管理的是段选,也就是控制最小单位的LED的。
通过下面的图我们就可以进行段选。
也就是说我们要第一个数码管显示1,就对P0赋值0x06(00000110)。
以此类推。
代码如下:
#include<reg51.h> sbit wela = P2^7; sbit dula = P2^6; void main() { wela = 1; P0 = 0xFE; wela = 0; dula = 1; P0 = 0x06; dula = 0; while(1); }
那么代码的第二行和第三行是什么意思呢?
让我们来观察下面的图:
我们可以发现锁存器上的LE分别是由P2.7和P2.6控制的。
下面是从0到9对应的16进制:
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
这是段选对应的数组:unsigned int code table[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,0x77,0x7c,0x39,0x5E,0x79,0x71,0x76,0x38,0x37,0x3E,0x40,0x00};
0 1 2 3 4 5 6 7 8 9 A B C D E F H L n u - 熄灭
这是位选对应的数组:unsigned int code duan[10] = {0,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
下面是函数:对应的是(段选,位选)
void digitaltube(unsigned int du,unsigned int num) { if(num == 0) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[0]; DU = 0; } if(num == 1) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[1]; DU = 0; } if(num == 2) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[2]; DU = 0; } if(num == 3) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[3]; DU = 0; } if(num == 4) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[4]; DU = 0; } if(num == 5) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[5]; DU = 0; } if(num ==6) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[6]; DU = 0; } if(num == 7) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[7]; DU = 0; } if(num == 8) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[8]; DU = 0; } if(num == 9) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[9]; DU = 0; } }