利用8个数码管动态显示数字(以显示今日日期为例)
实验目的:利用8个数码管动态显示数字,我显示的是今日日期
实验接法:选取7SEG-COM-ANODE数码管组两个(共8个),位选接P2口,段选接P3口
实验现象:将代码写成函数Nixie(Location,Number),若Location=5,Number=3,则在第5个数码管显示数字3,以此类推
实验原理:将静态数码管显示的代码在while循环中复制7个,共使用8次Nixie函数Nixie(Location,Number),如2024第一位是2,那么Location=1,Number=2,以此类推写8个,数码管其实是一位一位显示的,我们可以用Delay函数在位选和段选之间设置低延迟,来给人眼造成同时显示的假象
实验注意事项:由于延迟过低,位选还没彻底结束便开始段选,故会出现数码管拖影现象,只需在位选和段选之间加一个清0和延时即可解决
实验代码:
#include<regx52.h>
unsigned char NixieTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
int Delay(unsigned int xms)
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void Nixie(unsigned char Location,Number)
{
switch(Location)
{
case 1:P2_0=0;P2_1=1;P2_2=1;P2_3=1;P2_4=1;P2_5=1;P2_6=1;P2_7=1;break;
case 2:P2_0=1;P2_1=0;P2_2=1;P2_3=1;P2_4=1;P2_5=1;P2_6=1;P2_7=1;break;
case 3:P2_0=1;P2_1=1;P2_2=0;P2_3=1;P2_4=1;P2_5=1;P2_6=1;P2_7=1;break;
case 4:P2_0=1;P2_1=1;P2_2=1;P2_3=0;P2_4=1;P2_5=1;P2_6=1;P2_7=1;break;
case 5:P2_0=1;P2_1=1;P2_2=1;P2_3=1;P2_4=0;P2_5=1;P2_6=1;P2_7=1;break;
case 6:P2_0=1;P2_1=1;P2_2=1;P2_3=1;P2_4=1;P2_5=0;P2_6=1;P2_7=1;break;
case 7:P2_0=1;P2_1=1;P2_2=1;P2_3=1;P2_4=1;P2_5=1;P2_6=0;P2_7=1;break;
case 8:P2_0=1;P2_1=1;P2_2=1;P2_3=1;P2_4=1;P2_5=1;P2_6=1;P2_7=0;break;
}
P3=NixieTable[Number]; //位选与段选函数
Delay(1);
P3=0x00; //置0消除拖影
}
int main()
{
while(1)
{
Nixie(1,2);
Delay(5);
Nixie(2,0);
Delay(5);
Nixie(3,2);
Delay(5);
Nixie(4,4);
Delay(5);
Nixie(5,0);
Delay(5);
Nixie(6,4);
Delay(5);
Nixie(7,0);
Delay(5);
Nixie(8,3);
Delay(5);
}
return 0;
}