久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3625|回復: 14
打印 上一主題 下一主題
收起左側

關于單片機按鍵處理程序,短按1次,短按3次,長按3秒,長按10S,怎么去做好點?

  [復制鏈接]
跳轉到指定樓層
樓主
ID:344646 發表于 2021-12-21 15:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
求助,PIC單片機,做按鍵處理的時候,短按1次,短按3次,長按3秒,長按10S,怎么去做好點,目前知道利用判斷按下時長作為區分短按長按的關鍵,,可是短按3次怎么去判斷,求大神解答下。。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:130230 發表于 2021-12-24 18:17 | 只看該作者
搜下狀態機按鍵很適合處理你這種
回復

使用道具 舉報

板凳
ID:908826 發表于 2021-12-25 10:03 | 只看該作者
樓主搞出來記得分享一下,我看了你這個東西也是沒有思路
回復

使用道具 舉報

地板
ID:401564 發表于 2021-12-25 11:47 | 只看該作者
你得有一個時間間隔的標準,比如是0.5秒
那么,按下第一次之后,計時并標記第一次按下,0.5秒之內如果有再次按下,標記第二次按下,0.5秒之內如果有再次按下,標記第三次按下,第三次按下有效,這就是短按3次
每次按下,0.5秒之內沒有再次按下,清除按下標志位
回復

使用道具 舉報

5#
ID:136119 發表于 2021-12-25 12:47 | 只看該作者
這個是我的是個按鍵處理程序 ,有點復雜,你能看懂 就能解決你的問題
void Verify_init (void)  是一個按鍵初始化程序
一下中斷調用

Verifydata(&VY_Lock);     //獲取按鍵
Verifydata(&VY_ZJQ);      //獲取按鍵
Verifydata(&VY_Key);          //按動確認       

if( VY_Key.Movement==0 )
{
    if(VY_Key.MovementTime<8)
    {
        按鍵次數計數       
            VY_Key.MovementTime =10;
    }
    if(VY_Key.MovementTime<25)長時間按鍵處理
    {

    }
}

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

}
以上中斷中調用
///////////////////////////////////////////////
//////////////////////////////////////////////
/////////////////////////////////////////////

typedef struct
{
        unsigned char Location ; // 數據標記
        unsigned char Position ; // 按鍵臨時位置
        unsigned char flag        ; //按鍵確認標記,循環執行N次被標記。
        unsigned char Movement ;  //動作
        unsigned char MovementTime;        //未松開動作用時
}  SIN_Verify ;

SIN_Verify  VY_Lock , VY_Key ,VY_ZJQ;  //

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

* 異常:     無                  
* 作 者:   
----------------------------------------------------------------*/
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:                 //寫入數據失敗
                  break;
  }
  
        if(verify -> Position == i & (verify -> MovementTime != 255))
        {
                if((verify -> flag) > 6 )
                {                 
                        //長期驗證////////////////////
     if(i == verify -> Movement )
                 {
                                if(verify -> MovementTime != 0xff)
                                ++(verify -> MovementTime);                        
                 } else { verify -> MovementTime = 0 ;}
                 //長期驗證END/////////////////
                 
                 //確認信息////////////////////                 
                 verify -> Movement = i;
                 verify -> flag = 0;
                 //確認信息END/////////////////       
                }else ++(verify -> flag); // 標記累加
        }       
        if(verify -> Position != i)
        {
    if(verify -> MovementTime==255)
                verify -> MovementTime = 252;
                verify -> Position = i;       
        }
}

回復

使用道具 舉報

6#
ID:488334 發表于 2021-12-25 15:25 | 只看該作者
本帖最后由 tatachaoren 于 2021-12-25 15:28 編輯

上一樓其實給的思路挺好的,細說一點的話
1:在3秒之內松開,算一次短按。或者1秒之內松開,算1次短按,若超過1秒,小于3秒,可以不算任何按鍵。松開之后計時0.5秒(這個時間你可以自己做主),若在0.5秒內,再次按下,根據前面的定義,3秒(1秒)內松開,次數加1。若在短按三次時,中間長按超過三秒,則清零這個計數器,算長按3秒。
2:長按十秒這個功能,若在長按未達到十秒, 你可以算3秒,或者不算。長按計時多少秒算長按3秒,自己定義也行。
3:若是一個按鍵做所有功能,就可以根據1,2來做分段處理。其實類似計時時間然后分段處理:短按一次(<3秒松開或者<1秒松開,PS:自己定義),長按3秒(3秒<X<10秒或者3秒<X<7秒 :7秒<X<10秒算無效,PS:自己定義),長按>=10秒(因為10秒之后沒有其他功能,可以不用松開立即執行)
回復

使用道具 舉報

7#
ID:344646 發表于 2022-1-13 10:57 | 只看該作者
tatachaoren 發表于 2021-12-25 15:25
上一樓其實給的思路挺好的,細說一點的話
1:在3秒之內松開,算一次短按。或者1秒之內松開,算1次短按,若 ...

感謝~~~
回復

使用道具 舉報

