#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
问题已经解决!非常感谢。以后在编程过程中我会记得这次错误!
#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
问题已经解决!非常感谢。以后在编程过程中我会记得这次错误!