|
基本每個(gè)程序都會(huì)用到狀態(tài)檢測(cè),這里分享一下個(gè)人的處理方式,例如充電狀態(tài)檢測(cè)
void ChargeScanf(void)
{
unsigned char state=0;//當(dāng)前狀態(tài)緩存
static unsigned char statebk; //上一次狀態(tài)存儲(chǔ)
static unsigned char statecnt;//穩(wěn)定計(jì)算
state = CHECK_PIN;
if(state == statebk){
if(statecnt < 10){//10次消抖
statecnt++;//消抖時(shí)間不夠的話繼續(xù)累積
}else{
//消抖完成,記錄狀態(tài)
if(state){
//正在充電,可以用一個(gè)全局標(biāo)志位存
}else{
//停止充電
}
}
}else{
statebk = state;//狀態(tài)切換,保存當(dāng)前狀態(tài),留下次進(jìn)入函數(shù)時(shí)判斷用
statecnt = 0;//消抖計(jì)數(shù)清零
}
}
此方法我已經(jīng)用了好多年了,挺好用的,可以避免一些誤觸發(fā)
也可以同時(shí)檢測(cè)兩個(gè)充電狀態(tài)腳
例如
state = CHECK_PIN1 ? 0 :1;
state |= CHECK_PIN2 ? 0 :2;
這樣就可以檢測(cè)出充電中 充電拔除,充電完成,幾種狀態(tài)
因?yàn)槌绦蛳妒且源螖?shù)去計(jì)算,所以,此函數(shù)放到1MS任務(wù)或者2MS任務(wù)里面掃描,消抖時(shí)間就是10MS-20MS效果比較理想
這個(gè)思路也可以用于按鍵掃描,這種方式不長(zhǎng)時(shí)間占用MCU資源,適合應(yīng)用于實(shí)際項(xiàng)目應(yīng)用,稍微改動(dòng)一下就可以檢測(cè)獨(dú)立按鍵單擊,雙擊,連續(xù)N擊,長(zhǎng)按,或者多個(gè)按鍵組合鍵檢測(cè)
|
評(píng)分
-
查看全部評(píng)分
|