按键扫描C语言思路

按键扫描(支持连续按)的一般思路

 u8 KEY_Scan(void)
    {
      if(KEY按下)
     {
           delay_ms(10);//延时10-20ms,防抖。
           if(KEY确实按下)
            {
               return KEY_Value;
             }
          return 无效值;
     }
    }

按键扫描(不支持连续按)的一般思路

static 关键字

定义一个静态变量,兼具静态存储的局部变量。和自动变量具有相同的作用域,但当包含这些变量的函数完成工作时,它们并不消失

 u8 KEY_Scan(void)
    {
     static u8 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 没有按下
    }

static u8 key_up=1; 语句并不是函数的一部分,因为静态变量和全局变量在程序调入内存是就已经就位了。运行函数是static u8 key_up=1; 看起来是跳过了。key_up的存储类是空连接的静态。
函数中 static u8 key_up=1; 定义后,当KET_Scan运行结束后,key_up并不消失,而是保留了赋予的0值,函数下一次运行时仍旧是执行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 没有按下
    }

支持连续按时,在if(key_up && KEY按下)判断语句外,key_up 都会等于1,一直返回KEY_VALUE,
不支持连续按,if(mode==1) key_up=1;失效,按下一次后,key_up=0,不会返回KEY_VALUE。

你可能感兴趣的:(c语言)