打印

那位帮我看看我这个键盘程序是否有问题(有流程图)

[复制链接]
1082|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
solo777|  楼主 | 2014-1-17 22:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

u8 getkey2()
{
     u8 static key_scaned_times_counter;
     u8 static last_key_scan_flags;
     u8 key_scan_flags=0,key_return=0;
     BitStatus pin_read_result;
     KEY_SCAN_STATUS static key_scan_status=NO_KEY_SCANED;
    //这里是开始读取key
    pin_read_result=GPIO_ReadInputPin (KEY_GPIO_PORT,KEY_0);
   if(pin_read_result)
   {
     key_scan_flags|=KEY0_FLAG;
   }
   //扫描key1,这些都是低有效  youbian pc2
   pin_read_result=GPIO_ReadInputPin (KEY_GPIO_PORT,KEY_1);
   if(!pin_read_result)
   {
     key_scan_flags|=KEY1_FLAG;
   }
   //扫描key2  //zuobian pc3
   pin_read_result=GPIO_ReadInputPin (KEY_GPIO_PORT,KEY_2);
   if(!pin_read_result)
   {
     key_scan_flags|=KEY2_FLAG;
   }
   //这里没有扫到按键也是要进入判断程序的


   switch(key_scan_status)//使用前面的key_scan_flags数据
    {
            case NO_KEY_SCANED:
           if(key_scan_flags!=0)
           {//只有按键按下,才保留前序值。
              last_key_scan_flags=key_scan_flags;
              key_scaned_times_counter=0;
              key_scan_status=KEY_SCANED;
           }
                   
             break;
            case KEY_SCANED:
            if(last_key_scan_flags==key_scan_flags)
            {
                    key_scaned_times_counter++;
                if(key_scaned_times_counter>250)
                  key_scaned_times_counter=0;
                //如果一直按着建,那么255个重复扫描到长按
                 if(key_scaned_times_counter==40)
                 {
                           switch(key_scan_flags)
                            {
                                    case KEY0_FLAG:
                                         key_return=KEY_0_LONG_CODE;
                                     break;
                                     case KEY1_FLAG:
                                         key_return=KEY_1_LONG_CODE;
                                     break;
                                     case KEY2_FLAG:
                                         key_return=KEY_2_LONG_CODE;
                                     break;
                                     case KEY3_FLAG:
                                         key_return=KEY_3_LONG_CODE;
                                     break;

                            }
                 }

            }
            else
            {//如果按键和前面的不同,但是也不是0,那么什么也不做。不执行这里的任何代码
              //只有相同的才能加计数器,只有不同的,但是0,才有机会设置返回值。
              //只有相同,才能加计数器,才能返回long,只有按键标记是定义的几个,才能返回真正的值,其他只是加计数器
              if( key_scan_flags==0&&
                 (key_scaned_times_counter<5||
                 key_scaned_times_counter>30)
                )
              {//如果松下时间小于5或者大于30,都是取消按键,大于30
                    //只要在按键按入的情况下,和上次按键不同了,那就不扫描了
                    key_scan_status=NO_KEY_SCANED;
               // last_key_scan_flags=key_scan_flags;
              }
              if(key_scan_flags==0&&
                 key_scaned_times_counter>=5&&
                 key_scaned_times_counter<=30)//30和40之间的,不知道长度,不识别。
              {//按下时间大于5,松开时间小于30,则是单击
                key_scan_status=NO_KEY_SCANED;
                        switch(last_key_scan_flags)
                            {
                                    case KEY0_FLAG:
                                         key_return=KEY_0_CODE;
                                     break;
                                     case KEY1_FLAG:
                                         key_return=KEY_1_CODE;
                                     break;
                                     case KEY2_FLAG:
                                         key_return=KEY_2_CODE;
                                     break;
                                     case KEY3_FLAG:
                                         key_return=KEY_3_CODE;
                                     break;

                            }
              }
            }
            
                    break;
                   
    }
  return key_return;
}


相关帖子

沙发
solo777|  楼主 | 2014-1-17 22:08 | 只看该作者
这段代码支持单击和长按。不支持多个建同时按下。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

83

主题

375

帖子

2

粉丝