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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4605|回復: 15
收起左側

請教關于MCU單個按鍵實現不同次數的點擊對應不同功能的處理思想

[復制鏈接]
ID:258164 發表于 2018-11-29 10:37 | 顯示全部樓層 |閱讀模式
現在我有一個按鍵(通過MCU IO口判斷電平的),有長按和短按兩種方式,現在長短按功能實現了,但是現在我遇到一個新的問題:我這個按鍵可能需要按1次到多次,然后不同的次數對應不同的功能。因為我現在的短按時間設定的是50ms-2s,在多次檢查按鍵連續短按的時候,請問我該怎么處理,才能保證我可以識別具體按鍵的次數呢?

具體的實例可以參考現實生活中的電磁爐,菜單鍵按一次到多次,切換到不同的功能。

希望做過類似功能邏輯的壇友提供點思路,謝謝!
回復

使用道具 舉報

ID:94031 發表于 2018-11-29 11:34 | 顯示全部樓層
設一個變量存放在一定時間內點擊次數,根據這個變量決定程序走向。
回復

使用道具 舉報

ID:410399 發表于 2018-11-29 14:20 | 顯示全部樓層
設置一個標志號,長按一次加一,標志=1對應一個功能,=2對應一個功能等等,再設置另外一個標志,短按一次加一,同理
回復

使用道具 舉報

ID:435739 發表于 2018-11-29 14:48 | 顯示全部樓層
設定每次按鍵間隔時間,統計按鍵的次數,超時后重新計數
回復

使用道具 舉報

ID:424598 發表于 2018-11-29 15:24 來自觸屏版 | 顯示全部樓層
如需要實現一個按鍵5種功能,那就初始變量為0,按一次就+1,然后判斷變量的值是多少就執行指定的程序。當累加超過5時,將變量重置為0
回復

使用道具 舉報

ID:435828 發表于 2018-11-29 16:06 | 顯示全部樓層
呃  如需要實現一個按鍵5種功能,那就初始變量為0,按一次就+1,然后判斷變量的值是多少就執行指定的程序。當累加超過5時,將變量重置為0
回復

使用道具 舉報

ID:435826 發表于 2018-11-29 16:29 | 顯示全部樓層
短按只需設置防抖時間,程序要做成識別下降沿及上升沿,一個下降沿+一個上升沿為一個按鍵事件的觸發,需不需要設置全局變量記錄觸發的次數,看你的目的需求是以按下次數表示功能的切換,還是按一次功能響應切換一次,個人建議后者
回復

使用道具 舉報

ID:258164 發表于 2018-11-29 16:33 | 顯示全部樓層
xuyaqi 發表于 2018-11-29 11:34
設一個變量存放在一定時間內點擊次數,根據這個變量決定程序走向。

我的問題不在這,我想問的是:我怎么保證我的第一次短按和第二次 第三次 ...第n次都檢測到,因為我的程序還有別的很多功能。
回復

使用道具 舉報

ID:258164 發表于 2018-11-29 16:34 | 顯示全部樓層
ssk7793 發表于 2018-11-29 15:24
如需要實現一個按鍵5種功能,那就初始變量為0,按一次就+1,然后判斷變量的值是多少就執行指定的程序。當累 ...

這個我知道,但是我的問題不是這個。請看看我對一樓的回復,我的問題所在
回復

使用道具 舉報

ID:213173 發表于 2018-11-29 20:48 | 顯示全部樓層
給你寫一個單鍵長短按實現多任務的示例程序

#include <REG51.H>
#define uint unsigned int                         //宏定義數據類型uint
#define uchar unsigned char                 //宏定義數據類型uchar
#define key_S 10                                                //宏定義短按(10ms)
#define key_L key_S*100                                //宏定義長按(1s)

sbit key1=P3^7;
//sbit key2=P3^6;
sbit LED1=P1^0;
sbit LED2=P1^2;
sbit LED3=P1^4;
sbit LED4=P1^6;
uchar KeySec=0;
uchar num=0;
void Timer0Init()//1毫秒@12.000MHz
{
        TMOD= 0x01;                //設置定時器模式
        TL0 = 0x18;                //設置定時初值
        TH0 = 0xFC;                //設置定時初值
        TF0 = 0;                        //清除TF0標志
        TR0 = 1;                        //定時器0開始計時
        EA=1;                                //開總中斷
        ET0=1;                        //開定時器0中斷
}

