zhuyi25762 发表于 2010-8-6 22:12:10

大家帮忙看段按键程序,长按松手引发一次短按,不知道如何改,程序简单+有仿真!

谢谢哈

有长按,短按,长按连_发。。但长按松手引发一次短按,没发现问题在哪!帮忙看下吧
点击此处下载 ourdev_573374.rar(文件大小:53K) (原文件名:key_test.rar)
/************************************************************/
//判断按键操作,确立按键标志位
/***********************************************************/
void Scan_Key(void)        
{
        static unsigned char count = 0;   //长按计数
        static bit valid = 0;               //有效标志
        static bit reach = 0;            //长按标志
        if (valid == 1)                                         //判断有效标志
        {
                if (Read_Key()!=NO_KEY)                    //有键按下      
                {
                        Key_value=Read_Key();                //记录键值
                        count++;                  //开始计数   
                        if (count == LONG_DELAY)    //长按                        
                        {
                                count = REPEAT_DELAY;   //长按加速
                                reach = 1;            //长按置位
                                if(Key_value==KEY_SET)                KeyFlg=1;        //产生标志位供程序调用
                                else if(Key_value==KEY_UP)        KeyFlg=1;
                                else if(Key_value==KEY_DOWN)KeyFlg=1;
                                else if(Key_value==KEY_ESC) KeyFlg=1;
                        }         
                }      
                else //3 松手,短按了
                {
                        count = 0;                                        //计数清零   
                        valid = 0;                                        //有效清零
                        reach = 0;                                        //长按清零
                        if (reach == 0)// Sign = !Sign;                     //取反状态,短按松手一次,开关机一次
                        {
                                if(Key_value==KEY_SET)                KeyFlg =1;        //产生标志位供程序调用
                                else if(Key_value==KEY_UP)        KeyFlg =1;
                                else if(Key_value==KEY_DOWN)KeyFlg =1;
                                else if(Key_value==KEY_ESC) KeyFlg =1;   
                        }
                }   
        }         
        else //2
        {
                if (Read_Key()!=NO_KEY)valid = 1;                   //有效置位
        }
}

moyanqd 发表于 2010-12-5 21:57:22

如下这样改动就行了
                else //3 松手,短按了
                {
                        count = 0;                                        //计数清零   
                        valid = 0;                                        //有效清零
                        ////////////////////////////////////////////////////////////
                        if(reach == 1)//如果先前是长按,本次不执行短按功能,直接退出
                        {
                                reach =0;
                                return;
                        }
                        ////////////////////////////////////////////////////////////
                        //reach = 0;                                        //长按清零
                        //if (reach == 0)// Sign = !Sign;                     //取反状态,短按松手一次,开关机一次
                        //{
                                if(Key_value==KEY_SET)                KeyFlg =1;        //产生标志位供程序调用
                                else if(Key_value==KEY_UP)        KeyFlg =1;
                                else if(Key_value==KEY_DOWN)KeyFlg =1;
                                else if(Key_value==KEY_ESC) KeyFlg =1;   
                        //}
                }

loycolor 发表于 2010-12-9 15:16:02

我来学习留个记号哈

tianbx 发表于 2011-1-9 20:42:26

我来学习留个记号哈

ncj_12345 发表于 2011-1-10 08:46:03

我来学习留个记号哈

xinxinEC 发表于 2011-7-5 15:55:44

mark

hnjill 发表于 2011-7-5 16:25:21

reach = 0;                                        //长按清零   
if (reach == 0)// Sign = !Sign;                     //取反状态,短按松手一次,开关机一次

LZ的reach置1表示长按,但这你先清零,又来判断,所以长按时会产生一次短按的了

zenghl 发表于 2021-4-7 17:04:18

mark, 在此留个足印。

ackyee 发表于 2021-4-7 17:08:04

zenghl 发表于 2021-4-7 17:04
mark, 在此留个足印。

十年前的帖子 被你挖出来了
页: [1]
查看完整版本: 大家帮忙看段按键程序,长按松手引发一次短按,不知道如何改,程序简单+有仿真!