|
我不知道你是學(xué)生還是已經(jīng)在工作了, 如果是學(xué)生的話還可以理解.如果是出來工作了不應(yīng)該一個(gè)按鍵的長短按還弄不清楚啊. 我給你一個(gè)程序,上面的注釋很清楚 ,如果你還不理解的話就不要做單片機(jī)了.這個(gè)是我所有項(xiàng)目都那樣寫的. 有三個(gè)點(diǎn)要注意:1 你要用到的那個(gè)IO口,也就是按鍵IO口必須是輸入設(shè)置,并且打開上拉,2 我的程序是4MS 一個(gè)定時(shí). 3 不要用延時(shí)程序, 你用了延時(shí)程序以后這個(gè)就程序讀取的電平就不準(zhǔn)了, 時(shí)間也不準(zhǔn)了.
void KEY_SCAN(void) //掃描按鍵
{
if(!f_key_press) //判斷是按下還是彈起狀態(tài) 1 按下狀態(tài) 0 彈起狀態(tài)
{
if(P_KEY){key_cnt=0;} // 讀取IO口的電平 因?yàn)殚_了上拉,沒有按按鍵的時(shí)候讀取到的為高 所以只要是高就清零計(jì)數(shù)
key_cnt++; // ++
if(key_cnt>=10) // 連續(xù)讀取IO口電平10次證明按下按鍵了, 并且穩(wěn)定了這也可以理解為消抖
{
key_cnt=0; // 清零按鍵計(jì)數(shù) 記得你一定要清零
f_key_press=1; //置按下按鍵標(biāo)志位 并且置長按按鍵標(biāo)志位
f_key_ctrl=1; // 長按標(biāo)志位置起來后面要用到
}
}
else //判斷按鍵是按下還是彈起狀態(tài) 按下狀態(tài) 0 彈起狀態(tài)
{
if(!P_KEY){key_cnt=0;} //讀取IO口電平 ,開上拉的緣故 置要讀取到為低就證明還在按下狀態(tài)中 所以要清零按鍵計(jì)數(shù)
key_cnt++; //++
if(key_cnt>=10) // 連續(xù)讀取到10次高電平就證明已經(jīng)彈起按鍵了.
{
key_cnt=0; // 清零彈起計(jì)數(shù)
f_key_press=0; //清按下標(biāo)志位
// 敲重點(diǎn) 這里仔細(xì)看
if(f_key_ctrl) //去讀取這個(gè)標(biāo)志位還在不在, 如果這個(gè)標(biāo)志位不在就說明已經(jīng)按下有3S了.直接跳過這里.執(zhí)行下一條命令;
//如果這標(biāo)志位還在就說明按下不到3S ,只能是短按,或者按下1S-3s之間.所以我們要來判斷ctrl_cnt的個(gè)數(shù)
{
if(ctrl_cnt>=250) //判斷之前的計(jì)數(shù)是多少 如果大于250*4MS =1000MS 就是長按1S的動(dòng)作,那么執(zhí)行長按1s的程序就可以了
{
ctrl_cnt=0; // 記得判斷后要立即清零
f_key_1s=1; //和f_key_3s一樣, 后面去讀取這個(gè)標(biāo)志位 有就執(zhí)行相應(yīng)動(dòng)作,沒有就不執(zhí)行
}
else //不大于1S就短按 我們執(zhí)行短按的程序
{
ctrl_cnt=0;
f_key_short=1;
}
}
//敲重點(diǎn)因?yàn)榍懊媾袛嗔薴_key_ctrl標(biāo)志位還在不在,所以判斷完以后一定要清零 ,并且清理的位置不能錯(cuò)
f_key_ctrl=0; // 清零長按標(biāo)志位
}
}
//
if(f_key_ctrl) // 這個(gè)長按只管3S的長按 1 S 的在彈起里面處理
{
ctrl_cnt++; // 只要一讀取到f_key_ctrl為1 就開始++計(jì)數(shù)
if(ctrl_cnt>=750) //計(jì)數(shù)到750*4ms=3000ms 就清零 說明長按3S時(shí)間到了
{
ctrl_cnt=0; // 清零計(jì)數(shù)
f_key_ctrl=0; // 清零標(biāo)志位
f_key_3s=1; // 這個(gè)標(biāo)志位是長按3s的標(biāo)志位,你自己另外寫一個(gè)函數(shù),然后來讀取這個(gè)標(biāo)志位 為1就執(zhí)行長按3S的動(dòng)作
//否則就不執(zhí)行
}
}
else
{
ctrl_cnt=0;
}
}
void WORK_APP(void)
{
if(f_key_3s) //讀取上面按鍵的標(biāo)志位 3S
{
// 自己添加相應(yīng)的功能
}
else if(f_key_1s) // 讀取上面按鍵的標(biāo)志位1s
{
// 自己添加功能
}
else if(f_key_short) // 讀取上面短按標(biāo)志位
{
// 自己添加功能
}
} |
|