效果图
一、BUG说明
函数void display()中Nixie(2,b) 开始,位选2–6出现乱序,按照乱选的逻辑,修改完后,
在普中v5.5开发板实际显示正常 但是代码处逻辑错误,鄙人fish一枚,跪求各路大神帮忙!
二、原理图
COM口与74h138译码器短接 ,这里注意数码管阳极与74hc245连接顺序
三、代码
1.计数函数
void time() //从最内层while循环开始看 即while(k<10)
{
unsigned char a,b,c,i,j,k;
unsigned char t=0;
while(a<3)
{
b=0;
while(b<10)
{ c=0;
while(c<6)
{ i=0;
while(i<10)
{
j=0;
while(j<6) // 循环6次跳出,然后k++,将k重新置0,以此类推,以达到类时钟的目的
{
k=0;
while(k<10) // 循环9次跳出,然后j++
{
display(a,b,c,i,j,k);
k++;
}
j++;
}
i++;
}
c++;
}
b++;
}
a++;
}
}
1.源码
/************************************************************/
/* @Writen by NEW fish XYJ and WZH 22/5/14 */
/************************************************************/
#include <REGX52.H>
unsigned char NUM[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};
void Delay1(unsigned int xms)
{
unsigned char i,j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void Nixie(unsigned char Location,Number) //位选函数
{
switch(Location)
{
case 8:P2_4=1;P2_3=1;P2_2=1;break;
case 7:P2_4=1;P2_3=1;P2_2=0;break;
case 6:P2_4=1;P2_3=0;P2_2=1;break;
case 5:P2_4=1;P2_3=0;P2_2=0;break;
case 4:P2_4=0;P2_3=1;P2_2=1;break;
case 3:P2_4=0;P2_3=1;P2_2=0;break;
case 2:P2_4=0;P2_3=0;P2_2=1;break;
case 1:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NUM[Number]; //显示数字 段选
Delay1(1);
P0=0x00; //消影
}
void display(unsigned char a,b,c,i,j,k) //显示函数
{
unsigned char x=230;
while(x--)
{
Nixie(1,a);
Nixie(2,b);
Nixie(3,i);
Nixie(4,10);
Nixie(5,10);
Nixie(6,c);
Nixie(7,j);
Nixie(8,k);
}
}
void time()
{
unsigned char a,b,c,i,j,k;
unsigned char t=0;
while(a<3) //3
{
b=0;
while(b<10) //10
{ c=0;
while(c<6) //6
{ i=0;
while(i<10) //10
{
j=0;
while(j<6) //6
{
k=0;
while(k<10) // 10
{
display(a,b,c,i,j,k);
k++;
}
j++;
}
i++;
}
c++;
}
b++;
}
a++;
}
}
void main()
{
unsigned char t=0;
for(t=0;t<10;t++) //循环9次,完成24小时计数一次后,使用静态数码管记录一次,最高九次
{
P1=~(NUM[t]);
time();
t++;
}
}
总结
本人目前fish一枚,不过正在学习中,整体代码逻辑很简单,水平定位初级。