標(biāo)題: 關(guān)于單片機(jī)按鍵處理程序,短按1次,短按3次,長(zhǎng)按3秒,長(zhǎng)按10S,怎么去做好點(diǎn)? [打印本頁(yè)]

作者: declansang    時(shí)間: 2021-12-21 15:18
標(biāo)題: 關(guān)于單片機(jī)按鍵處理程序,短按1次,短按3次,長(zhǎng)按3秒,長(zhǎng)按10S,怎么去做好點(diǎn)?
求助,PIC單片機(jī),做按鍵處理的時(shí)候,短按1次,短按3次,長(zhǎng)按3秒,長(zhǎng)按10S,怎么去做好點(diǎn),目前知道利用判斷按下時(shí)長(zhǎng)作為區(qū)分短按長(zhǎng)按的關(guān)鍵,,可是短按3次怎么去判斷,求大神解答下。。
作者: jizhongbiao    時(shí)間: 2021-12-24 18:17
搜下狀態(tài)機(jī)按鍵很適合處理你這種
作者: 13205495918    時(shí)間: 2021-12-25 10:03
樓主搞出來(lái)記得分享一下,我看了你這個(gè)東西也是沒有思路
作者: Y_G_G    時(shí)間: 2021-12-25 11:47
你得有一個(gè)時(shí)間間隔的標(biāo)準(zhǔn),比如是0.5秒
那么,按下第一次之后,計(jì)時(shí)并標(biāo)記第一次按下,0.5秒之內(nèi)如果有再次按下,標(biāo)記第二次按下,0.5秒之內(nèi)如果有再次按下,標(biāo)記第三次按下,第三次按下有效,這就是短按3次
每次按下,0.5秒之內(nèi)沒有再次按下,清除按下標(biāo)志位
作者: yuyechenai    時(shí)間: 2021-12-25 12:47
這個(gè)是我的是個(gè)按鍵處理程序 ,有點(diǎn)復(fù)雜,你能看懂 就能解決你的問(wèn)題
void Verify_init (void)  是一個(gè)按鍵初始化程序
一下中斷調(diào)用

Verifydata(&VY_Lock);     //獲取按鍵
Verifydata(&VY_ZJQ);      //獲取按鍵
Verifydata(&VY_Key);          //按動(dòng)確認(rèn)       

if( VY_Key.Movement==0 )
{
    if(VY_Key.MovementTime<8)
    {
        按鍵次數(shù)計(jì)數(shù)       
            VY_Key.MovementTime =10;
    }
    if(VY_Key.MovementTime<25)長(zhǎng)時(shí)間按鍵處理
    {

    }
}

if( VY_Key.Movement==1 )
{
    if(VY_Key.MovementTime<250)
    {
     執(zhí)行一次按鍵處理
     執(zhí)行按鍵二次處理
     執(zhí)行按鍵三次處理
     清除按鍵次數(shù)計(jì)數(shù)
    }

}
以上中斷中調(diào)用
///////////////////////////////////////////////
//////////////////////////////////////////////
/////////////////////////////////////////////

typedef struct
{
        unsigned char Location ; // 數(shù)據(jù)標(biāo)記
        unsigned char Position ; // 按鍵臨時(shí)位置
        unsigned char flag        ; //按鍵確認(rèn)標(biāo)記,循環(huán)執(zhí)行N次被標(biāo)記。
        unsigned char Movement ;  //動(dòng)作
        unsigned char MovementTime;        //未松開動(dòng)作用時(shí)
}  SIN_Verify ;

SIN_Verify  VY_Lock , VY_Key ,VY_ZJQ;  //

