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

yi为你会懂 2016-06-14 08:17:11
代码如下
#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变化一次数字),那么中断和图片的刷新应该是正常实现了的,百思找不到原因,求解答。
...全文
994 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你好,有没有大神解释一下这个,新手小白 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;
zhantaiyu123 2016-06-15
  • 打赏
  • 举报
回复
tmr定义为unsigned char ,变量最大值才为256。你来个1000肯定不行,溢出!注意一下变量定义类型,改为int可以
yi为你会懂 2016-06-15
  • 打赏
  • 举报
回复
问题已经解决!非常感谢。以后在编程过程中我会记得这次错误!
yi为你会懂 2016-06-14
  • 打赏
  • 举报
回复
case 7:ADDR2=1;ADDR1=1;ADDR0=1;i=0;P0=image[index][7];break;//显示9 这段注释不对哈,编辑的时候没注意

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