void keyscan()                                                        //按鍵掃描
{
        static uint count1=0;                        //計數變量
//        static uint count2=0;                        //計數變量
        if(!key1)   
        {  
                count1++;  
                if(count1==key_L)                                //長按
                        KeySec=4;                                        //輸出鍵值4
                if(count1>key_L)                                //防止count溢出
                        count1=key_L+1;          
        }  
        else                                                                        //按鍵抬起
        {  
                if(count1>key_S && count1<key_L)//短按
                {                       
                        num++;
                        if(num==4)
                                num=1;
                        KeySec=num;                                        //輸出鍵值num
                }       
                count1=0;                                        //count清0
        }   
/*        if(!key2)   
        {  
                count2++;  
                if(count2==key_L)                                //長按
                        KeySec=4;                                        //輸出鍵值4
                if(count2>key_L)                                //防止count溢出
                        count2=key_L+1;          
        }  
        else                                                                        //按鍵抬起
        {  
                if(count2>key_S && count2<key_L)//短按
                        KeySec=3;                                        //輸出鍵值3
                        count2=0;                                        //count清0
        }*/   
}

void key_service()                                        //按鍵服務程序
{
        switch(KeySec)                                                //按鍵服務狀態切換
        {
                case 1:LED1=~LED1;KeySec=0;break;
                case 2:LED2=~LED2;KeySec=0;break;
                case 3:LED3=~LED3;KeySec=0;break;
                case 4:LED4=~LED4;KeySec=0;break;
                default: break;
        }
}

void main()
{
        Timer0Init();                //初始化定時器
        while(1)
        {
                key_service();        //按鍵服務程序
        }
}
void timer0() interrupt        1//1毫秒@12.000MHz
{
        TL0 = 0x18;                //設置定時重裝值
        TH0 = 0xFC;                //設置定時重裝值
        keyscan();                //按鍵掃描程序
}
回復

使用道具 舉報

ID:424598 發表于 2018-11-30 07:48 來自觸屏版 | 顯示全部樓層
HelloPan111 發表于 2018-11-29 16:34
這個我知道,但是我的問題不是這個。請看看我對一樓的回復,我的問題所在

還是看你變量的應用和判斷的寫法,如果要區分長按和短按的累計,那就分成二個變量,分別在長按和短按的判斷中進行累計
回復

使用道具 舉報

ID:258164 發表于 2018-11-30 09:31 | 顯示全部樓層
wulin 發表于 2018-11-29 20:48
給你寫一個單鍵長短按實現多任務的示例程序

#include

謝謝,我的長短按程序已經實現了。之前的問題是怎么處理兩次短按的間隔問題,不過我自己想到了解決的辦法,還是謝謝你的回復
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本天天操 | 免费一级欧美在线观看视频 | 精品美女久久久 | 中文字幕在线观看一区 | 欧美视频成人 | 天天干天天干 | 91久久看片 | 国产精品日韩 | 欧美成人免费 | 日本视频一区二区 | 成人h免费观看视频 | 毛片a区 | 国产国拍亚洲精品av | 中文字幕国产 | 91社区在线观看 | 夜夜久久 | 国产在线一区二区三区 | 亚洲欧美一区二区三区视频 | 欧美福利视频 | 精品一区二区三区四区五区 | av在线播放网址 | 日中文字幕在线 | 亚洲人成人一区二区在线观看 | 国产福利在线播放麻豆 | 亚洲91精品| 成人三级在线观看 | 免费的av| 精品久久久久久久人人人人传媒 | 成人精品一区二区三区四区 | 精品国产精品三级精品av网址 | 免费日韩av| 精品99爱视频在线观看 | 色爱综合网 | 日本欧美在线视频 | 一区二区三区四区在线 | 你懂的在线视频播放 | 久久一| 一级做受毛片免费大片 | 在线免费观看a级片 | 妞干网av | 国产一级片 |