|
獨(dú)立按鍵掃描模塊,注意兩個(gè)事項(xiàng):1 中斷定時(shí)4MS ,2 IO口初始化設(shè)置時(shí)對(duì)應(yīng)的按鍵IO口設(shè)置為輸入狀態(tài),并且打開(kāi)內(nèi)部上拉功能.
單片機(jī)源程序如下(有非常詳細(xì)的代碼注釋):
void KEY_SCAN(void)
{
if(!f_key_press) //首先來(lái)讀取標(biāo)志位狀態(tài), 為0標(biāo)志已經(jīng)彈起狀態(tài)了,我們要做的就是如何確定其按下
{
if(P_KEY){press_cnt=0;} //消抖過(guò)程,因?yàn)殚_(kāi)了上拉,只要中途檢測(cè)到IO口為高電平就清除之前的計(jì)數(shù)
press_cnt++; //讀取到的電平不論是低還是高都++;上一行代碼是讀取到低就清零 所以不需擔(dān)心讀取到高會(huì)一直加
if(press_cnt>=10) //低電平累加到10*4MS 即40ms的時(shí)候.表示按下已經(jīng)穩(wěn)定了
{
press_cnt=0; //清零累加次數(shù).不管任何時(shí)候,累加的次數(shù)到了以后第一時(shí)間清零
f_key_press=1; //按下的標(biāo)志位置1 ,這個(gè)時(shí)候只是表示按下了.非一個(gè)完整的按下彈起過(guò)程
//用戶可以根據(jù)需要添加功能 比如亮燈 比如轉(zhuǎn)動(dòng)馬達(dá)等
}
}
else //因?yàn)橹耙呀?jīng)按下了f_key_press這個(gè)標(biāo)志位已經(jīng)置1了,現(xiàn)在我們要做的是如何確定彈起
{
if(!P_KEY){press_cnt=0;} //消抖過(guò)程,因?yàn)殚_(kāi)了上拉,彈起IO口應(yīng)該是讀取到高電平,所以只要讀取到低電平就清零之前的計(jì)數(shù)
press_cnt++; //高電平累加,原理同按下哪里一個(gè)原理
if(press_cnt>=10) //高電平累加10*4MS即40ms的時(shí)候,表示彈起已經(jīng)穩(wěn)定了,接下來(lái)要做的是如何確定其彈起
{ //就是清零計(jì)數(shù) 清零標(biāo)志位 讓其下一次讀取的電平的時(shí)候按照程序走
press_cnt=0; //清零累加次數(shù).不管任何時(shí)候,累加的次數(shù)到了以后第一時(shí)間清零
f_key_press=0; //清零標(biāo)志位,為下一次按下做準(zhǔn)備
//用戶可以根據(jù)需要添加功能,這里是彈起的時(shí)候添加功能,上面是按下的時(shí)候增加功能,
}
}
} |
評(píng)分
-
查看全部評(píng)分
|