打印

贴条按钮检测程序

[复制链接]
1393|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mugenwon|  楼主 | 2008-7-11 18:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本来要下班了却被老板拉住,无聊决定贴个简单的程序。c版本。

if(f_chackbut)
{
    //按钮扫描第一行            
    if(IN1)        //按键弹起
        fbut[0][timep3]=BUTS_UP;                
    else                            //按键按下
    {    if(fbut[0][timep3]==BUTS_UP)
            fbut[0][timep3]=BUTS_DOWN;
        else if(fbut[0][timep3]==BUTS_DOWN)
            fbut[0][timep3]=BUTS_DO;
        else;
    }
    if(fbut[0][timep3]==BUTS_DO)   //按钮有效
    {    
        if(timep3==0)
            fbutdo_0=1;
        else if(timep3==1)
            fbutdo_1=1;
        else if(timep3==2)
            fbutdo_2=1;
        else   
            fbutdo_3=1;

        fbut[0][timep3]=BUTS_NONE;
    }
}

以下再添加说明

相关帖子

沙发
mugenwon|  楼主 | 2008-7-11 18:17 | 只看该作者

变量定义

uchar timep3=0;                    //记录处理P3输出按键
bit f_chackbut=0;                //检查按钮
uchar fbut[3][4];                //12个按钮的检查状态
#define BUTS_UP        1            //按键弹起
#define BUTS_DOWN    2            //按下
#define BUTS_DO        3            //按下有效,要做也
#define BUTS_NONE    0            //做完也

bit fbutdo_0;                    //12个按钮按下有效的标志位(作也指令)
bit fbutdo_1;
bit fbutdo_2;
bit fbutdo_3;

使用特权

评论回复
板凳
mugenwon|  楼主 | 2008-7-11 18:28 | 只看该作者

说明

此程序原本能进行4x3键盘扫描输入的,为了节省字数,第一个贴只贴第0~3个按键的扫描程序,其余省略。

我把按钮分开4种状态:弹起失效状态,刚按下状态,按下足够时间状态,再次弹起状态(此次按钮判断为一次有效的按下动作)
timep3 是在定时器里面不断改变的值,从0~3反复变化,每变一次改变一下行输出的0位置。改变一次行的状态后,把f_chackbut置1,然后在主程序调动扫描子程序。程序返回该按钮的结果(如 fbutdo_0)。程序其他部分通过判断这个结果来进行处理。为简单起见该子程序没有返回值和参数。
按键消抖时间取决于定时器执行改变行的时间。

好处:检查按键不会对程序实时性产生任何影响。按键检查全自动操作并返回结果。
缺陷:不管任何时候按下按键,只要有效都会设置有效标志位(如fbutdo_0),程序必须加入判断这个标志位有无用,要不要清除的机制。应该根据程序的状态加入按键仲裁机制才能做到完美。

另外程序还能优化,请自行处理哈哈。
此程序思想一直稳定应用于某个产品中。

使用特权

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

本版积分规则

96

主题

430

帖子

3

粉丝