找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2300|回复: 9
打印 上一主题 下一主题
收起左侧

怎么实现让51单片机按键开始一边执行两个IO循环,一边数码管动态显计数。

[复制链接]
跳转到指定楼层
楼主
ID:820813 发表于 2021-9-21 23:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 eternity4869 于 2021-9-22 00:07 编辑

  我目前的困难就是执行完IO循环后,数码管对循环次数累加以后只会刷新一次不是持续刷新,所以根本看不见数码管显示。很想解决这个问题不知道在怎么操作。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 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、显示完成后你想如何就如何吧。
回复

使用道具 举报

板凳
ID:276663 发表于 2021-9-22 09:12 | 只看该作者
要想解决问题,首先要把问题给描述清除,你这样的描述,只能是你觉的你说明白了,其实我根本不知道你在说啥。
回复

使用道具 举报

地板
ID:161164 发表于 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. }
复制代码



回复

使用道具 举报

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

说的没错!!!
回复

使用道具 举报

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

就你小伙照!
回复

使用道具 举报

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

非常感谢,解决了我的疑惑。我尝试解决一下。
回复

使用道具 举报

8#
ID:820813 发表于 2021-9-25 22:00 | 只看该作者
yzwzfyz 发表于 2021-9-22 08:04
1、永远记住任何时刻单片机只能做一件事!!!
2、多件事需要执行时,一定是分时进行的!
现在说你的问题 ...

你好,我想问一下如果不用指针还有什么别的办法来解决这个问题。目前指针还不了解尝试了一下发现指针并不容易上手。
回复

使用道具 举报

9#
ID:161164 发表于 2021-9-25 22:50 | 只看该作者
eternity4869 发表于 2021-9-25 22:00
你好,我想问一下如果不用指针还有什么别的办法来解决这个问题。目前指针还不了解尝试了一下发现指针并不 ...

请参考我"地板"的回覆
回复

使用道具 举报

10#
ID:57657 发表于 2021-9-25 23:01 | 只看该作者
eternity4869 发表于 2021-9-25 22:00
你好,我想问一下如果不用指针还有什么别的办法来解决这个问题。目前指针还不了解尝试了一下发现指针并不 ...

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表