/*---------------------------------------------------------------
* 函 數(shù) 名: Verify_init ()
* 參 數(shù):    void
* 返 回 值:uint8
* 功能描述:  讀取當(dāng)前IO數(shù)據(jù)
* 異常:     無(wú)
* 作 者:   
----------------------------------------------------------------*/
void Verify_init (void)
{
        VY_Lock.Location = 1;
        VY_Key.Location = 2;
        VY_ZJQ.Location = 3;
}
/*---------------------------------------------------------------
* 函 數(shù) 名: keyIn()
* 參 數(shù):    void
* 返 回 值: void
* 功能描述:  

* 異常:     無(wú)                  
* 作 者:   
----------------------------------------------------------------*/
void Verifydata(SIN_Verify* verify )
{       
        u8 i;
        switch (verify ->Location)
  {
          case 1 : i = IN_Lock ;  //獲取端鎖端口信息
                  break;
          case 2 : i = IN_Key  ; //獲取按鍵端口信息
                  break;
                case 3 : i = IN_ZJQ  ; //獲取按鍵端口信息
                  break;
          default:                 //寫入數(shù)據(jù)失敗
                  break;
  }
  
        if(verify -> Position == i & (verify -> MovementTime != 255))
        {
                if((verify -> flag) > 6 )
                {                 
                        //長(zhǎng)期驗(yàn)證////////////////////
     if(i == verify -> Movement )
                 {
                                if(verify -> MovementTime != 0xff)
                                ++(verify -> MovementTime);                        
                 } else { verify -> MovementTime = 0 ;}
                 //長(zhǎng)期驗(yàn)證END/////////////////
                 
                 //確認(rèn)信息////////////////////                 
                 verify -> Movement = i;
                 verify -> flag = 0;
                 //確認(rèn)信息END/////////////////       
                }else ++(verify -> flag); // 標(biāo)記累加
        }       
        if(verify -> Position != i)
        {
    if(verify -> MovementTime==255)
                verify -> MovementTime = 252;
                verify -> Position = i;       
        }
}


作者: tatachaoren    時(shí)間: 2021-12-25 15:25
本帖最后由 tatachaoren 于 2021-12-25 15:28 編輯

上一樓其實(shí)給的思路挺好的,細(xì)說(shuō)一點(diǎn)的話
1:在3秒之內(nèi)松開,算一次短按;蛘1秒之內(nèi)松開,算1次短按,若超過(guò)1秒,小于3秒,可以不算任何按鍵。松開之后計(jì)時(shí)0.5秒(這個(gè)時(shí)間你可以自己做主),若在0.5秒內(nèi),再次按下,根據(jù)前面的定義,3秒(1秒)內(nèi)松開,次數(shù)加1。若在短按三次時(shí),中間長(zhǎng)按超過(guò)三秒,則清零這個(gè)計(jì)數(shù)器,算長(zhǎng)按3秒。
2:長(zhǎng)按十秒這個(gè)功能,若在長(zhǎng)按未達(dá)到十秒, 你可以算3秒,或者不算。長(zhǎng)按計(jì)時(shí)多少秒算長(zhǎng)按3秒,自己定義也行。
3:若是一個(gè)按鍵做所有功能,就可以根據(jù)1,2來(lái)做分段處理。其實(shí)類似計(jì)時(shí)時(shí)間然后分段處理:短按一次(<3秒松開或者<1秒松開,PS:自己定義),長(zhǎng)按3秒(3秒<X<10秒或者3秒<X<7秒 :7秒<X<10秒算無(wú)效,PS:自己定義),長(zhǎng)按>=10秒(因?yàn)?0秒之后沒有其他功能,可以不用松開立即執(zhí)行)
作者: declansang    時(shí)間: 2022-1-13 10:57
tatachaoren 發(fā)表于 2021-12-25 15:25
上一樓其實(shí)給的思路挺好的,細(xì)說(shuō)一點(diǎn)的話
1:在3秒之內(nèi)松開,算一次短按;蛘1秒之內(nèi)松開,算1次短按,若 ...

感謝~~~

作者: declansang    時(shí)間: 2022-1-13 10:57
yuyechenai 發(fā)表于 2021-12-25 12:47
這個(gè)是我的是個(gè)按鍵處理程序 ,有點(diǎn)復(fù)雜,你能看懂 就能解決你的問(wèn)題
void Verify_init (void)  是一個(gè)按 ...

感謝~~
作者: declansang    時(shí)間: 2022-1-13 10:59
13205495918 發(fā)表于 2021-12-25 10:03
樓主搞出來(lái)記得分享一下,我看了你這個(gè)東西也是沒有思路

