打印

长按按键程式疑问

[复制链接]
1478|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liken163|  楼主 | 2015-1-23 20:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下程式的设想为,根据按按键时间的长短,返回不同值给主函数,不管时间长短,实际返回值都是4.
#define o_ms 1000
#define t_ms 3000
#define th_ms 5000
#define f_ms 8000
#define fi_ms 10000
uint keynum=0;
uint keytime=0;
uint ucKeyLock1=0;

uchar keyscan2()
{
uchar scode;
    int t=0;
SW1=1;
if(SW1==1)
{
   keytime=0;
   keynum=0;
ucKeyLock1=0;
   }
if(SW1==0)
{
   keytime++;
if(keytime>=f_ms)
    {
//     scode=P0^0X0F;
       keytime=0;
       ucKeyLock1=1;
       keynum=4;
    return(keynum);
             }
  if(keytime>=th_ms)
    {
//     scode=P0^0X0F;
       keytime=0;
       ucKeyLock1=1;
       keynum=3;
    return(keynum);
        }
  if(keytime>=t_ms)
    {
//     scode=P0^0X0F;
       keytime=0;
       ucKeyLock1=1;
       keynum=2;
    return(keynum);
        }
  if(keytime>=o_ms)
    {
//     scode=P0^0X0F;
       keytime=0;
       ucKeyLock1=1;
       keynum=1;
    return(keynum);
        }
}


相关帖子

沙发
ayb_ice| | 2015-1-24 08:49 | 只看该作者
你这程序有明显BUG,每次都不一定有确定的返回值(实际是返回值未知)

使用特权

评论回复
板凳
liken163|  楼主 | 2015-1-24 09:59 | 只看该作者
能否详细解析

使用特权

评论回复
地板
ningling_21| | 2015-1-24 10:37 | 只看该作者
逻辑没搞清楚,返回值肯定不对

使用特权

评论回复
5
liken163|  楼主 | 2015-1-24 10:47 | 只看该作者
麻烦详细说下,让小弟学习下。

使用特权

评论回复
6
ningling_21| | 2015-1-24 11:01 | 只看该作者
liken163 发表于 2015-1-24 10:47
麻烦详细说下,让小弟学习下。

你把你的按键扫描的流程图画出来,可能问题就解决了一大半了

使用特权

评论回复
7
空蝉001| | 2015-1-24 12:40 | 只看该作者
keytime>=10000  肯定也>=3000吧  所以每次执行的就是if(keytime>=f_ms)
    {
//     scode=P0^0X0F;
       keytime=0;
       ucKeyLock1=1;
       keynum=4;
    return(keynum);
             }     返回的就一直是4了

使用特权

评论回复
8
liken163|  楼主 | 2015-1-24 13:27 | 只看该作者
数值比较是从大到小的,只要适合,就进入if语句,在语句中有重新对Keytime=0;所以只会执行一个if语句,理论上会返回不同值。

使用特权

评论回复
9
949155525| | 2015-1-24 14:06 | 只看该作者
逻辑不清晰   楼主逻辑思维不好

使用特权

评论回复
10
liken163|  楼主 | 2015-1-24 14:54 | 只看该作者
解释下,正确的逻辑是如何的?

使用特权

评论回复
11
liken163|  楼主 | 2015-1-24 15:01 | 只看该作者
#define o_ms 1000
#define t_ms 3000
#define th_ms 5000
#define f_ms 8000
#define fi_ms 10000
uint keynum=0;
uint keytime=0;
uint ucKeyLock1=0;

uchar keyscan2()
{
uchar scode;
    int t=0;
SW1=1;
 
if(SW1==0)
{  
while(SW1==0)
{
   keytime++;
}
}
if(keytime>=f_ms)
    {
//     scode=P0^0X0F;
       keytime=0;
       ucKeyLock1=1;
       keynum=4;
    return(keynum);
             }
  if(keytime>=th_ms)
    {
//     scode=P0^0X0F;
       keytime=0;
       ucKeyLock1=1;
       keynum=3;
    return(keynum);
        }
  if(keytime>=t_ms)
    {
//     scode=P0^0X0F;
       keytime=0;
       ucKeyLock1=1;
       keynum=2;
    return(keynum);
        }
  if(keytime>=o_ms)
    {
//     scode=P0^0X0F;
       keytime=0;
       ucKeyLock1=1;
       keynum=1;
    return(keynum);
        }
}
改成这样也不行

使用特权

评论回复
12
guangbiao| | 2015-1-24 18:09 | 只看该作者
1.键放开时不要直接就清掉计数值,判断一下计算值符合那种按键操作(短按、长按等)。
2.键按下时判断是否符合最长的按键计数值就好了(只要按键有松开,就会被1处理)。

使用特权

评论回复
13
cauhorse| | 2015-1-24 18:20 | 只看该作者
楼主,换用‘状态**’呀。。

使用特权

评论回复
14
liken163|  楼主 | 2015-1-24 20:28 | 只看该作者
guangbiao 发表于 2015-1-24 18:09
1.键放开时不要直接就清掉计数值,判断一下计算值符合那种按键操作(短按、长按等)。
2.键按下时判断是否 ...

你所说是把
if(SW==1)
{
keytime=0;
keynum=0;
keylock1=0;
}
去掉吗?
后面发的有把此段去掉。
还是不行。

使用特权

评论回复
15
jehow| | 2015-5-20 10:47 | 只看该作者
我是菜鸟,高手不会和你说明的,我的理解是这样的,每个IF都执行,每个IF都返回值,直到执行到最后

  if(keytime>=o_ms)
    {
//     scode=P0^0X0F;
       keytime=0;
       ucKeyLock1=1;
       keynum=1;
    return(keynum);
        }
返回的是keynum=1;

使用特权

评论回复
16
jehow| | 2015-5-20 10:48 | 只看该作者
替换了你的所有值

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

29

帖子

0

粉丝