2 回答

TA貢獻1848條經驗 獲得超6個贊
2級,希望你能認真看了并采納,畢竟這問題挺復雜,說起來麻煩。
原文并沒有說的完全對,這么做也是沒有大錯的。
它兩次判別P1-1的狀態,中間Delay(10),不過是防抖而已,就是說,第一次檢測到按鍵按下,并且過了一段時間發現還是按下狀態,那么就認為是按鍵動作,而不是干擾造成的。
一般來說這個時間是100ms左右到150ms左右,所以要有這么一段時間被delay做不了事情。但是這種干擾不多,所以大部分時間是跳過的。需要按鍵觸發的程序,100ms左右不做事情也不是什么大事。
但真要求嚴格了,比如說每50ms必須有些事兒要處理,不能有這種干擾,那么就放在中斷里,什么中斷?原文沒講清楚,應該是時間中斷,比如每隔100ms一次。中斷里寫
if(P1_0 == 0)
{
if(i == 0)
i = 1;
else{ 你的代碼}
}
else
{
i = 0;
}
這樣就行了。從初始化到判別,到誤判清零都有了,i應該是個全局變量,中斷可以訪問的,或者是個const的也可以
但是這么做也并不很好,所以更高效的是做一個自己的時間系統,即
中斷每1ms一次,有個變量做時間,假設叫做MyTimer,那么中斷里
MyTimer ++; 就可以
然后你判別的程序就寫成,
if(p1_1 == 0)
{
if(pressed == 0)
LastTime = MyTimer;
else
if(MyTimer - LastTimer > 100)
{
your code
}
}
else{
pressed = 0;
}
當然你的代碼里要處理狀態復位,清零,停止判別P1_1等具體事情,而MyTimer-LastTimer也要處理時間反卷等具體細節了。

TA貢獻1921條經驗 獲得超9個贊
進入第1個if判斷語句后,就進入了Delay(10);再看Delay函數,完全讓CPU執行(;空語句),所以在做大的產品或者代碼時,這個是非常耗費單片機內部資源的。
----這方法,適合于簡單的、單任務的情況。
利用定時(如 10ms)中斷,就可以輪流檢測各個按鍵以及其它需要處理的任務的標志。
某一個條件滿足了,就執行對應處理程序。
這樣就可以實現:多任務操作。
輪流檢測,就包括了:“查詢按鍵的標志位”、“查詢延時的標志位”。
就是說,檢測到按鍵按下,還不應該立即處理,應該繼續查詢:它按了多少個10ms。
以此來判斷:短按、長按、雙擊等等。
一般,還要檢測到按鍵釋放,再執行該鍵短按、長按、雙擊所對應的程序。
- 2 回答
- 0 關注
- 295 瀏覽
添加回答
舉報