打印

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

[复制链接]
楼主: 电子三极管
手机看帖
扫描二维码
随时随地手机跟帖
21
10ms定时器扫描加按键状态判断,这么简单的做法,不知道你们老师是怎么教的。。。

使用特权

评论回复
22
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;
}
-----------------------------------------------------------------------------------------------------------------

但是这个中断去抖操作不是我看到的最好的按键去抖方案。考虑到别人版权问题,不便公开,大家可以去国外的某些论坛去看看,有些工程师曾经讨论过那个方案,国内的工程师的进取心和创新能力让人揪心啊!

使用特权

评论回复
23
donlcn| | 2010-7-22 11:08 | 只看该作者
路过 学习

使用特权

评论回复
24
xuhai20092009| | 2010-7-22 11:58 | 只看该作者
学习了!

使用特权

评论回复
25
wzl-xx@163.com| | 2010-7-22 12:02 | 只看该作者
用定时器定时扫描??如果定时器还需要有其它用处,或是定时器不够用的时候,还能用定时器么?
如果在主程序里检测键盘,而又不用延时检测,那应该怎么检测呢???
延时浪费时间,定时器定时浪费资源,那用什么方法才最好????

使用特权

评论回复
26
cleaver.Yeh| | 2010-7-22 12:26 | 只看该作者
看看都是被大学老师害的.要知道教科书与时代脱节好多年了.
大学风气不好,两耳不闻窗外事的都只信教科书,静不下心的又不去钻技术.结果是大学培养不出实用的工程师!

使用特权

评论回复
27
kuyu20| | 2010-7-22 12:44 | 只看该作者
按键处理程序流程,没处理多击和长短键,不过在这个框架上添加很容易。

欢迎拍砖!

未命名.gif (24.8 KB )

按键处理流程

按键处理流程

按键处理流程图.pdf

27.83 KB

使用特权

评论回复
28
kuyu20| | 2010-7-22 12:48 | 只看该作者
按键处理流程。没有多击和长短键处理,不过在这个框架下添加很容易。

欢迎拍砖!

未命名.gif (24.8 KB )

按键处理流程

按键处理流程

使用特权

评论回复
29
kuyu20| | 2010-7-22 12:48 | 只看该作者
补个PDF的

按键处理流程图.pdf

27.83 KB

使用特权

评论回复
30
huangqi412| | 2010-7-22 13:16 | 只看该作者
无语。。。。。。。。。

就在砍版里,随便搜下几个斑竹,酱银,小狼都发过。

使用特权

评论回复
31
huangqi412| | 2010-7-22 13:16 | 只看该作者
按键也算是看板几大景之一,   隔阵要翻出来炒一次,哈哈。

使用特权

评论回复
32
huangqi412| | 2010-7-22 13:17 | 只看该作者
哦,对拉,以往貌似两位大师都有进来斗嘴的, 今天不进来?

使用特权

评论回复
33
一棵小草| | 2010-7-22 13:17 | 只看该作者
不发表意见,发帖得分

使用特权

评论回复
34
PowerAnts| | 2010-7-22 13:28 | 只看该作者
会不会是两个马甲互洽,一人得"利",哈...  :shutup:

使用特权

评论回复
35
yytdragon| | 2010-7-22 13:34 | 只看该作者
继续……

使用特权

评论回复
36
maxmin| | 2010-7-22 13:43 | 只看该作者
时间有得是,加个几元MCU不就成了?

使用特权

评论回复
37
zhf0964| | 2010-7-22 13:58 | 只看该作者
留个记号。

使用特权

评论回复
38
btxtyb| | 2010-7-22 15:20 | 只看该作者

使用特权

评论回复
39
雪山飞狐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;
                           }  
                        
                       }
             }
                     
     }  
   
}

使用特权

评论回复
40
xxdcq| | 2010-7-22 16:10 | 只看该作者
不能一概而论
根据需要而定
每个人的做法是不一样的
白猫黑猫抓老鼠就是好猫

使用特权

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

本版积分规则