[讨论] 关于protest仿真数码管

zuo5220253   2015-1-19 21:59 楼主
谁能指导一下,关于仿真数码管动态显示需要注意些什么,我也是初学,做了一个按键控制的倒计时程序,定时器中断1ms执行扫描一次,数码管扫描和按键扫描都在一个中断里,下载到板子上没有问题,仿真却出现乱码,我把程序其他部分屏蔽掉,只留下扫描部分,发现把按键扫描去掉就显示正常了,是因为中断里东西太多了吗?还是因为其他的,求解惑。

回复评论 (13)

你的中断程序里有多少代码?这些代码执行时间会不会超过1ms?

一般的做法是,中断里的程序尽可能的短,最好是进中断处理一下数据马上出来。
比如进入中断置位标志,或是赋值数据,然后回到主程序中处理这些数据。
点赞  2015-1-19 22:43
参考一下这个博客,很不错
基于proteus的51单片机仿真实例六十、8位数码管显示实例
https://home.eeworld.com.cn/my/space-uid-139222-blogid-28905.html
点赞  2015-1-19 23:26
引用: qwqwqw2088 发表于 2015-1-19 23:26
参考一下这个博客,很不错
基于proteus的51单片机仿真实例六十、8位数码管显示实例
https://home.eeworld.com.cn/my/space-uid-139222-blogid-28905.html



这个我看了,用的是延时,延时没问题,就是用中断刷新的时候显示不正常
没有做不到的只有想不到的
点赞  2015-1-20 10:09
引用: yu_studio 发表于 2015-1-19 22:43
你的中断程序里有多少代码?这些代码执行时间会不会超过1ms?

一般的做法是,中断里的程序尽可能的短,最好是进中断处理一下数据马上出来。
比如进入中断置位标志,或是赋值数据,然后回到主程序中处理这些数据。



我仿真了一下,中断执行的时间大概0.5个ms,两个判断语句,一个按键扫描函数,一个数码管扫描函数,显示乱码,另外不加按键扫描的话,能正常显示了,动态刷新的过程还能分辨出来,就是数码管逐个亮的效果,这又是为什么,
没有做不到的只有想不到的
点赞  2015-1-20 10:18
按键和数码管扫描不建议你放在中断里,在主循环里调用扫描程序就可以了。
点赞  2015-1-20 10:25
引用: yu_studio 发表于 2015-1-20 10:25
按键和数码管扫描不建议你放在中断里,在主循环里调用扫描程序就可以了。



哦,好的,那我试试
没有做不到的只有想不到的
点赞  2015-1-20 10:33
引用: yu_studio 发表于 2015-1-20 10:25
按键和数码管扫描不建议你放在中断里,在主循环里调用扫描程序就可以了。

我设置了个标志位,1ms置1把中断里的东西放到主函数里了,但是下载到板子上执行的时间变长了,而且闪烁


没有做不到的只有想不到的
点赞  2015-1-20 15:42
我没有看到你的程序是如何写的,但我感觉你程序思路应该改一下
LED应该不需要1ms扫描一次的,时间长一点没关系。
主程序里的代码稍微长点,执行一个周期就不止1ms了。
另外,程序里是否有像delay这类的空等待在耗时?
点赞  2015-1-20 17:14
引用: yu_studio 发表于 2015-1-20 17:14
我没有看到你的程序是如何写的,但我感觉你程序思路应该改一下
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;
        }
       
}

没有做不到的只有想不到的
点赞  2015-1-20 18:34
板子上能工作,仿真却不能,那说明是仿真器软件开发者问题,或者是两种CPU交叉编译时的问题,大可不必介意。
点赞  2015-1-21 23:44
引用: xu__changhua 发表于 2015-1-21 23:44
板子上能工作,仿真却不能,那说明是仿真器软件开发者问题,或者是两种CPU交叉编译时的问题,大可不必介意。



恩,谢谢
没有做不到的只有想不到的
点赞  2015-1-22 09:13
是软件问题,你先看看仿真芯片的时钟有没有设置,可以试试设置一下。
点赞  2015-1-22 11:11
引用: mii 发表于 2015-1-22 11:11
是软件问题,你先看看仿真芯片的时钟有没有设置,可以试试设置一下。



觉着不是那得问题,我几个程序都用的一个图,之前的就没问题,而且段选全部低电平的情况也还是照常乱码,应该是灭了的,P0口赋值不起作用
没有做不到的只有想不到的
点赞  2015-1-22 11:41
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复