当前位置: 代码迷 >> 单片机 >> 单片机定时器控制七段数码管会闪烁有关问题,主要代码如下
  详细解决方案

单片机定时器控制七段数码管会闪烁有关问题,主要代码如下

热度:78   发布时间:2016-04-28 16:01:30.0
单片机定时器控制七段数码管会闪烁问题,主要代码如下
[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--) { }
  相关解决方案