写的一个按键长短按的程序,但却实现不了,大家帮我看下

2020-01-27 11:29发布

这样写有问题吗?我实在不知道哪的问题,就是运行不了


sbit        KEY_SET         = P1^3;
sbit        KEY_UP         = P1^2;
sbit        KEY_DOWN = P1^0;

/*********************************************
;文件名:keyscan();
;功  能:按键扫描函数
;输  入:无
;输  出:;调  用:无
;*********************************************/       
uchar keyscan(void)
{
        if(KEY_SET==0||KEY_UP==0||KEY_DOWN==0) //有任一键按下,进入按键检测
        {
                keystar=1;                         //进入计时器,开始计时
                if((KEY_SET==0)&&keytemp>=20)        set_down=1;  //设置键按下20ms
                if((KEY_UP==0)&&keytemp>=20)         up_down=1;
                if((KEY_DOWN==0)&&keytemp>=20)        down_down=1;

                if((KEY_SET==0)&&keytemp>=2000)                         //2S 设置键被长按
                {
                         set_down=0;         
                         set_down_long=1;       
                }         
                if((KEY_UP==0)&&keytemp>=2000)
                {
                        up_down=0;         
                        up_down_long=1;       
                 }
                if((KEY_SET==0)&&keytemp>=2000) //2S
                {
                         down_down=0;         
                         down_down_long=1;       
                }
        }
        else        //松手等待按键抬起
        {
                if((KEY_SET==1)&&(set_down==1))
                {
                        set_down=0;
                        set_shot_flag=1;        //一个完整的按键操作完成

                }
                if((KEY_SET==1)&&(set_down_long==1))
                {                       
                        set_down_long=0;
                        set_long_flag=1;        //一个完整的长按键操作完成
       
                }
                if((KEY_UP==1)&&(up_down==1))
                {
                        up_down=0;
                        up_shot_flag=1;
                }
             if((KEY_UP==1)&&(up_down_long==1))
                {
                        up_down_long=0;
                        up_long_flag=1;
                }
                if((KEY_DOWN==1)&&(down_down==1))
                {
                        down_down=0;
                        down_shot_flag=1;
                }
             if((KEY_DOWN==1)&&(down_down_long==1))
                {
                        down_down_long=0;
                        down_long_flag=1;

                }
                keystar=0;
        }
  //  return key_flag;
}


定时时器10sm扫一次

        if (keystar)
        {
                keytemp++;
                if (keytemp>=30000) keytemp=30000; //3S
        }
        else
        {
                keytemp=0;
        }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
dujiyo
1楼-- · 2020-01-27 13:03
你写的这个程序,有很多看不明白的地方,比如:
定时时器10sm扫一次

if (keystar)
{  
keytemp++;  
if (keytemp>=30000) keytemp=30000; //3S
}  
else  
{  
keytemp=0;  
}

可以把全部的程序发上来看看才能了解你所写的是什么?????
jrcsh
2楼-- · 2020-01-27 16:51
长短按的程序  的检测原理 不就是按的时间 长点和 短点  

m=100
for(n=0;m<n;n++)
{
if(key==0)
{
m++
de(10)//10ms
}
}
if(m>102)
{
if(m>700)//按的时间大于2秒

长按处理

e~~~~~
{
知按处理
}
}
dcss
3楼-- · 2020-01-27 18:42
小声说一句,不会是keytemp变量设置成char了吧
dcss
4楼-- · 2020-01-27 21:49
 精彩回答 2  元偷偷看……
zhuyi2576
5楼-- · 2020-01-28 02:50
唉,不用状态机了,用其它方法做好了。
zhuyi2576
6楼-- · 2020-01-28 04:26
上面程序没错,可以实现长按,短按
呵,我大意了,调完后忘清标志位了

一周热门 更多>