8#
ID:344646 發表于 2022-1-13 10:57 | 只看該作者
yuyechenai 發表于 2021-12-25 12:47
這個是我的是個按鍵處理程序 ,有點復雜,你能看懂 就能解決你的問題
void Verify_init (void)  是一個按 ...

感謝~~
回復

使用道具 舉報

9#
ID:344646 發表于 2022-1-13 10:59 | 只看該作者
13205495918 發表于 2021-12-25 10:03
樓主搞出來記得分享一下,我看了你這個東西也是沒有思路

樓下寫的思路就很清晰,可以參考寫下。。
回復

使用道具 舉報

10#
ID:192883 發表于 2022-1-13 21:34 | 只看該作者
采用定時器的帶濾波的輸入捕獲。鍵按下是啟動計時器,鍵抬起時停止計時器;看計時器的值就得到結果。
回復

使用道具 舉報

11#
ID:625730 發表于 2022-1-13 22:56 | 只看該作者
                51單片機可以用的代碼。
                unsigned char flag=0,count1=0,count2=0;//flag 標識位,count1單次按鍵時長預估,count2短按計數
                if(key1==0)//按鍵按下
                {
                        delay_ms(10);//延時10ms防止干擾
                        if(key1==0)//確認按鍵按下
                        {
                                while(!key1)//等待按鍵松開
                                {
                                        delay_ms(100);//延時100毫秒
                                        count1++;//估算按鍵持續時間
                                }
                                if(count1<15)//持續時間小于1.5秒視為短按,count2的值改變。
                                {
                                        count2++;
                                        count1=0;
                                }
                                if((count1<15)&&count2==3)//短按三次
                                {
                                        flag=1;
                                        count1=0;
                                        count2=0;
                                }
                                else if((count1>=15)&&(count1<70))//按鍵持續1.5s~7s之間,不是短按,都把count2置0
                                {
                                        flag=2;
                                        count1=0;
                                        count2=0;
                               
                                }
                                else if(count1>=100)//持續時間大于10秒的長按
                                {
                                        flag=3;
                                        count1=0;
                                        count2=0;
                                }
回復

使用道具 舉報

12#
ID:625730 發表于 2022-1-13 23:35 | 只看該作者
在按鍵掃描的過程中,都有一個按鍵釋放的循環語句while(!key_x),這個循環語句里可以添加延時和計數。
  1. unsigned char flag=0,count1=0,count2=0; //定義標識符,按鍵計時,短按計數器
  2. /××按鍵檢測  ×/       
  3.                 if(key1==0)
  4.                 {
  5.                         delay_ms(10);//延時10ms防止干擾
  6.                         if(key1==0)
  7.                         {
  8.                                 while(!key1)//等待按鍵松開
  9.                                 {
  10.                                         delay_ms(100);//延時100毫秒
  11.                                         count1++;//估算按鍵持續時間
  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))//按鍵持續1.5s~7s之間
  25.                                 {
  26.                                         flag=2;
  27.                                         count1=0;
  28.                                         count2=0;
  29.                                
  30.                                 }
  31.                                 else if(count1>=100)//大于10秒的長按
  32.                                 {
  33.                                         flag=3;
  34.                                         count1=0;
  35.                                         count2=0;
  36.                                 }
復制代碼
回復

使用道具 舉報

13#
ID:161164 發表于 2022-1-14 11:40 | 只看該作者
TEC 發表于 2022-1-13 23:35
在按鍵掃描的過程中,都有一個按鍵釋放的循環語句while(!key_x),這個循環語句里可以添加延時和計數。

短按一次呢?
回復

使用道具 舉報

14#
ID:453974 發表于 2022-1-18 20:50 | 只看該作者
定時器設置標志位,設定按鍵按下時長的區間范圍,用定時器計數
回復

使用道具 舉報

15#
ID:1040201 發表于 2022-8-13 16:25 | 只看該作者
這個好 ,學習到了,51黑有你更精彩。。。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产日韩一区二区 | 艹逼网| 做a视频 | 91伊人| 免费一区二区 | 亚洲精品视频一区二区三区 | 精品国产乱码久久久久久蜜臀 | 激情欧美一区二区三区 | 精品国产乱码久久久久久闺蜜 | 国产一二区免费视频 | 国产成人精品一区二区三区四区 | 中文字幕亚洲一区二区三区 | 亚洲免费人成在线视频观看 | 亚洲精品女人久久久 | 羞羞涩涩在线观看 | 大陆一级毛片免费视频观看 | 888久久久| 成人免费视屏 | 欧美一区二区 | 精品国产青草久久久久96 | 国产视频在线一区二区 | 51ⅴ精品国产91久久久久久 | 一区二区三区电影网 | www.啪啪.com| 欧美三级电影在线播放 | 免费黄色大片 | 亚洲成人久久久 | 国产精品久久免费观看 | 欧美一级黄色片在线观看 | 国产成人久久精品一区二区三区 | 国产精品亚洲一区 | 色综合视频 | 国产成人免费视频网站视频社区 | 亚洲精品免费看 | 欧美一区二区三区在线观看视频 | 色综合一区二区三区 | 欧美在线a | 日本三级在线 | 国产精品久久久久久久久久久久 | 在线看av网址 | 岛国毛片 |