找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2200|回复: 9
收起左侧

请大师帮忙修改一下这个单片机C语言程序switch case问题

[复制链接]
ID:60021 发表于 2019-12-8 17:23 | 显示全部楼层 |阅读模式
下面程序运行没有问题,只是从0、1、2、3......,这样执行,里面有延时程序,要等很久,才执行完一条;我想连续按两下,就马上执行case 1:,连续按4下,就马上执行case3:。
if(!SW8)
{
        delay_ms(20);
        if(!SW8)
        {                                                        
                while(!SW8);                        
                switch(ad)
                {
                        case 0: P26=0; delay_ms(3000); P53=0; P54=1; delay_ms(10000);
                                   P53=1; P54=0; P36=0; delay_ms(60000); P36=1; ad++; break;
                        case 1: P26=1; P27=0; delay_ms(3000); P53=0; P54=1; delay_ms(10000);
                                   P53=1; P54=0; P36=0; delay_ms(60000); delay_ms(20000); P36=1; ad++; break;
                        case 2: P27=1; P33=0; delay_ms(3000); P53=0; P54=1; delay_ms(10000);
                                   P53=1; P54=0; P36=0; delay_ms(60000); delay_ms(40000); P36=1; ad++; break;
                        case 3: P33=1; P34=0; delay_ms(3000); P53=0; P54=1; delay_ms(10000);
                                   P53=1; P54=0; P36=0; delay_ms(60000); delay_ms(60000); P36=1; ad++; break;
                        case 4: P34=1; P37=1; ad=0; break;
                        default: break;
                }
        }
}

回复

使用道具 举报

ID:470332 发表于 2019-12-9 09:36 | 显示全部楼层
你都知道延时太多了,所以就把延时换成非阻塞的定时器
回复

使用道具 举报

ID:635545 发表于 2019-12-9 18:47 | 显示全部楼层
第一:按键做一个中断;用一个计数器存按键按下的次数,超过最大数就清0;
第二:将case后面要做的事用一个函数写出来。
框架大概就是这样,剩下的就把东西填进去就可以了。
回复

使用道具 举报

ID:377210 发表于 2019-12-10 11:55 | 显示全部楼层
这么长的延时时间,还是用定时器来延时好。按键的处理可以按楼上说的来
回复

使用道具 举报

ID:278179 发表于 2019-12-10 12:29 | 显示全部楼层
把这个delay_ms(3000)延时值改小,加循环,循环内加判断AD值不等于当前值, break;退出当前switch case
回复

使用道具 举报

ID:60021 发表于 2019-12-12 11:36 | 显示全部楼层
我用定时器中断还是没有搞定,请师傅们指点迷津,不胜感激。
回复

使用道具 举报

ID:282850 发表于 2019-12-12 17:24 | 显示全部楼层
不用定时器、不用中断也可以完成。改程序如下,变量自己定义
unsigned char key_Count(add)
{
      if(!SW8)
      {
            delay_ms(20);
            if(!SW8)
            {                                                        
                  while(SW8)  add++;     //!!等待释放按键                     
            }
      }
      return add;
}

void Runing()
{
      unsigned char add;
        keyCnt= key_Count(add);         
      switch(keyCnt)
                  {
                    case 0: P26=0; delay_ms(3000); P53=0; P54=1; delay_ms(10000);
                    P53=1; P54=0; P36=0; delay_ms(60000); P36=1;  break;
                    case 1: P26=1; P27=0; delay_ms(3000); P53=0; P54=1; delay_ms(10000);
                    P53=1; P54=0; P36=0; delay_ms(60000); delay_ms(20000); P36=1;  break;
                    case 2: P27=1; P33=0; delay_ms(3000); P53=0; P54=1; delay_ms(10000);
                    P53=1; P54=0; P36=0; delay_ms(60000); delay_ms(40000); P36=1;  break;
                    case 3: P33=1; P34=0; delay_ms(3000); P53=0; P54=1; delay_ms(10000);
                    P53=1; P54=0; P36=0; delay_ms(60000); delay_ms(60000); P36=1;  break;
                    case 4: P34=1; P37=1; add=0; break;
                    default: break;
                  }
}
回复

使用道具 举报

ID:606366 发表于 2019-12-13 16:52 | 显示全部楼层
f556 发表于 2019-12-12 17:24
不用定时器、不用中断也可以完成。改程序如下,变量自己定义
unsigned char key_Count(add)
{

你这肯定不对,按键按下,消抖之后,不一定进入while循环
回复

使用道具 举报

ID:282850 发表于 2019-12-14 17:11 | 显示全部楼层
无敌的UUZ大人 发表于 2019-12-13 16:52
你这肯定不对,按键按下,消抖之后,不一定进入while循环

佩服你的思维。消抖就是消除误触发,如果没进while说明不是正确的按下
回复

使用道具 举报

ID:478073 发表于 2019-12-14 18:03 | 显示全部楼层
这种思路当然不对!这说明定时与中断没学好!你让程序在一个语句上不停的重复一件事,本身就是思路出了问题!你这要再加几个功能你这都没得玩!好好整整定时与中断,延时的事让定时器去摆平!在定时器中整个标记位,后面的就好整了!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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