实现动态数码管显示,就是不同的切换静态数码管就行了。但是这里存在问题,如果让数码管连续显示数字,那么就会出现残影,为了解决残影可以让数码管显示之后短时间清空,但是这样做又会导致数字显示变暗。
完整代码
c
#include <mcs51/8051.h>
// 共阴极数码管段码表:0~9
// 每位对应 a~g 段,1 表示该段亮
unsigned char NixieTable[] = {
0x3F, // 0: 0011 1111
0x06, // 1: 0000 0110
0x5B, // 2: 0101 1011
0x4F, // 3: 0100 1111
0x66, // 4: 0110 0110
0x6D, // 5: 0110 1101
0x7D, // 6: 0111 1101
0x07, // 7: 0000 0111
0x7F, // 8: 0111 1111
0x6F // 9: 0110 1111
};
// 延迟xms毫秒
void DelayXms(unsigned int xms)
{
unsigned char i, j;
if(xms == 0) return;
do {
i = 2;
j = 239;
do {
while (--j);
} while (--i);
} while (--xms);
}
// 数码管显示函数
// location:第几个数码管(1~8)
// Number:要显示的数字(0~9)
void Nixie(unsigned char location, unsigned char Number)
{
// 74HC138 译码器:通过 P2.4/P2.3/P2.0 选择第几个数码管
switch(location)
{
case 1: P2_4=1; P2_3=1; P2_2=1; break; // 111 → Y0
case 2: P2_4=1; P2_3=1; P2_2=0; break; // 110 → Y1
case 3: P2_4=1; P2_3=0; P2_2=1; break; // 101 → Y2
case 4: P2_4=1; P2_3=0; P2_2=0; break; // 100 → Y3
case 5: P2_4=0; P2_3=1; P2_2=1; break; // 011 → Y4
case 6: P2_4=0; P2_3=1; P2_2=0; break; // 010 → Y5
case 7: P2_4=0; P2_3=0; P2_2=1; break; // 001 → Y6
case 8: P2_4=0; P2_3=0; P2_2=0; break; // 000 → Y7
}
// 输出段码,点亮对应数字
P0 = NixieTable[Number];
// 保持显示(这个时间决定了亮度,2~3ms比较合适)
DelayXms(3);
// 消影(防止切换时串码,出现"伪8")
P0 = 0x00;
}
void main(void)
{
while(1) {
Nixie(1, 2);
Nixie(2, 4);
Nixie(4, 8);
}
}
显示效果

不消影效果


不延时效果

