按键单双击流水灯

2020-02-04 09:11发布

一个按单击一个灯流水,双击两个灯流水,三击三个灯流水。而且任何时候,单击,双击,三击 都能够切换到相应的流水模式。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
29条回答
ShawnLinson
2020-02-07 02:40
acercqu 发表于 2012-4-3 10:07
怎么个按键中断检测法? 能否给个例子,模仿一下。

参考自坛子其他网友的大作

void EXTI15_10_IRQHandler(void)
{
//  ___            _____          _______
//     |__________|     |________|
//       miMAX     mjMAX   mkMAX
    #define miMAX 300       //长按时限
    #define mjMAX 50        //弹起监测时限
    #define mkMAX 100       //是否第二次有长按

    u16 mi,mj,mk;


    if(EXTI_GetITStatus(EXTI_Line14) != RESET){          //检查指定的EXTI14线路触发请求发生与否
        msDelay(10);
        for(mi=0;mi<miMAX;mi++){
            msDelay(10);
            if(btnUp()) {   //放开
                break;
            }
        }
        if(mi == miMAX) {//长按
    //--------------------------------------------------------------------------以下是长按
            pcPrintf("长按! ");
    //--------------------------------------------------------------------------以上是长按
            EXTI_ClearITPendingBit(EXTI_Line14);  //清除EXTI14线路挂起位
        } else {
            for(mj=0;mj<mjMAX;mj++){
                msDelay(10);
                if(btnPush()) {   //按下
                    break;
                }
            }
            if(mj == mjMAX) {//单击
    //--------------------------------------------------------------------------以下是单击
                pcPrintf("单击! ");
    //--------------------------------------------------------------------------以上是长按
                EXTI_ClearITPendingBit(EXTI_Line14);  //清除EXTI14线路挂起位
            } else {
                for(mk=0;mk<mkMAX;mk++){
                    msDelay(10);
                    if(btnUp()) {   //放开
                        break;
                    }
                }
                if(mk == mkMAX) { //一短一长
    //--------------------------------------------------------------------------以下是双击_一短一长
                    pcPrintf("一短一长! ");
    //--------------------------------------------------------------------------以上是双击_一短一长
                    EXTI_ClearITPendingBit(EXTI_Line14);  //清除EXTI14线路挂起位
                    EXTI_ClearITPendingBit(EXTI_Line14);  //清除EXTI14线路挂起位,双击需要清除2次
                } else {//二短(双击)
    //--------------------------------------------------------------------------以下是双击_二短
                    pcPrintf("双击! ");
    //--------------------------------------------------------------------------以上是双击_二短
                    EXTI_ClearITPendingBit(EXTI_Line14);  //清除EXTI14线路挂起位
                    EXTI_ClearITPendingBit(EXTI_Line14);  //清除EXTI14线路挂起位,双击需要清除2次
               }
            }
        }
    }
}

一周热门 更多>