原创 状态机按键

2010-5-28 20:59 2362 4 4 分类: MCU/ 嵌入式

按键是比较复杂。可以用状态机表示。


每10mS执行一次键盘扫描任务


0、无键,若有键进入状态1


1、第一次检到有键。若有键进入状态2,同时将键值送缓冲区。 若无键进入状态0。


2、若有键则计时,按键超过300ms进入状态3,同时将键值送缓冲区。 若无键进入状态1。


  表示第一次按键后如果长按键则300ms后认为有一次按键。


3、若有键则计时,按键超过200ms则将键值送缓冲区。 若无键进入状态1。


  表示长按键则以后每200ms后认为有一次按键。


void KeyScan()    //每10mS执行一次键盘扫描任务


{


    switch(KeyState)


    {


        case 0:


            if(KeyIsKeyDown())  //有键


            {


                KeyState = 1;


            }


            break;


        case 1:


            if(KeyIsKeyDown())  //有键


            {


                KeyState = 2;


                KeyBufIn();   //将键值送缓冲区


                KeyStartRptCnt = 0;


            }


            else


            {


                KeyState = 0;


            }


            break;


        case 2:


            if(KeyIsKeyDown())  //有键


            {


                if(KeyStartRptCnt++ >= 30)


                {


                    KeyState = 3;


                    KeyRptCnt = 0;


                    KeyBufIn();


                }


            }


            else


            {


                KeyState = 1;


            }


            break;


        case 3:


            if(KeyIsKeyDown())  //有键


            {


                if(KeyRptCnt++ >= 20)


                {


                    KeyRptCnt = 0;


                    KeyBufIn();


                }


            }


            else


            {


                KeyState = 1;


            }


            break;


        default:


            break;


    }


}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条