数码管的8个段,我们直接当成8个 LED 小灯来控制,那就是 a、b、c、d、e、f、g、dp 一共8个 LED 小灯。
我们通过图5-3可以看出,如果点亮 b 和 c 这两个 LED 小灯,也就是数码管的 b 段和 c 段,其他的所有的段都熄灭的话,就可以让数码管显示出一个数字1,那么这个时候实际上 P0 的值就是 0b11111001,十六进制就是 0xF9。那么我们写一个程序进去,来看一看数码管显示的效果。
#include <reg52.h> sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; void main(){ ENLED = 0; //使能 U3,选择数码管 DS1 ADDR3 = 1; ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; P0 = 0xF9; //点亮数码管段 b 和 c while (1); }
大家把这个程序编译一下,并下载到单片机中,就可以看到程序运行的结果是在最右侧的数码管上显示了一个数字1。
用同样的方法,我们可以把其他的数字字符都在数码管上显示出来,而数码管显示的数字字符对应给 P0 的赋值,我们叫做数码管的真值表。我们来列一下我们这个电路图的数码管真值表,注意,这个真值表里显示的数字都不带小数点的,如表5-7。
表5-7 数码管真值表
字符 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
数值 | 0xC0 | 0xF9 | 0xA4 | 0xB0 | 0x99 | 0x92 | 0x82 | 0xF8 |
字符 | 8 | 9 | A | B | C | D | E | F |
数值 | 0x80 | 0x90 | 0x88 | 0x83 | 0xC6 | 0xA1 | 0x86 | 0x8E |
大家可以把上边那个用数码管显示数字1程序中的 P0 的赋值随便修改成表5-7真值表中的数值,看看显示的数字的效果。