亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

可以將延時函數放在中斷中……方法解釋一下?

可以將延時函數放在中斷中……方法解釋一下?

炎炎設計 2022-10-01 17:13:39
if(P1_0 == 0){Delay(10);//問題就在這里,你讓CPU在這里空轉?if(P1_0 == 0){//...add your code here.}}進入第1個if判斷語句后,就進入了Delay(10);再看Delay函數,完全讓CPU執行(;空語句),所以在做大的產品或者代碼時,這個是非常耗費單片機內部資源的。有什么辦法嗎?呵呵,那是肯定的。解決方法大致有如下2種:1.將延時函數放在中斷中,在中斷里查詢延時的標志位。/*不僅僅用于鍵盤識別,亦可以用于其他的延時代碼.2.直接在中斷中查詢按鍵的標志位.這兩種解決方法我沒看懂,舉個例解釋一下,用定時器中斷就能不浪費單片機內部資源嗎?噢噢~~用中斷的時候單片機可以做其他事情?百度是可以得到例子,但是要能解釋清楚。謝謝。還有~什么叫查詢按鍵的標志位?什么叫查詢延時的標志位?
查看完整描述

2 回答

?
慕勒3428872

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也要處理時間反卷等具體細節了。


查看完整回答
反對 回復 2022-10-06
?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

進入第1個if判斷語句后,就進入了Delay(10);再看Delay函數,完全讓CPU執行(;空語句),所以在做大的產品或者代碼時,這個是非常耗費單片機內部資源的。

----這方法,適合于簡單的、單任務的情況。

利用定時(如 10ms)中斷,就可以輪流檢測各個按鍵以及其它需要處理的任務的標志。
某一個條件滿足了,就執行對應處理程序。
這樣就可以實現:多任務操作。

輪流檢測,就包括了:“查詢按鍵的標志位”、“查詢延時的標志位”。

就是說,檢測到按鍵按下,還不應該立即處理,應該繼續查詢:它按了多少個10ms。
以此來判斷:短按、長按、雙擊等等。
一般,還要檢測到按鍵釋放,再執行該鍵短按、長按、雙擊所對應的程序。


查看完整回答
反對 回復 2022-10-06
  • 2 回答
  • 0 關注
  • 295 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號