标题: 怎么实现让51单片机按键开始一边执行两个IO循环,一边数码管动态显计数。 [打印本页]

作者: eternity4869    时间: 2021-9-21 23:49
标题: 怎么实现让51单片机按键开始一边执行两个IO循环,一边数码管动态显计数。
本帖最后由 eternity4869 于 2021-9-22 00:07 编辑

  我目前的困难就是执行完IO循环后,数码管对循环次数累加以后只会刷新一次不是持续刷新,所以根本看不见数码管显示。很想解决这个问题不知道在怎么操作。

作者: yzwzfyz    时间: 2021-9-22 08:04
1、永远记住任何时刻单片机只能做一件事!!!
2、多件事需要执行时,一定是分时进行的!
现在说你的问题。(问题出在:你的扫描显示方案不当!)
1、显示一定要用定时中断去做,只有这样才能每间隔一个固定的时间,扫显一次,而不需要你额外照料它。(即不影响你【执行两个IO循环】)
例如,每4ms扫显一次,就做个4ms的定时中断。
2、在中断服务程序中完成扫显:假设扫描8次完成一次完整的数据显示刷新,你就建立8个缓冲区存放8次需要显示的LED码,再建立一个指针指向它们(=0-7),每次中断将指针+1,再取批针指向的数据送入LED显示,这样就完成扫描显示了。也不影响主程序的执行。
3、缓冲区的数据,在主程序中改,不要在中断服务在改,这样才机动。即显示什么、译成LED显示码的工作,在主程序中进行,当然LED值没有变化时,是不需要变更处理的,即仅在LED需要改变时进行一次处理。
4、显示完成后你想如何就如何吧。
作者: IdeaMing    时间: 2021-9-22 09:12
要想解决问题,首先要把问题给描述清除,你这样的描述,只能是你觉的你说明白了,其实我根本不知道你在说啥。
作者: lkc8210    时间: 2021-9-22 13:10
給一段例子,讓你參考

  1. #include <reg52.h>

  2. typedef         unsigned char        u8;  //0 to 255
  3. typedef         unsigned int        u16;  //0 — 65535
  4. typedef         unsigned long        u32;  //0 — 4294967295

  5. u8 code smgduan[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管
  6. //u8 code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管
  7. u8 DigiTubeShow[3];
  8. u16 count_XX=0;                        //消抖计数
  9. u16 TMR_XX_OT;
  10. u8 num;
  11. sbit P20 = P2^0;
  12. sbit P21 = P2^1;
  13. sbit P37 = P3^7;        
  14. void main()
  15. {
  16.     while (1)
  17.     {
  18.                         //按键扫描V
  19.                         if(!P20 || !P21)
  20.                         {
  21.                                 if(count_XX<0xFFFF)count_XX++;
  22.                                 if(count_XX==5000)                        //消抖
  23.                                 {u8 i, Temp;
  24.                                         if(!P20)num++;
  25.                                         if(!P21)num--;
  26.                                         Temp = num;
  27.                                         for(i = 0;i<3;i++)
  28.                                         {
  29.                                                 DigiTubeShow[i] = Temp%10;
  30.                                                 Temp /=10;
  31.                                         }
  32.                                 }
  33.                         }
  34.                         else                                                        //按键抬起
  35.                                 count_XX=0;                                        //count_XX清0
  36.                         //按键扫描A
  37.                         
  38.                         //数码管扫描V
  39.       if(TMR_XX_OT)TMR_XX_OT--;      
  40.       if(!TMR_XX_OT)
  41.       {static u8 x;
  42.                                 TMR_XX_OT=100;
  43.                                 P0 = 0x00;
  44.                                 P1 = 0xFF;
  45.                                 P0 = smgduan[DigiTubeShow[x]];
  46.                                 P1 = ~(1<<x);
  47.                                 x = (++x) % 3;        
  48.       }
  49.                         //数码管扫描A
  50.     }
  51. }
复制代码




作者: 3346661547    时间: 2021-9-22 13:50
IdeaMing 发表于 2021-9-22 09:12
要想解决问题,首先要把问题给描述清除,你这样的描述,只能是你觉的你说明白了,其实我根本不知道你在说啥 ...

说的没错!!!
作者: 3346661547    时间: 2021-9-22 13:50
IdeaMing 发表于 2021-9-22 09:12
要想解决问题,首先要把问题给描述清除,你这样的描述,只能是你觉的你说明白了,其实我根本不知道你在说啥 ...

就你小伙照!
作者: eternity4869    时间: 2021-9-23 09:54
yzwzfyz 发表于 2021-9-22 08:04
1、永远记住任何时刻单片机只能做一件事!!!
2、多件事需要执行时,一定是分时进行的!
现在说你的问题 ...

非常感谢,解决了我的疑惑。我尝试解决一下。
作者: eternity4869    时间: 2021-9-25 22:00
yzwzfyz 发表于 2021-9-22 08:04
1、永远记住任何时刻单片机只能做一件事!!!
2、多件事需要执行时,一定是分时进行的!
现在说你的问题 ...

你好,我想问一下如果不用指针还有什么别的办法来解决这个问题。目前指针还不了解尝试了一下发现指针并不容易上手。
作者: lkc8210    时间: 2021-9-25 22:50
eternity4869 发表于 2021-9-25 22:00
你好,我想问一下如果不用指针还有什么别的办法来解决这个问题。目前指针还不了解尝试了一下发现指针并不 ...

请参考我"地板"的回覆
作者: npn    时间: 2021-9-25 23:01
eternity4869 发表于 2021-9-25 22:00
你好,我想问一下如果不用指针还有什么别的办法来解决这个问题。目前指针还不了解尝试了一下发现指针并不 ...

他说的8个缓冲区其实就是个8字节数组,
指针指的是数组下标,并非真正的指针。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1