按键扫描程序曾让多少人都头疼过,肯多很多人都曾遇到过

[复制链接]
12524|51
richardji 发表于 2010-7-22 10:38 | 显示全部楼层
10ms定时器扫描加按键状态判断,这么简单的做法,不知道你们老师是怎么教的。。。
lost1421 发表于 2010-7-22 10:55 | 显示全部楼层
见无数教师、工程师、学生写的按键扫描程序,写的都是读引脚,有按键按下,delay(10ms),再读,直到按键释放。说实话这种代码就是垃圾!delay(10ms)MCU可以处理很多事情。如果MCU进入低功耗状态可以省很多能量(在这个叫嚣着绿色经济,节约能源的时代)。
我也拜读了Hopower的方案,该方案耗费太多RAM,同时无法识别多个按键同时按下的状况。
我曾经在某个杂志里读到一篇**是关于如何去抖的,这可能目前国内的工程师研究按键去抖比较好的,但是我还没有测试多个按键同时按下的状况。

系统中使用定时器进行1ms定时中断,在中断中        “K_Process ++;”,在主程序中轮询Read_Keys,根据K_Output输出的值是否为零判断是否有按键。
-----------------------------------------------------------------------------------------------------------------
#define K_Const        0x00        // 0~7位中某一位(bit)为1时,表示允许对应位的按键长时间按下则重复输出,
                        // 对应位为0表示该按键只允许单次按键按下
unsigned char K_Temp;
unsigned char K_Store;
unsigned char K_Ready;

unsigned char K_Process;
/*=================================================
Name                : Read_Keys
OUT                        :
Description        : If the key is confirmed, return 1,
                          else no key is pressed, return 0.
=================================================*/
unsigned char Read_Keys(void)
{
//        unsigned char K_Input;
        unsigned char K_Output;

        if (K_Process < 20)
                return 0;

        K_Process = 0;

        K_Output = ~P1 & 0x0F;        // P0~P3为按键接口

        K_Ready = K_Temp & K_Output | K_Ready & (K_Temp ^ K_Output);        // 去抖表达式
        K_Temp = K_Output;
        K_Output = K_Ready & (~K_Store | K_Const);        // 用于输出重复键和非重复键
        K_Store = K_Ready;

        return K_Output;
}
-----------------------------------------------------------------------------------------------------------------

但是这个中断去抖操作不是我看到的最好的按键去抖方案。考虑到别人版权问题,不便公开,大家可以去国外的某些论坛去看看,有些工程师曾经讨论过那个方案,国内的工程师的进取心和创新能力让人揪心啊!
donlcn 发表于 2010-7-22 11:08 | 显示全部楼层
路过 学习
xuhai20092009 发表于 2010-7-22 11:58 | 显示全部楼层
学习了!
wzl-xx@163.com 发表于 2010-7-22 12:02 | 显示全部楼层
用定时器定时扫描??如果定时器还需要有其它用处,或是定时器不够用的时候,还能用定时器么?
如果在主程序里检测键盘,而又不用延时检测,那应该怎么检测呢???
延时浪费时间,定时器定时浪费资源,那用什么方法才最好????
cleaver.Yeh 发表于 2010-7-22 12:26 | 显示全部楼层
看看都是被大学老师害的.要知道教科书与时代脱节好多年了.
大学风气不好,两耳不闻窗外事的都只信教科书,静不下心的又不去钻技术.结果是大学培养不出实用的工程师!
kuyu20 发表于 2010-7-22 12:44 | 显示全部楼层
按键处理程序流程,没处理多击和长短键,不过在这个框架上添加很容易。

欢迎拍砖!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
kuyu20 发表于 2010-7-22 12:48 | 显示全部楼层
按键处理流程。没有多击和长短键处理,不过在这个框架下添加很容易。

欢迎拍砖!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
kuyu20 发表于 2010-7-22 12:48 | 显示全部楼层
补个PDF的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
huangqi412 发表于 2010-7-22 13:16 | 显示全部楼层
无语。。。。。。。。。

就在砍版里,随便搜下几个斑竹,酱银,小狼都发过。
huangqi412 发表于 2010-7-22 13:16 | 显示全部楼层
按键也算是看板几大景之一,   隔阵要翻出来炒一次,哈哈。
huangqi412 发表于 2010-7-22 13:17 | 显示全部楼层
哦,对拉,以往貌似两位大师都有进来斗嘴的, 今天不进来?
一棵小草 发表于 2010-7-22 13:17 | 显示全部楼层
不发表意见,发帖得分
PowerAnts 发表于 2010-7-22 13:28 | 显示全部楼层
会不会是两个马甲互洽,一人得"利",哈...  :shutup:
yytdragon 发表于 2010-7-22 13:34 | 显示全部楼层
继续……
maxmin 发表于 2010-7-22 13:43 | 显示全部楼层
时间有得是,加个几元MCU不就成了?
zhf0964 发表于 2010-7-22 13:58 | 显示全部楼层
留个记号。
btxtyb 发表于 2010-7-22 15:20 | 显示全部楼层
雪山飞狐D 发表于 2010-7-22 15:36 | 显示全部楼层
本帖最后由 雪山飞狐D 于 2010-7-22 15:53 编辑

远没有楼上那些那么复杂~~~

#include<pic.h>

void key()
{   
    if (key_stat==2)
    {   
         
         if (GPIO3==1)                               //按键松手检测, GPIO3=0 为按下
        {      
              
                 key_stat=0;       //次数状态      
                 flag=1;     //flag 按键标志
              
          }
    }
    else

    {

      flag=0;     

    }  
   
}

void interrupt ISR()
{

             if ((TMR1IF==1)&&(TMR1IE==1))                        //定时器1按键中断扫描

             {
                         TMR1IF=0;
                         if (GPIO3==0)                                                   //检测按键按下
                      {   

                          if ((key_stat==0)||(key_stat==1))                      //间隔扫描2次
                           {
                               key_stat+=1;
                           }  
                        
                       }
             }
                     
     }  
   
}
xxdcq 发表于 2010-7-22 16:10 | 显示全部楼层
不能一概而论
根据需要而定
每个人的做法是不一样的
白猫黑猫抓老鼠就是好猫
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部