打印

按键预处理程序,可实现消抖、长击连击等, 可扩充

[复制链接]
3867|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhanan|  楼主 | 2008-7-18 14:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
uchar mjz;  // 外部可使用的键值, 相当于一个信号旗, 其他程序只需根据其值作简单判断

#define ANYS 25  // 延长多长时间连击
#define ANJG 1   // 连击间隔

void key(void)   // 按键预处理程序, 每40mS处理一次
{
  static uchar njzbf, njzjs;   // 键值备份、键值计时
  uchar njz;                   // 键值
  
  njz=~P1;     // 读端口( 或者读变量, 并且处理为规范的键值)
  
  if(njzbf!=njz) {njzbf=njz; njzjs=0;}   // 新键值, 保存到键值备份, 键值计时清0

  if(  njzjs==1                          // 消抖

     ||(njz==4||njz==2)&&njzjs==ANYS     // 只有特定的键值具有连击功能
    
    )  mjz=njz;   // 键值有效, 传给全局变量供其他程序使用
  else mjz=0;     // 键值无效, 清mjz

  njzjs++; if(njzjs>ANYS) njzjs-=ANJG;   // 延时时间25, 连击间隔1, 若key每40mS处理一次则延时为1S, 25次/S
}


/*** 以上是一个可塑性很强的按键预处理程序
  适当修改还能进行长按处理(即按键一直按下后等一会才有反应)
***/

相关帖子

沙发
zhanan|  楼主 | 2008-7-18 14:12 | 只看该作者

连加 连减

switch (mjz)
{
    case 4:     // 设定值+
      if( msz1.nr<msz1.sx )    // 低于上限
      {
        msz1.nr++;  // 设定值+
      }
      break;
    case 2:     // 设定值-
      if( msz1.nr>msz1.xx )   // 高于下限
      {
        msz1.nr--;  // 设定值-
      }
      break;
}

使用特权

评论回复
板凳
john_light| | 2008-7-18 14:27 | 只看该作者

这样的变量我看着有点晕

路过

使用特权

评论回复
地板
sz_kd| | 2008-7-18 14:31 | 只看该作者

有点

使用特权

评论回复
5
边锋软件| | 2008-7-19 17:51 | 只看该作者

留个脚印先

使用特权

评论回复
6
huangqi412| | 2008-7-19 18:32 | 只看该作者

占位

使用特权

评论回复
7
古道热肠| | 2008-7-20 09:47 | 只看该作者

是有点晕,最好搞个测试项目.

使用特权

评论回复
8
zhanan|  楼主 | 2008-7-20 11:34 | 只看该作者

怎么都说有点晕呢

变量名称只是个符号而已, 用的是汉字拼音首字母.
一楼是个完整的程序, 有明确的入口(读端口)和出口(输出当前的键值), 本身就是一个读键盘程序,也可以和扫描式键盘程序配合, 输出键值在其他程序中直接使用(一般是判断). 按键按下消抖后发出一个键值, 若一直按着延时后连发键值, 间隔中键值自动清零. 哪个键可连发是可选择的, 比如设定值中, +-键可连发, 保存或者选择键就用不着连发.

     按键按下     延时          连击    连击    连击    按键释放
         消抖
 ____|-----------------------------------------------|__________
              第一个键值        键值    键值    键值
 
二楼举例说明了在使用上是如何的简单.
而且顺着这个思路, 可以扩展到对IO输入的处理上.(IO的输入也有防抖方面的要求). 将内部变量变为全局变量应用更灵活, 比如用jzjs去控制数码管的闪烁.
算了, 不解释了, 能看进去的就知道多么方便好用.

使用特权

评论回复
9
农民讲习所| | 2008-7-20 13:33 | 只看该作者

这是两套程序

模块化:一套就是KEY的扫描:产生KeyDown和KeyPop,一套就是KEY的转义:扩展KEY的功能为长按、连击......
别混在一起思考。

使用特权

评论回复
10
ustbyf| | 2010-3-14 14:55 | 只看该作者
楼主的程序思路很好,但是写法就是个小学生!  没水平!

使用特权

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

本版积分规则

9

主题

173

帖子

0

粉丝