樓下寫的思路就很清晰,可以參考寫下。。
作者: zhhdadu    時(shí)間: 2022-1-13 21:34
采用定時(shí)器的帶濾波的輸入捕獲。鍵按下是啟動(dòng)計(jì)時(shí)器,鍵抬起時(shí)停止計(jì)時(shí)器;看計(jì)時(shí)器的值就得到結(jié)果。
作者: TEC    時(shí)間: 2022-1-13 22:56
                51單片機(jī)可以用的代碼。
                unsigned char flag=0,count1=0,count2=0;//flag 標(biāo)識(shí)位,count1單次按鍵時(shí)長(zhǎng)預(yù)估,count2短按計(jì)數(shù)
                if(key1==0)//按鍵按下
                {
                        delay_ms(10);//延時(shí)10ms防止干擾
                        if(key1==0)//確認(rèn)按鍵按下
                        {
                                while(!key1)//等待按鍵松開
                                {
                                        delay_ms(100);//延時(shí)100毫秒
                                        count1++;//估算按鍵持續(xù)時(shí)間
                                }
                                if(count1<15)//持續(xù)時(shí)間小于1.5秒視為短按,count2的值改變。
                                {
                                        count2++;
                                        count1=0;
                                }
                                if((count1<15)&&count2==3)//短按三次
                                {
                                        flag=1;
                                        count1=0;
                                        count2=0;
                                }
                                else if((count1>=15)&&(count1<70))//按鍵持續(xù)1.5s~7s之間,不是短按,都把count2置0
                                {
                                        flag=2;
                                        count1=0;
                                        count2=0;
                               
                                }
                                else if(count1>=100)//持續(xù)時(shí)間大于10秒的長(zhǎng)按
                                {
                                        flag=3;
                                        count1=0;
                                        count2=0;
                                }
作者: TEC    時(shí)間: 2022-1-13 23:35
在按鍵掃描的過(guò)程中,都有一個(gè)按鍵釋放的循環(huán)語(yǔ)句while(!key_x),這個(gè)循環(huán)語(yǔ)句里可以添加延時(shí)和計(jì)數(shù)。
  1. unsigned char flag=0,count1=0,count2=0; //定義標(biāo)識(shí)符,按鍵計(jì)時(shí),短按計(jì)數(shù)器
  2. /××按鍵檢測(cè)  ×/       
  3.                 if(key1==0)
  4.                 {
  5.                         delay_ms(10);//延時(shí)10ms防止干擾
  6.                         if(key1==0)
  7.                         {
  8.                                 while(!key1)//等待按鍵松開
  9.                                 {
  10.                                         delay_ms(100);//延時(shí)100毫秒
  11.                                         count1++;//估算按鍵持續(xù)時(shí)間
  12.                                 }
  13.                                 if(count1<15)//count<1.5s視為短按
  14.                                 {
  15.                                         count2++;
  16.                                         count1=0;
  17.                                 }
  18.                                 if((count1<15)&&count2==3)//短按三次
  19.                                 {
  20.                                         flag=1;
  21.                                         count1=0;
  22.                                         count2=0;
  23.                                 }
  24.                                 else if((count1>=15)&&(count1<70))//按鍵持續(xù)1.5s~7s之間
  25.                                 {
  26.                                         flag=2;
  27.                                         count1=0;
  28.                                         count2=0;
  29.                                
  30.                                 }
  31.                                 else if(count1>=100)//大于10秒的長(zhǎng)按
  32.                                 {
  33.                                         flag=3;
  34.                                         count1=0;
  35.                                         count2=0;
  36.                                 }
復(fù)制代碼

作者: lkc8210    時(shí)間: 2022-1-14 11:40
TEC 發(fā)表于 2022-1-13 23:35
在按鍵掃描的過(guò)程中,都有一個(gè)按鍵釋放的循環(huán)語(yǔ)句while(!key_x),這個(gè)循環(huán)語(yǔ)句里可以添加延時(shí)和計(jì)數(shù)。

短按一次呢?
作者: 累不死的狗    時(shí)間: 2022-1-18 20:50
定時(shí)器設(shè)置標(biāo)志位,設(shè)定按鍵按下時(shí)長(zhǎng)的區(qū)間范圍,用定時(shí)器計(jì)數(shù)
作者: liucan2020    時(shí)間: 2022-8-13 16:25
這個(gè)好 ,學(xué)習(xí)到了,51黑有你更精彩。。。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1