蓝桥杯嵌入式按键扫描思路 笔记

按键有两种模式

①支持连按(例如电视调台长按持续换台)

②不支持连按

 

C语言小知识

C语言关键字 static声明的静态变量存储在静态存储区。

它在函数调用结束之后,不会被释放。它的值会一直保留下来。所以可以说static申明的局部变量,具有记忆功能。

Q:每次调用getValue函数之后,返回值是多少?

int getValue(void)

{

  int  flag=0;

  flag++;

  return flag;

}
int getValue(void)

{

  static int  flag=0;

  flag++;

  return flag;

}

 

解释

前者每次调用getValue函数,flag都会被重新置0(每次调用函数,flag都=0);而后者第一次调用了getValue函数,flag被正常置0,当第二次调用此函数时,flag则不会被重新赋值,而是等于上一次调用的返回值。(第二次调用函数,flag=1,第三次调用,flag=2...)

 

接下来可以写不同模式的按键函数啦

①支持连按的一般思路

 u8 KEY_Scan(void)

    {

      if(KEY按下)

     {

           delay_ms(10);//延时10-20ms,防抖。

           if(KEY确实按下)

            {

               return KEY_Value;

             }

          return 无效值;

     }

    }

 

 

②不支持连续按

思路:判断上一次的状态,如上一次是松开的状态,表示这次按下是有效的;上一次本就是按下的,表示这次按下的状态只是因为连按的影响,而不是真正的第二次按下,所以说这次就是无效的)

 u8 KEY_Scan(void)

    {

     static u8 key_up=1;  //因为key_up要保留上一次的值用来判断上一次按键的状态,所以不能被重新赋值

      if(key_up &&  KEY按下)

      {

        delay_ms(10); //延时,防抖

        key_up=0;  //标记这次key已经按下,下一次调用函数,如果按键没有松开,则key_up一直为0,则按键无效

        if(KEY确实按下)

          {

           return KEY_VALUE;

          }

        }else if(KEY没有按下)  key_up=1;  //判断按键没有被按下,key_up=1

       return 没有按下

    }

 

 

③两种模式合二为一

即有一个mode的入口参数,mode=1,支持连续按,mode=0,不支持连续按

 u8 KEY_Scan(u8 mode)

    {

     static u8 key_up=1;

     if(mode==1) key_up=1; //支持连续按,比上面那个函数写法只多了这一行

      if(key_up &&  KEY按下)

      {

        delay_ms(10);//延时,防抖

        key_up=0;//标记这次key已经按下

        if(KEY确实按下)

          {

           return KEY_VALUE;

          }

        }else if(KEY没有按下)  key_up=1;

       return 没有按下

    }

解释

mode=1,即支持连续按,key_up一直=1,则等于下面这种效果,即同①

 u8 KEY_Scan(u8 mode)

    {

     static u8 key_up=1;     //无效

     if(mode==1) key_up=1; //支持连续按

      if(key_up &&  KEY按下)

      {

        delay_ms(10);//延时,防抖

        key_up=0;//标记这次key已经按下

        if(KEY确实按下)

          {

           return KEY_VALUE;

          }

        }else if(KEY没有按下)  key_up=1;

       return 没有按下

    }

 

 

 

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值