找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

查看数: 6071 | 评论数: 17 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2020-3-6 20:29

正文摘要:

我打算用switch case语句做一个按键检测程序。 switch(P1)//检测几号按键按下         {                 case 0xfe://1号 & ...

回复

ID:496117 发表于 2020-3-9 11:36
10楼的延时消抖比较好
ID:350902 发表于 2020-3-9 11:18
mars_zfmy 发表于 2020-3-7 14:42
unsigned char linkey=0;//临时按键值

void main()

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

好的,谢谢。
ID:679425 发表于 2020-3-9 10:07
delay50ms(20);
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:626321 发表于 2020-3-7 18:32
可以写个状态机,处理消抖感觉挺好用的
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: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: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:468535 发表于 2020-3-7 13:22
在按键等于键值时开启10ms时长的定时器到时检测值是否等于此键值,等于就是按键不等就直接退出。
ID:350902 发表于 2020-3-7 12:54
csmyldl 发表于 2020-3-7 02:05
switch(P1)//检测几号按键按下
        {
                case 0xfe://1号

这个1s的延时是蜂鸣器响一秒的时间,不是按键防抖的。。。
ID:350902 发表于 2020-3-7 12:14
yxh1999 发表于 2020-3-7 09:18
while(P1!=0xff);//等待松手
如果这样玩的话,用户如果一直按住按键不放的话,整个系统可能会崩溃了。[ ...

大神可以指导下吗
ID:350902 发表于 2020-3-7 12:13
xuyaqi 发表于 2020-3-7 09:52
你都有 delay50ms(20);,应该会自己建10ms延时程序。

延时程序会写,但是不知道怎么放到这个按键检测里面去,怎么才能防抖。
ID:94031 发表于 2020-3-7 09:52
你都有 delay50ms(20);,应该会自己建10ms延时程序。
ID:697884 发表于 2020-3-7 09:18
   while(P1!=0xff);//等待松手
如果这样玩的话,用户如果一直按住按键不放的话,整个系统可能会崩溃了。
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:235200 发表于 2020-3-7 02:05
switch(P1)//检测几号按键按下
        {
                case 0xfe://1号
                beep = 1;        //蜂鸣器响
                delay50ms(20);
                beep = 0;
               break;
        }这不已经加了延时程序了?后面加1个break;就行了

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

Powered by 单片机教程网

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