
单片机做数码管的动态显示,消影消不掉,怎么回事?求指教!
#include<reg52.h> // 供参考
#define uchar unsigned char
#define uint unsigned int
uchar code table[18]={
0x3F,//"0"
0x06,//"1"
0x5B,//"2"
0x4F,//"3"
0x66,//"4"
0x6D,//"5"
0x7D,//"6"
0x07,//"7"
0x7F,//"8"
0x6F,//"9"
0x77,//"A"
0x7C,//"B"
0x39,//"C"
0x5E,//"D"
0x79,//"E"
0x71,//"F"
0x40, //"-"
0x00 //"空"
};
uchar num,miao,miaoge,miaoshi,feng,fengge,fengshi,shi,shishi,shige;
sbit second=P3^3;
sbit minuate=P3^4;
sbit hour=P3^5;
/***延时***/
void delay(uint x) //延时Xms 晶振频率12Mhz
{ uint i,j;
for(i=x;i>0;i--)
for(j=120;j>0;j--);
}
/***中断初始化***/
void start() //初始化函数
{
TMOD=0x01; //设置定时器0的工作方式1(0000 0001)
TH0=(65536-50000)/256; //装初值50ms一次中断
TH0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
/***显示函数***/
void display()
{
P0=0x7f; // 秒个位显示
P2=table[miaoge];
delay(5);
P0=0xbf; //分个位显示
P2=table[miaoshi];
delay(5);
P0=0xdf; //间隔符号
P2=table[16];
delay(5);
P0=0xef; // 分个位显示
P2=table[fengge];
delay(5);
P0=0xf7; // 分十位显示
P2=table[fengshi];
delay(5);
P0=0xfb; //间隔符号
P2=table[16];
delay(5);
P0=0xfd; //时个位显示
P2=table[shige];
delay(5);
P0=0xfe; //时十位显示
P2=table[shishi];
delay(5);
}
/***设置时间***/
TimeUpDown()
{
//秒设置
if(second==0)
{
delay(5); //消除抖动
if(second==0)
{
miao++;
if(miao==60) //上限越界显示为0
miao=0;
while(second==0);
}
}
if(minuate==0) //分设置
{
delay(5); //消除抖动
if(minuate==0)
{
feng++;
if(feng==60) //上限越界显示为0
feng=0;
while(minuate==0);
}
}
if(hour==0) //时设置
{
delay(5); //消除抖动
if(hour==0)
{
shi++;
if(shi==24) //上限越界显示为0
shi=0;
while(hour==0);
}
}
}
/***主函数***/
void main()
{
start();
while(1)
{
display();
TimeUpDown();
}
}
/***T0***/
void T0_time() interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
num++;
if(num==20)
{
num=0;
miao++;
}
if(miao==60)
{
miao=0;
feng++;
}
if(feng==60)
{
feng=0;
shi++;
}
if(shi==24)
{
shi=0;
}
shige=shi%10;
shishi=shi/10;
fengge=feng%10;
fengshi=feng/10;
miaoge=miao%10;
miaoshi=miao/10;
}

2024-12-20 广告
2、因输出段码和位码的时间差过长了,调整一下程序,尽量做到输出段码和输出位码的两条指令紧跟着,中间不要加其他指令。也可以在输出新的段码之前,输出位码断开所有的显示,然后再输出新的段码,紧跟着再输出对应的位码。
1. 请先消除原有显示
2. 设定新的显示内容
如果有问题,就调整1.的时间,或是扫瞄频率
第一个管子完了,我关闭位选,再扫描的第二个管子,但是还是看看数码管不该亮的段有微微余晖
不太懂你说关闭位选。
还在选择第一个管的时候,就要进行清除动作。
这是硬体特性的问题,不是逻辑或控制问题。
参考资料: 自己
参考资料: 自己