单片机定时器控制七段数码管会闪烁问题,主要代码如下
[code=C/C++][void main()
{
unsigned char m, j;
TMOD=0x01; //定时器0工作模式1
TH0=0x4b;
TL0=0x6a;
TR0=1;
IE=0x8a;
P1=0x7f; // P1=0xff, 所有按键拉高
P3=0x4f;
for (m=7;m>=0;m--)
{
key();
P2=dis[m];
if(BoolHC)
{
displayone(m);
}
else
{
displaytwo(m);
}
for (j=255;j>0;j--); //消除视觉暂留
if (m==0) m=8;
}
}
void Timer0( void ) interrupt 1 //定时器0中断处理函数
{
//TF0=0; //溢出标记
TR0=0;
TH0=0x3c;
TL0=0xb0; //装载初值
TR0=1; //开始计数
i++;
if(i==20) {i=0;secondL--;}
if(secondL==-1) {secondL=9;secondH--;}
if(secondH==-1) {secondH=9;minute--;}
if(minute==0 && secondH==0 && secondL==0){EA=0;P3=0x20;P1=0xFF;}
}/code]
[code=C/C++][ void displayone(int m)
{ //显示上半场
switch(m)
{
case 0:P0=led1[jiafenshuh]; break;
case 1:P0=led1[jiafenshul]; break;
case 2:P0=led1[0]; break;
case 3:P0=led1[minute]; break;
case 4:P0=led1[secondH]; break;
case 5:P0=led1[secondL]; break;
case 6:P0=led1[yifenshuh]; break;
case 7:P0=led1[yifenshul]; break;
default:break;
}
}/code]
[解决办法]
需要仿真,单步执行,看执行到哪里LED就灭了
[解决办法]
1)你的主程序在哪里无限循环?
2) 定义m无符号后,在循环语句中
for (m=7;m>=0;m--) { }
m从7变成0,接着是从255递减成0,再从255开始,....
3)需要定义成 int m;
[解决办法]
改成这样也可以,不用定义成int
for (m=7;m<=7;m--) { }