一个按键怎么实现长短按键,以实现两种或多种功能?

2020-01-30 13:34发布

一个按键怎么实现长短按键,以实现两种或多种功能?

老师们,请问问一个按键怎么实现不同的功能呢?简单的根据变量的值不同,来执行不同的功能已经会了。
现在的问题是:硬件只有一个按键,比如一般按下键(一般500MS,1S钟)就给一个变量 "VALUE",加一,然后送给打印机打印。比如长按按键(达到5S钟以上),就将这个变量 VALUE 清零。这个怎么做呢要,?谢谢大家。
现在用了死的键盘检测程序:可以实现按一下打印一下变量
VALUE 的值了。长短按的不知道怎么实现,谢谢大家!

sbit KEY1 = P2^2;

if (KEY1 == 0)
{
        delay_ms(10);
        if(KEY1 == 0)
        {
                VALUE ++;
                if(VALUE >= 100 )
                {
                        VALUE = 0;
                }
         while(KEY1 == 0);
        Print_data();//打印数据VALUE函数
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
43条回答
sydlt
1楼-- · 2020-01-31 13:58
给你一段我的,C 程序,中断
/*
中断调用函数
5MS中断
*/
void        Keys()// 0 表示 无效 1 表示 短按, 2 表示 长按
{
        Key_U = 1;

        if(!Key_U)
        {
                if(Key_Num < 250)//不到3 s
                        Key_Num++;// Key_Num * 20ms
                else
                        Key_U_N = 2;//如果键被按下 3 秒
        }
        else//如果松开了按键
        {
                if(Key_Num > 3 & Key_Num < 250)//如果键被按下不到 3 秒  不能用 0 < Key_Num <150
                {
                        Key_U_N = 1;//短按
                }
                Key_Num = 0;
        }

        Key_D = 1;

        if(!Key_D)
        {
                if(Key_Num1 < 250)//不到3 s
                        Key_Num1++;// Key_Num * 20ms
                else
                        Key_D_N = 2;//如果键被按下 3 秒
        }
        else//如果松开了按键
        {
                if(Key_Num1 > 3 & Key_Num1 < 250)//如果键被按下不到 3 秒  不能用 0 < Key_Num <150
                {
                        Key_D_N = 1;//短按
                }
                Key_Num1 = 0;
        }
}
mengguma
2楼-- · 2020-01-31 19:42
呵呵  学习了
shgdd520com
3楼-- · 2020-02-01 01:15
 精彩回答 2  元偷偷看……
qhshilin
4楼-- · 2020-02-01 03:11
mark1
wallyone
5楼-- · 2020-02-01 08:52
正好 本人正在寻找此类程序
zqhdevelopment
6楼-- · 2020-02-01 10:17
#include<reg51.h>
#include<intrins.h>
sbit buzz=P1^0;
unsigned char keyscan(void);
void main(void)
{
        keyscan();

}

unsigned char keyscan(void)
{
        unsigned char k;
        unsigned char c=0;
        P0=0xff;                                //关闭输出驱动场效应管
        buzz=1;                                        //关蜂鸣器
        if(P0!=0xff)                        //判断是否有键按下
        {
                k=P0;                                //读按键值
                _nop_();                        //延时
                if(k==P0)                        //假如判断还有信号,再延时
                {
                        k=P0;                        //重新取值,作为下次判断的依据
                        _nop_();                //延时
                        if(k==P0)                //确认实在有按键信号,蜂鸣器蜂鸣,返回按键值
                        {
                                while(((c++)<200)&&(k==P0))
                                {
                                        _nop_();//延时//此延时是长按键的时间

                                }
                                if(c==200)
                                {
                                        switch(k)//不同按键的长短按功能选择
                                        {
                                                case 0x7f:break;
                                                case 0xbf:break;
                                                case 0xdf:break;
                                                case 0xef:break;
                                                case 0xfe:break;
                                                case 0xfd:break;
                                                case 0xfb:break;
                                                case 0xf7:break;
                                                default:k=0x00;break;

                                        }

                                }

                                buzz=0;        //有真正的按键时,蜂鸣器鸣器

                        }
                        else
                                k=0x00;

                }
                else
                        k=0x00;

        }
        else
                k=0x00;
        return k;

}
//我写的一段长短按键,请高手指教

一周热门 更多>