一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 4871|回复: 10
收起左侧

[其他综合] 判断按键放开

[复制链接]
发表于 2011-7-27 12:55 | 显示全部楼层 |阅读模式
通常人都会使用 while(!key)   这句来判断按键放开,使程序按一次按钮产生一次按按钮的效果,但这样写如果长期按住、或开关内有水份那么程序会一直死在这一句上。  
请问大家有什么好方法判断按键(松手)放开吗?
发表于 2011-7-27 13:03 | 显示全部楼层
中断;给个变量,按键按下的时候加数,松开后检测数值大小,再做相应判断。
发表于 2011-7-27 17:29 | 显示全部楼层
用 if 来判断不就不会死了吗
发表于 2011-7-27 17:53 | 显示全部楼层
使用IF语句 + 定时器
三种状态:松开、跳变、长按
发表于 2011-7-27 19:25 | 显示全部楼层
本帖最后由 lihongran 于 2011-7-27 19:35 编辑

我是这样做的,不管键按多长时间,都不会出现你说的会死在这~~
   case 1:
     if( KValue == Key_Set ) //P2.3(SET)被按下
     {  
        if(!KEY_a)           SET_Counter++;         //KEY_a为0才进行自加

        if(SET_Counter==23)  SET_Counter=0;  //要设置23项参数,故取值0~22之间
        KEY_a=1;
     }
     else if( KValue == Key_Move ) //P2.0移位键被按下,退出菜单设置,长按左移键约3秒退出菜单参数设置
     {
        KeyCounter++;
        if(KeyCounter>=150)
        {
           Ssp_Erase(0);                 //先擦除扇区
           SaveData_Mute();            //保存菜单值
           SET_Counter=0;             //清按键值,即菜单值
           SETorTEM_disp_flag=0;   //清0,以便退出后能显示测量温度及设置值
           KeyCounter = 0;
           return;
        }
      }
     ......


补充:在无键按下时要清零 KEY_a
 楼主| 发表于 2011-7-28 12:52 | 显示全部楼层
我试写了一个,自我感觉良好。
/********************************************
P3.7 按SWITCH  每按一下SW P1口状态值加 1.
********************************************/
#include <at89x52.h>
typedef   unsigned char  uint8;
typedef   unsigned int   uint16;
typedef   char              int8;
typedef   int            int16;
bit Key = 0;
/*******************************************/
void delay(void)
{
    uint16 i=1000;
    while (i--);
}
/*******************************************/
int main()
{
    int8 num = 0;
    while(1)
    {
        P1 = ~num;
        if ((!P3_7)&&(!Key))
        {
            delay();
            if((!P3_7)&&(!Key))
            {
                Key = 1;
                num++;
            }
        }
        else
        {
            if(P3_7)
                Key = 0;   
        }
        /* P3_0 = 0;//指示灯开
        delay();
        delay();
        delay();
        delay();
        delay();
        delay();
        P3_0 = 1;//指示灯关
        delay();
        delay();
        delay();
        delay();
        delay();
        delay(); */
    }
}
发表于 2011-7-28 22:22 | 显示全部楼层
消除键抖很多人习惯使用 delay ,我不用~~
 楼主| 发表于 2011-7-29 19:28 | 显示全部楼层
消除键抖很多人习惯使用 delay ,我不用~~
lihongran 发表于 2011-7-28 22:22 [url=https://www.yleee.com.cn/images/common/back.gif]https://www.yleee.com.cn/images/common/back.gif[/url]



    麻烦你就按6楼功能写了一个不用 delay消除键抖的谢谢!
发表于 2011-7-30 10:18 | 显示全部楼层
在定时器中断里判断(摘抄自草真多版主的“翻页钟”源程序)

#define KEY_VAL 5 //定义按键手感.为25ms*KEY_VAL
sbit key=P1^0;
bit key_flag=0;   //按键标志位
unsigned char ka=0;  //按键用
.....................
void timer() interrupt 1
{
     ....................
    if(ka!=0)
{   
        ka--;
        if(ka==0 && key==0) key_flag=1;
    }  
else if(key_flag==0) ka=KEY_VAL;
  ...........
}
发表于 2011-7-30 10:19 | 显示全部楼层
如果做产品用很多Delay,很麻烦的,特别是比较复杂的系统。

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-4-29 04:51 , Processed in 0.056454 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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