请教一个51单片机单片机问题。关于LED屏幕显示9-0倒计时

时间:2022-07-20 19:48:50
代码如下
 #include<reg52.h>
 
 sbit ADDR0 = P1^0;
 sbit ADDR1 = P1^1;
 sbit ADDR2 = P1^2;
 sbit ADDR3 = P1^3;
 sbit ENLED = P1^4;

 unsigned char code image[10][8] = {
  {0xFF,0xC3,0xDB,0xDB,0xDB,0xDB,0xDB,0xC3},//显示0
  {0xFF,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xFF},//显示1
{0xFF,0xE7,0xDB,0xDF,0xEF,0xF7,0xC3,0xFF},//显示2
 {0xFF,0xE3,0xDF,0xDF,0xC3,0xDF,0xDF,0xE3},//显示3
 {0xFF,0xE7,0xEB,0xED,0x81,0xEF,0xEF,0xEF},//显示4
 {0xFF,0xC3,0xFB,0xFB,0xC3,0xDF,0xDF,0xC3},//显示5
 {0xFF,0xC3,0xFB,0xFB,0xC3,0xDB,0xDB,0xC3},//显示6
 {0xFF,0xC3,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF},//显示7
 {0xFF,0xC3,0xDB,0xDB,0xC3,0xDB,0xDB,0xC3},//显示8
 {0xFF,0xC3,0xDB,0xDB,0xC3,0xDF,0xDF,0xC3},//显示9
};
 void main()
 {
  EA = 1; //使能总中断
ENLED = 0;
ADDR3 = 0;

TMOD = 0x01;//设置T0为模式1
TH0 = 0xFC;//为T0赋初值0xFC67,定时1ms
TL0 = 0x67;
ET0 = 1;//使能T0中断
TR0 = 1;//启动T0
while(1);

 }

 void InterruptTimer0() interrupt 1
 {
   static unsigned char i = 0;//动态扫描的索引
 static unsigned char tmr = 0;//1s软件定时器
 static unsigned char index = 9; //图片刷新索引
 
 TH0 = 0xFC;//重新加载初值
 TL0 = 0x67;
 P0 = 0xFF; //显示消隐
 switch(i)
 {
  case 0:ADDR2=0;ADDR1=0;ADDR0=0;i++;P0=image[index][0];break;
case 1:ADDR2=0;ADDR1=0;ADDR0=1;i++;P0=image[index][1];break;
case 2:ADDR2=0;ADDR1=1;ADDR0=0;i++;P0=image[index][2];break;
case 3:ADDR2=0;ADDR1=1;ADDR0=1;i++;P0=image[index][3];break;
case 4:ADDR2=1;ADDR1=0;ADDR0=0;i++;P0=image[index][4];break;
case 5:ADDR2=1;ADDR1=0;ADDR0=1;i++;P0=image[index][5];break;
case 6:ADDR2=1;ADDR1=1;ADDR0=0;i++;P0=image[index][6];break;
case 7:ADDR2=1;ADDR1=1;ADDR0=1;i=0;P0=image[index][7];break;//显示9
default:break;
 }
//以下代码完成每秒改变一帧图像
 tmr++;
 if(tmr >= 1000)//达到1000ms时改变一次图片索引
 {
  tmr = 0;
//index++;
if(index == 0)//图片索引9~0循环
{
index = 9;
}else
{
index--;
}
 }
 }


问题出在当我写成if(tmr >= 1000)的时候,点阵只显示9,然而改成250的时候点阵能正常显示倒计时效果。我想的话,既然250ms的时候程序能够实现(只是图片刷新速度很快,250ms变化一次数字),那么中断和图片的刷新应该是正常实现了的,百思找不到原因,求解答。

3 个解决方案

#1


case 7:ADDR2=1;ADDR1=1;ADDR0=1;i=0;P0=image[index][7];break;//显示9  
这段注释不对哈,编辑的时候没注意

#2


tmr定义为unsigned char ,变量最大值才为256。你来个1000肯定不行,溢出!注意一下变量定义类型,改为int可以

#3


问题已经解决!非常感谢。以后在编程过程中我会记得这次错误! 请教一个51单片机单片机问题。关于LED屏幕显示9-0倒计时

#1


case 7:ADDR2=1;ADDR1=1;ADDR0=1;i=0;P0=image[index][7];break;//显示9  
这段注释不对哈,编辑的时候没注意

#2


tmr定义为unsigned char ,变量最大值才为256。你来个1000肯定不行,溢出!注意一下变量定义类型,改为int可以

#3


问题已经解决!非常感谢。以后在编程过程中我会记得这次错误! 请教一个51单片机单片机问题。关于LED屏幕显示9-0倒计时