找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机流水灯循环点亮的同时按下按键可以控制数码管显示数值程序问题

[复制链接]
跳转到指定楼层
楼主
初学单片机想问下大神。
项目上要求,开关开启后LED流水灯要循环点亮,同时按下按键可以控制数码管显示数值
我找了网上好多资料,扫描键盘用的是while 死循环,可是开关开启后LED的循环闪跃也是用的while死循环,
他们同时出现在主函数main()中肯定是无法运行的,想知道有没有什么办法可以让LED或是按键扫描中的一个,不用死循环也能达到运行效果;
主函数单片机代码如下,求大神解答

void main()
{
      
        while(1)
        {
                Key_Proc();//按键判断
                Seg_Proc();//数据采集及转换,用于数据显示
        }
        while(1)
        {
                led_Disp(0X01);//反复使用延时函数
                Delaynms(500);
                led_Disp(0X02);
                Delaynms(500);
                led_Disp(0X04);
                Delaynms(500);
                led_Disp(0X08);
                Delaynms(500);
                led_Disp(0X10);
                Delaynms(500);
                led_Disp(0X20);
                Delaynms(500);
                led_Disp(0X40);
                Delaynms(500);
                led_Disp(0X80);
                Delaynms(500);
        }

}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:86926 发表于 2020-11-10 09:37 | 只看该作者
都放在一个死循环里,延时用一个1ms的或者更小的,用计数的方法来累计延时,其中把扫描按键以及数码管加进去。或者用定时器中断,定时扫描按键。
回复

使用道具 举报

板凳
ID:213173 发表于 2020-11-10 11:21 | 只看该作者
程序在绝大多数情况下都得跑起来,不可以随便使用死循环和阻滞延时。虽然指令是逐条执行的,但由于单片机速度很快,主观感觉许多任务在同时执行。给你一个流水灯和数码管动态显示的简单示例参考。仿真图只代表逻辑正确,完善后才能用于实际电路。

  1. #include<reg51.h>
  2. unsigned char code table[]={//共阴数码管段码"0~f-."
  3.                 0x3f,0x06,0x5b,0x4f,
  4.                 0x66,0x6d,0x7d,0x07,
  5.                 0x7f,0x6f,0x77,0x7c,
  6.                 0x39,0x5e,0x79,0x71,0x40,0x80};
  7. unsigned char code wela[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位码
  8. unsigned char data dis_buf[8];//显示缓存
  9. unsigned int i,j,k,l;//计数变量
  10. void main()
  11. {
  12.         P1=0xfe;//流水灯初始化
  13.         while(1)
  14.         {
  15.                 //i,j,k计数
  16.                 i++;
  17.                 if(i>=1000)
  18.                 {
  19.                         i=0;
  20.                         j++;
  21.                         if(j>9999)
  22.                         {
  23.                                 j=0;
  24.                                 k++;
  25.                                 if(k>9999)
  26.                                         k=0;
  27.                         }
  28.                         //流水灯
  29.                         P1=P1<<1|0x01;
  30.                         if(P1==0xff)
  31.                                 P1=0xfe;
  32.                 }
  33.                 //分解数据
  34.                 dis_buf[0]=table[k/1000%10];
  35.                 dis_buf[1]=table[k/100%10];
  36.                 dis_buf[2]=table[k/10%10];
  37.                 dis_buf[3]=table[k%10];
  38.                 dis_buf[4]=table[j/1000%10];
  39.                 dis_buf[5]=table[j/100%10];
  40.                 dis_buf[6]=table[j/10%10];
  41.                 dis_buf[7]=table[j%10];
  42.                 //数码管动态显示
  43.                 P0=0x00;//消隐段码
  44.                 P2=wela[l];//位码
  45.                 P0=dis_buf[l];//段码
  46.                 l++;//数码管动态计数
  47.                 if(l>=8)
  48.                         l=0;
  49.         }
  50. }
复制代码



回复

使用道具 举报

地板
ID:841085 发表于 2021-2-16 10:06 | 只看该作者
蓝魄 发表于 2020-11-10 09:37
都放在一个死循环里,延时用一个1ms的或者更小的,用计数的方法来累计延时,其中把扫描按键以及数码管加进 ...

明白了,谢谢
回复

使用道具 举报

5#
ID:841085 发表于 2021-2-16 10:07 | 只看该作者
wulin 发表于 2020-11-10 11:21
程序在绝大多数情况下都得跑起来,不可以随便使用死循环和阻滞延时。虽然指令是逐条执行的,但由于单片机速 ...

谢谢你,我明白了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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