矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 18955|回复: 12

自己写一个长短按键检测程序,以后制作少用按键

[复制链接]
     
发表于 2011-3-27 12:28:26 | 显示全部楼层 |阅读模式
#define  K    P0_7                 //独立按键
#define  ON    0                   //按键按下的电平值
#define  OFF   1
#define JSQ_L  5                  //消除抖动计数器门限下限
#define JSQ_H  60                 //消除抖动计数器门限上限
#define  KEY_SHORT  0X20          //自定义短按标志
#define  KEY_LOG     0X22         //自定义长按标志
#define  DLEPY   f()              //f()是系统中实时性要求较高的函数,在这里插入充当消抖可以兼顾实时性方面的要求
/********************************************************************
函数名称:按键检测
**********************************************************************/
unsigned char key_scan(void)
{
unsigned char timer=0,key_vlu=0;
  while(K==ON)
     {
  DELPY;
  timer++;                  //按键计数器计数
  if(timer>JSQ_H) break;    //溢出退出
  }
  if(timer> JSQ_L  && timer< JSQ_H)  key_vlu=KEY_SHORT;   //判为短按
  if( timer >JSQ_H )   key_vlu=KEY_LOG;                   //判为长按
  return ( key_vlu );
}

评分

1

查看全部评分

     
发表于 2011-3-29 08:22:20 | 显示全部楼层
很实用。
回复 支持 反对

使用道具 举报

发表于 2011-3-29 19:24:12 | 显示全部楼层
用中断定时的方式进行动态扫描效率如何
回复 支持 反对

使用道具 举报

     
发表于 2011-3-29 20:56:52 | 显示全部楼层

回复 4# 风之澜 的帖子

用中断当然好了,先用定时器设定一定的时间不断检测是否有健按下,然后设定按下的标志,
再在主程序中判断标志的到来,再用定时器行走一段时间来去抖动,然后再做按键所做的工作,最后好要记得把按键按下标志清0,出差一周刚回来,特上矿坛发帖
回复 支持 反对

使用道具 举报

     
发表于 2011-3-29 21:17:01 | 显示全部楼层

回复 4# 风之澜 的帖子

一般都是用的中断
楼主这样不是很好
回复 支持 反对

使用道具 举报

发表于 2013-5-28 09:58:31 | 显示全部楼层
xiaomu 发表于 2011-3-29 20:56
用中断当然好了,先用定时器设定一定的时间不断检测是否有健按下,然后设定按下的标志,
再在主程序中判断 ...

能不能简单的写个实例代码呀,不会用中断扫描,
谢谢。 还只会用软件死延时的方法去抖动。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2013-6-3 12:52:57 | 显示全部楼层
cainiao55 发表于 2011-3-29 21:17
一般都是用的中断
楼主这样不是很好


看字要用心,帖子的主旨是“ 判断按键是长时间按下还是短时间按下(犹如电报里的长短音)”来做区分功能,目的是节约端口,按键,不是谈论 按键消抖的问题.....谢谢
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2013-6-3 12:55:58 | 显示全部楼层
luosifu 发表于 2011-3-28 10:05
提一个建议
  while(K==ON)
这样的语句尽可能减少,不然的话你一直按住按键单片机在BREK之前就不能干别的 ...

论坛元老您好,我明白的的意思了,其实while(K==ON)循环体里有是用timer++做超时退出的,本质及结果和你说的是一样的,谢谢
回复 支持 反对

使用道具 举报

     
发表于 2013-6-3 14:13:49 | 显示全部楼层
我还是主张用定时器,不然如果有数码管扫描,按下按键会短时打断扫描。
不过不同判断方式有不同的好处,按情况来吧……
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2013-6-3 19:55:02 | 显示全部楼层
Edward 发表于 2013-6-3 14:13
我还是主张用定时器,不然如果有数码管扫描,按下按键会短时打断扫描。
不过不同判断方式有不同的好处,按 ...

目的是节约端口,按键,不是谈论 按键消抖的问题.....谢谢
回复 支持 反对

使用道具 举报

     
发表于 2013-6-3 20:48:19 | 显示全部楼层
yangcheng84 发表于 2013-6-3 19:55
目的是节约端口,按键,不是谈论 按键消抖的问题.....谢谢

怎么你用这个就能节省端口?我用定时器是1个端口,你的程序就能不用端口?
回复 支持 反对

使用道具 举报

     
发表于 2013-6-3 20:54:51 | 显示全部楼层
  1. /*---------------------------------------------
  2. Key Scan Function

  3. Input  void
  4. Output void
  5. ---------------------------------------------*/
  6. void KeyScan(void)
  7. {
  8.         if(!S1)
  9.         {
  10.                 Delay(0);
  11.                 if(!S1)                   //>2s Long time
  12.                 {
  13.                         if(!KeyScanjud)
  14.                         {
  15.                                 countdwn0=0;
  16.                                 KeyScanjud=1;
  17.                         }
  18.                 }
  19.                 if(countdwn0>12)  //Light a LED
  20.                 {
  21.                         switch (dispmod)
  22.                         {
  23.                         case 0:Dat[6]=0xFF;break;
  24.                         case 1:Dat[0]=0xFF;break;
  25.                         }
  26.                 }
  27.         }
  28.         else                   //<2S Short time
  29.         {
  30.                 if(KeyScanjud)
  31.                 {
  32.                         if(countdwn0>12)KeyLong=1;
  33.                                 else KeyShort=1;
  34.                         KeyScanjud=0;
  35.                 }
  36.         }
  37. }
复制代码
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2013-6-4 21:52:01 | 显示全部楼层
Edward 发表于 2013-6-3 20:54

谢谢指导,谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-30 10:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表