<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 一個(gè)簡(jiǎn)單的按鍵去抖延時(shí)程序

一個(gè)簡(jiǎn)單的按鍵去抖延時(shí)程序

作者: 時(shí)間:2016-11-30 來(lái)源:網(wǎng)絡(luò ) 收藏
按鍵去抖,一般采用普通延時(shí),如

if((GPIOC->IDR & 0x01)== 0)
{
delay_ms(20);
if(GPIOC->IDR & 0x01)== 0

//進(jìn)行按鍵處理函數

}

本文引用地址:http://dyxdggzs.com/article/201611/324051.htm

這個(gè)程序,需要有一個(gè)普通的延時(shí)程序,來(lái)檢測去抖動(dòng),這個(gè)延時(shí)一般采用for循環(huán)和while循環(huán)。這樣的話(huà),就有一個(gè)問(wèn)題,在延時(shí)的這20ms中,cpu一直在判斷時(shí)間有沒(méi)有到。如果不是中斷,是不會(huì )打斷cpu的程序的。這樣的話(huà),去抖延時(shí),就會(huì )浪費cpu的效率。
假如,按鍵掃描的后面跟一個(gè)協(xié)議處理的函數。
即:

while(1)

scan_key(); //按鍵掃描
exe(); //協(xié)議解析

這個(gè)時(shí)候,若接收中斷,在按鍵掃描時(shí)已經(jīng)處理完成,正好按下按鍵,這個(gè)時(shí)候就必須要有20ms的間隔,在判斷完按鍵后,才可以進(jìn)入協(xié)議解析函數。也就是說(shuō),如果沒(méi)有掃描函數,協(xié)議會(huì )立即執行解析并返回響應數據。而添加按鍵掃描后,協(xié)議有可能會(huì )在20ms后,進(jìn)行解析并返回數據,這樣的話(huà),就會(huì )使產(chǎn)品的實(shí)時(shí)性無(wú)法保證。

所以我想了另一個(gè)方法,采用標致位,來(lái)實(shí)現延時(shí),當然這個(gè)方法,肯定不是我第一個(gè)想出來(lái)的。如有雷同,可采用翻鋼镚方法進(jìn)行選擇。
就是采用if語(yǔ)句來(lái)實(shí)現延時(shí),只不過(guò)寫(xiě)程序時(shí)比較麻煩,但穩定性在stm8上測試了一下,感覺(jué)還可以。

代碼如下
首先申請幾個(gè)全局變量
unsigned int time_ms,time_us,time_ns,time_flag;
//以上這幾個(gè)是定時(shí)標志和定時(shí)計數變量
unsigned key_old, key_new;
//這兩個(gè)是按鍵鍵值

/*******************************************************************************
函數名:delay_ms()
函數功能:延時(shí)
參數:ms 毫秒
返回:無(wú)
備注:此延時(shí)函數采用if實(shí)現,使用時(shí),必須先申請flag變量然后調用延時(shí)函數,最后在
執行中加入flag判斷
例:u16 time_flag,time_ms,time_us,time_ns;
delay_ms(u16 ms);
if(time_flag>0){time_flag=0;......內容}
*******************************************************************************/
void key_delay(unsigned int ms)
{
if(time_ms{
if(time_us<10) //在應用時(shí),不同的單片機,不同的頻率,需要進(jìn)行調整
{
if(time_ns<8) //在應用時(shí)不同的單片機,不同的頻率,需要進(jìn)行調整
{
time_ns++;
}
else
{
time_us++;
time_ns=0;
}
}
else
{
time_ms++;
time_us=0;
}
}
else
{
time_flag=1;
time_ms=0;
}
}


以上代碼,有一個(gè)time_flag,變量,這個(gè)變量就是定時(shí)標致變量。一旦這個(gè)標致置一,則說(shuō)明定時(shí)器到時(shí)間
使用時(shí)可以

///////////////////////////////////////////////////////////
//函數名:scan()
//功能:按鍵掃描
//參數:無(wú)
//返回值:無(wú)
//備注:
///////////////////////////////////////////////////////////
void scan()
{
u8 key_new;
key_new = GPIOC->IDR;
if(key_old != key_new)
{
key_delay(150);
if(time_flag == 1)
{
time_flag = 0;
if(key_old != key_new)
{
switch()
{
case 1: k1_exe(); break;
case 2: k2_exe(); break;
case 3: k3_exe(); break;
case 4: k4_exe(); break;
default: break;
}
key_old = key_new;
}
else

time_ms=0;

}
}
}

以上就是代碼
在大循環(huán)中,直接調用即可,和普通的按鍵函數一樣,只不過(guò),這個(gè)的實(shí)時(shí)性,應該相對較高一些。
while(1)

scan_key(); //按鍵掃描
exe(); //協(xié)議解析

讓我們來(lái)分析一下,為啥這個(gè)函數相對較好一些。
首先,我們來(lái)看
scan_key();
首先,掃描IO端口,存放如新按鍵變量
key_new = GPIOC->IDR;
然后將新按鍵與老按鍵號進(jìn)行對比,如果新的按鍵號與老按鍵號不同,說(shuō)明有按鈕按下。
if(key_old != key_new)
當有按鈕按下的時(shí)候進(jìn)入,延時(shí)函數,
key_delay(150);
這時(shí),進(jìn)入多個(gè)if判斷,進(jìn)行time_ns++;這個(gè)函數,最主要的功能就是判斷,當前的時(shí)間time_ms,與參數時(shí)間,是否一致,若不一致,則退出函數。這時(shí)time_flag不為1,當前的時(shí)間time_ms,與參數時(shí)間一致 ,這時(shí)time_flag為1。
if(time_flag == 1)
這個(gè)判斷就是判斷到時(shí)標致,如果到時(shí),則說(shuō)明去抖時(shí)間完成,則在判斷一次if(key_old != key_new),如果為否,則說(shuō)明按鍵確實(shí)按下,否則則為沒(méi)有按下。有按鍵按下時(shí),則會(huì )執行按鍵處理函數。
若沒(méi)有按鍵按下,則清楚計數器。程序繼續執行。
也就是說(shuō),不管是否在延時(shí)狀態(tài),程序,都會(huì )向下執行,而不會(huì )卡在某一個(gè)函數或循環(huán)內不動(dòng)。這樣的話(huà),程序就會(huì )向下繼續執行。
在程序中,若既有按鍵,又有一些對待實(shí)時(shí)性較高,但又不樂(lè )意放在中斷里的程序??梢圆捎眠@種方法來(lái)實(shí)現按鍵延時(shí),可以相對的提高程序的運行效率。目前這個(gè)程序,不支持長(cháng)按,但可以實(shí)現簡(jiǎn)單的組合按鍵。



關(guān)鍵詞: 按鍵去抖延時(shí)程

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>