谁能指导一下,关于仿真数码管动态显示需要注意些什么,我也是初学,做了一个按键控制的倒计时程序,定时器中断1ms执行扫描一次,数码管扫描和按键扫描都在一个中断里,下载到板子上没有问题,仿真却出现乱码,我把程序其他部分屏蔽掉,只留下扫描部分,发现把按键扫描去掉就显示正常了,是因为中断里东西太多了吗?还是因为其他的,求解惑。
你的中断程序里有多少代码?这些代码执行时间会不会超过1ms?
一般的做法是,中断里的程序尽可能的短,最好是进中断处理一下数据马上出来。
比如进入中断置位标志,或是赋值数据,然后回到主程序中处理这些数据。
这个我看了,用的是延时,延时没问题,就是用中断刷新的时候显示不正常
我仿真了一下,中断执行的时间大概0.5个ms,两个判断语句,一个按键扫描函数,一个数码管扫描函数,显示乱码,另外不加按键扫描的话,能正常显示了,动态刷新的过程还能分辨出来,就是数码管逐个亮的效果,这又是为什么,
按键和数码管扫描不建议你放在中断里,在主循环里调用扫描程序就可以了。
我设置了个标志位,1ms置1把中断里的东西放到主函数里了,但是下载到板子上执行的时间变长了,而且闪烁
我没有看到你的程序是如何写的,但我感觉你程序思路应该改一下
LED应该不需要1ms扫描一次的,时间长一点没关系。
主程序里的代码稍微长点,执行一个周期就不止1ms了。
另外,程序里是否有像delay这类的空等待在耗时?
没有使用延时,这个是例程上的,他这个仿真也有问题, 你看看有什么不足的地方
#include
sbit ADDR3 = P1^3;
sbit ENEND = P1^4;
sbit BUZZ = P1^6;
sbit keyin1= P2^4;
sbit keyin2= P2^5;
sbit keyin3= P2^6;
sbit keyin4= P2^7;
sbit keyout1= P2^0;
sbit keyout2= P2^1;
sbit keyout3= P2^2;
sbit keyout4= P2^3;
unsigned char code ledchar[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};////////////共阴
unsigned char code KeyCodeMap[4][4] = { //矩阵按键编号到标准键盘键码的映射表
{ 0x31, 0x32, 0x33, 0x26 }, //数字键 1、数字键 2、数字键 3、向上键
{ 0x34, 0x35, 0x36, 0x25 }, //数字键 4、数字键 5、数字键 6、向左键
{ 0x37, 0x38, 0x39, 0x28 }, //数字键 7、数字键 8、数字键 9、向下键
{ 0x30, 0x1B, 0x0D, 0x27 } //数字键 0、ESC 键、 回车键、 向右键
};
unsigned char ledbuff[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char keysta[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
unsigned long pdata keydowntime[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}} ;
bit flag1s=0;
bit flagstar=0;
bit enbuzz=0;
unsigned int countdown=0;
unsigned char T0RH=0;
unsigned char T0RL=0;
bit flagfresh =0;
void configtimer0(unsigned int ms);
void keydriver();
void shownumber(unsigned long number);
void keyscan();
void ledscan();
void main()
{
P0=0x00;
EA=1;
ADDR3 = 1;
ENEND = 0;
configtimer0(10);
shownumber(0);
while(1)
{
keydriver();
if(flagstar && flag1s)
{
flag1s=0;
if(countdown>0)
{
countdown--;
shownumber(countdown);
}
else if(countdown==0)
{
enbuzz=1;
ledbuff[6]=0xff;
shownumber(countdown);
}
}
}
}
void configtimer0(unsigned int ms)
{
unsigned long tmp;
tmp=11059200/12;
tmp=(tmp*ms)/1000;
tmp=65536-tmp+28;
T0RH=(unsigned char)(tmp>>8);
T0RL=(unsigned char)tmp;
TMOD &=0XF0;
TMOD |=0X01;
TH0=T0RH;
TL0=T0RL;
ET0=1;
TR0=1;
}
void shownumber(unsigned long number)
{
signed char i;
unsigned char buf[6];
for(i=0;i<6;i++)
{
buf=number%10;
number=number/10;
}
for(i=5;i>0;i--)
{
if(buf==0)
ledbuff=0x00;
else
break;
}
for(;i>=0;i--)
{
ledbuff=ledchar[buf];
}
}
void keyaction(unsigned char keycode)
{
if(keycode==0x26)
{
if(countdown<9999)
{
countdown++;
shownumber(countdown);
}
}
else if(keycode==0x28)
{
if(countdown>1)
{
countdown--;
shownumber(countdown);
}
}
else if(keycode==0x0d)
{
flagstar=1;
}
else if(keycode==0x1b)
{
flagstar=0;
enbuzz=0;
countdown=0;
ledbuff[6]=0x00;
shownumber(countdown);
}
}
void keydriver()
{
unsigned char i,j;
static unsigned char pdata backup[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
static unsigned long pdata keydownthr[4][4]={{1000,1000,1000,1000},{1000,1000,1000,1000},
{1000,1000,1000,1000},{1000,1000,1000,1000}};
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(backup[j]!=keysta[j])
{
if(keysta[j]==0)
{
keyaction(KeyCodeMap[j]);
}
backup[j]=keysta[j];
}
if(keydowntime[j]>0)
{
if(keydowntime[j]>=keydownthr[j])
{
keyaction(KeyCodeMap[j]);
keydownthr[j] +=200;
}
}
else
{
keydownthr[j] =1000;
}
}
}
}
*******************中断部分**************************
void keyscan()//矩阵按键扫描
{
unsigned char i;
static unsigned char keyout=0;
static unsigned char keybuff[4][4]={{0xff,0xfff,0xff,0xff},{0xff,0xfff,0xff,0xff},
{0xff,0xfff,0xff,0xff},{0xff,0xfff,0xff,0xff}};
keybuff[keyout][0]=(keybuff[keyout][0] <<1) | keyin1;
keybuff[keyout][1]=(keybuff[keyout][1] <<1) | keyin2;
keybuff[keyout][2]=(keybuff[keyout][2] <<1) | keyin3;
keybuff[keyout][3]=(keybuff[keyout][3] <<1) | keyin4;
//按键去抖动
for(i=0;i<4;i++)
{
if((keybuff[keyout]&0x0f)==0x00)
{
keysta[keyout]=0;
keydowntime[keyout] +=4;//按键长按检测
}
else if((keybuff[keyout]&0x0f)==0x0f)
{
keysta[keyout]=1;
keydowntime[keyout] =0;
}
}
keyout++;
keyout &=0x03;
switch(keyout)//按键扫描
{
case 0: keyout4=1; keyout1=0;break;
case 1: keyout1=1; keyout2=0;break;
case 2: keyout2=1; keyout3=0;break;
case 3: keyout3=1; keyout4=0;break;
default :break;
}
}
void ledscan()//数码管刷新
{
static unsigned char i=0;
P0=0x00;
P1=(P1&0xf8)|(7-i);
P0=ledbuff;
if(i<7)
i++;
else
i=0;
}
void interrupttimer0() interrupt 1
{
static unsigned int count1s=0;
TH0=T0RH;//定时1ms
TL0=T0RL;
if(enbuzz)//蜂鸣器响
BUZZ=~BUZZ;
else
BUZZ=1;
keyscan();
ledscan();
if(flagstar)//开始按键按下,计时开始
{
count1s++;
if(count1s>=100)
{
count1s=0;
flag1s=1;
}
}
else
{
count1s=0;
}
}
板子上能工作,仿真却不能,那说明是仿真器软件开发者问题,或者是两种CPU交叉编译时的问题,大可不必介意。
是软件问题,你先看看仿真芯片的时钟有没有设置,可以试试设置一下。
觉着不是那得问题,我几个程序都用的一个图,之前的就没问题,而且段选全部低电平的情况也还是照常乱码,应该是灭了的,P0口赋值不起作用