找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3954|回复: 17
收起左侧

C语言switch case语句的延时程序该怎么加啊?

[复制链接]
ID:350902 发表于 2020-3-6 20:29 来自手机 | 显示全部楼层 |阅读模式
我打算用switch case语句做一个按键检测程序。
switch(P1)//检测几号按键按下
        {
                case 0xfe://1号
                beep = 1;        //蜂鸣器响
                delay50ms(20);
                beep = 0;
我想加个10ms的延时程序,该怎么加啊?
mmexport1583497159192.jpg
回复

使用道具 举报

ID:235200 发表于 2020-3-7 02:05 | 显示全部楼层
switch(P1)//检测几号按键按下
        {
                case 0xfe://1号
                beep = 1;        //蜂鸣器响
                delay50ms(20);
                beep = 0;
               break;
        }这不已经加了延时程序了?后面加1个break;就行了
回复

使用道具 举报

ID:213173 发表于 2020-3-7 08:41 | 显示全部楼层
void keyscan()
{
        if(P1!=0xff)
        {
                delay(10);
                if(P1!=0xff)
                {
                        switch(P1)//检测几号按键按下
                        {
                                case 0xfe:/*1号任务*/break;
                                case 0xfd:/*2号任务*/break;
                                case 0xfb:/*3号任务*/break;
                                case 0xf7:/*4号任务*/break;
                                case 0xef:/*5号任务*/break;
                                case 0xdf:/*6号任务*/break;
                                case 0xbf:/*7号任务*/break;
                                case 0x7f:/*8号任务*/break;
                                default: break;
                        }
                        while(P1!=0xff);//等待松手
                }
        }
}
回复

使用道具 举报

ID:697884 发表于 2020-3-7 09:18 | 显示全部楼层
   while(P1!=0xff);//等待松手
如果这样玩的话,用户如果一直按住按键不放的话,整个系统可能会崩溃了。
回复

使用道具 举报

ID:94031 发表于 2020-3-7 09:52 | 显示全部楼层
你都有 delay50ms(20);,应该会自己建10ms延时程序。
回复

使用道具 举报

ID:350902 发表于 2020-3-7 12:13 来自手机 | 显示全部楼层
xuyaqi 发表于 2020-3-7 09:52
你都有 delay50ms(20);,应该会自己建10ms延时程序。

延时程序会写,但是不知道怎么放到这个按键检测里面去,怎么才能防抖。
回复

使用道具 举报

ID:350902 发表于 2020-3-7 12:14 来自手机 | 显示全部楼层
yxh1999 发表于 2020-3-7 09:18
while(P1!=0xff);//等待松手
如果这样玩的话,用户如果一直按住按键不放的话,整个系统可能会崩溃了。[ ...

大神可以指导下吗
回复

使用道具 举报

ID:350902 发表于 2020-3-7 12:54 来自手机 | 显示全部楼层
csmyldl 发表于 2020-3-7 02:05
switch(P1)//检测几号按键按下
        {
                case 0xfe://1号

这个1s的延时是蜂鸣器响一秒的时间,不是按键防抖的。。。
回复

使用道具 举报

ID:468535 发表于 2020-3-7 13:22 来自手机 | 显示全部楼层
在按键等于键值时开启10ms时长的定时器到时检测值是否等于此键值,等于就是按键不等就直接退出。
回复

使用道具 举报

ID:697884 发表于 2020-3-7 13:46 | 显示全部楼层
static  BYTE last_io=0xff;
static  BYTE last_delay=0;
void keyscan()
{
         
       if(last_io!=P1)
        {
          last_io=P1;
          last_delay=10;
        }
       else
        {
           if(P1!=0xff)
           {

                 if(last_delay>0)
                 {
                      last_delay--;
                       if(last_delay==0)
                        {
                        switch(P1)//检测几号按键按下
                        {
                                case 0xfe:/*1号任务*/break;
                                case 0xfd:/*2号任务*/break;
                                case 0xfb:/*3号任务*/break;
                                case 0xf7:/*4号任务*/break;
                                case 0xef:/*5号任务*/break;
                                case 0xdf:/*6号任务*/break;
                                case 0xbf:/*7号任务*/break;
                                case 0x7f:/*8号任务*/break;
                                default: break;
                        }
                        }
                 }
           }
        }
}
你要防抖的话,加2个变量就好了。读到P1值后保存下来,跟之前的比较下,再整个计数,达到计数值就执行按键功能,这就是防抖了。赋值10根据系统来灵活设置。反正肯定比你什么防抖都不加更可靠。
回复

使用道具 举报

ID:704050 发表于 2020-3-7 14:42 | 显示全部楼层
unsigned char linkey=0;//临时按键值

void main()
{
    while(1)
    {
       keyscan();
    }
}
void keyscan()
{
        linkey=P1;
        delay(10);
                if(P1==linkey)
                {
                        switch(P1)//检测几号按键按下
                        {
                                case 0xfe:/*1号任务*/break;
                                case 0xfd:/*2号任务*/break;
                                case 0xfb:/*3号任务*/break;
                                case 0xf7:/*4号任务*/break;
                                case 0xef:/*5号任务*/break;
                                case 0xdf:/*6号任务*/break;
                                case 0xbf:/*7号任务*/break;
                                case 0x7f:/*8号任务*/break;
                                default: break;
                        }
               
                }
}
回复

使用道具 举报

ID:350902 发表于 2020-3-7 16:26 来自手机 | 显示全部楼层
yxh1999 发表于 2020-3-7 13:46
static  BYTE last_io=0xff;
static  BYTE last_delay=0;
void keyscan()

我是初学者你加的这句有点似懂非懂
static  BYTE last_io=0xff;
static  BYTE last_delay=0;
void keyscan()
{
         
       if(last_io!=P1)
        {
          last_io=P1;
          last_delay=10;
        }
       else
        {
           if(P1!=0xff)
           {

                 if(last_delay>0)
                 {
                      last_delay--;
                       if(last_delay==0)
意思是不是将指针定位到P1端口,然后检测P1端口电位是否发生变化,如果发生变化,则进行10ms延时。是这个意思吗?
我想了下,我直接这样加
if(P1!=0xff)     //P1端口电平发生变化,表示有按键按下
  {
  delay10ms();     //延迟10ms  
      
         switch(P1)//再次检测是哪位选手按下抢答按钮
        {
                case 0xfe://1号
                beep = 1;        //蜂鸣器响
                delay50ms(20);
                beep = 0;
                break;
                case 0xfd://2号
                case 0xfb://3号
                case 0xf7://4号
                case 0xef://5号
                case 0xdf://6号
                case 0xbf://7号
                case 0x7f://8号
         }

如果P1端口电位发生变化,则延时10ms,然后再检测是哪个引脚电平发生了变化,然后开始对应指令。这样能达到防抖效果吗?
回复

使用道具 举报

ID:626321 发表于 2020-3-7 18:32 | 显示全部楼层
可以写个状态机,处理消抖感觉挺好用的
回复

使用道具 举报

ID:697884 发表于 2020-3-9 09:08 | 显示全部楼层
夜空。 发表于 2020-3-7 16:26
我是初学者你加的这句有点似懂非懂
static  BYTE last_io=0xff;
static  BYTE last_delay=0;

这样也是可以的。具体情况需要根据系统复杂度和实际IO口的环境来定。如果这个脚有时候因为静电的原因偶尔有个100MS的干扰信号的话,你这里延时10MS就不够了,可能需要写100MS以上的延时,那么对整个系统而言,按键这样处理就会降低系统的执行效率,使系统越来越慢。
回复

使用道具 举报

ID:679425 发表于 2020-3-9 10:07 | 显示全部楼层
delay50ms(20);
回复

使用道具 举报

ID:350902 发表于 2020-3-9 11:15 来自手机 | 显示全部楼层
yxh1999 发表于 2020-3-9 09:08
这样也是可以的。具体情况需要根据系统复杂度和实际IO口的环境来定。如果这个脚有时候因为静电的原因偶尔 ...

好的,谢谢。
回复

使用道具 举报

ID:350902 发表于 2020-3-9 11:18 来自手机 | 显示全部楼层
mars_zfmy 发表于 2020-3-7 14:42
unsigned char linkey=0;//临时按键值

void main()

可以的,谢谢。
回复

使用道具 举报

ID:496117 发表于 2020-3-9 11:36 | 显示全部楼层
10楼的延时消抖比较好
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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