找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 3315|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機程序運行和中斷處理的疑惑

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:258164 發(fā)表于 2018-11-28 13:38 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
今天在做按鍵的長短按的程序時,突然有了疑惑。
我的程序流程是:定時器每隔50ms定時一次,計數(shù)器標志加1,主程序中判斷計數(shù)器的值,大于60表示按鍵按下到松開時間為3s,判定為長按。
主程序示例代碼:
main(){
     ...
     ...
    while(1){
         if(按鍵按下){
                 開啟定時器;
                 while(等待按鍵松開);
                 關(guān)閉定時器;

                 判斷長短按;
          }

    }
}


我的疑惑是:假如我現(xiàn)在是1s的短按。我的定時中斷程序50ms執(zhí)行一次,我的主程序中在等待按鍵松開需要1s中,是不是說我的程序在這個地方一直等待1s?這時候我的單片機運行情況是什么樣?
如果是一直等待中不干別的,那這種方法對單片機的利用效率也太低了吧。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:434977 發(fā)表于 2018-11-28 14:59 | 只看該作者
按照你這樣的代碼,主程序就是這么執(zhí)行的。
由于你哪個while(等待按鍵松開)語句,主程序會一直在這個循環(huán)執(zhí)行,直到你按鍵松開,然后跳出循環(huán),接著就是定時器關(guān)閉。
在定時器開始,到關(guān)閉,這段時間,定時器是一直以你定的頻率運行的。
然后就是檢測你的按鍵是否達到3s,按照你的描述,是不足3s的,判斷為短按。
回復(fù)

使用道具 舉報

板凳
ID:47286 發(fā)表于 2018-11-28 15:04 | 只看該作者
不能這么寫吧 while會造成死等

如果 按鍵按下
并且 清零標記=0(防止反復(fù)清零計數(shù)器)
{
  如果 清零標記=0
  置位 清零標記
  清零 計數(shù)器變量(清零后累加的時間即按鍵按下的時間)
}

如果 清零標記=1
{
  如果 按鍵松開
{
   比較計數(shù)器值
  {
     如果 計數(shù)器<設(shè)定值
     {短按}
     否則
    {長按}
    清零 清零標記(可以再次清零)
   }
}
}

大概的邏輯順序 用for和while的延時基本都是死等 會影響其它步驟工作 尤其是程序?qū)懘罅?盡量養(yǎng)成少用這種方法的習慣吧 這方法多是初學為了容易理解 或者在不重要的地方做很短的延時才會用 你這成秒的等通常不這么搞
回復(fù)

使用道具 舉報

地板
ID:426340 發(fā)表于 2018-11-28 15:23 來自觸屏版 | 只看該作者
在這1s內(nèi)你給它設(shè)定為等待按鍵松開了呀
回復(fù)

使用道具 舉報

5#
ID:94031 發(fā)表于 2018-11-28 15:31 | 只看該作者
你不要 while(一直等待按鍵松開);而是50ms來讀一次鍵狀態(tài),如果還在按下狀態(tài)就繼續(xù)計數(shù),否則停止計數(shù),這樣除了讀數(shù),處理這段時間外,還可以干別的事。
回復(fù)

使用道具 舉報

6#
ID:258164 發(fā)表于 2018-11-28 16:02 | 只看該作者
dzbj 發(fā)表于 2018-11-28 15:04
不能這么寫吧 while會造成死等

如果 按鍵按下

感謝回答,我就是煩惱死等的問題,這樣我的其他處理要等很長時間,對實際的應(yīng)用來說是不能接受的。
但是你說的這種控制邏輯我還是不太明白,我怎么檢測我的按鍵何時松開的呢?
回復(fù)

使用道具 舉報

7#
ID:428685 發(fā)表于 2018-11-28 16:03 | 只看該作者
你好,可不可以把程序發(fā)出來。
回復(fù)

使用道具 舉報

8#
ID:258164 發(fā)表于 2018-11-28 16:08 | 只看該作者
xuyaqi 發(fā)表于 2018-11-28 15:31
你不要 while(一直等待按鍵松開);而是50ms來讀一次鍵狀態(tài),如果還在按下狀態(tài)就繼續(xù)計數(shù),否則停止計數(shù),這 ...

謝謝,這也是一種方法,有沒有效率更高的方法呢,因為我的整個程序要做的事情很多,所以一個循環(huán)周期越短越好
回復(fù)

使用道具 舉報

9#
ID:424805 發(fā)表于 2018-11-28 16:22 | 只看該作者
在短按一秒的時間內(nèi),你可以做其他事。但是你一直按就有問題了。程序沒有處理好。
回復(fù)

使用道具 舉報

10#
ID:401564 發(fā)表于 2018-11-28 17:28 | 只看該作者
非得是延時嗎?
比如:按鍵按下一次,進行一次ADC,把ADC運行的時長當成是延時,又可以去抖動又可以延時,又不浪費MCU的時鐘,還沒有松開的話,再進行一次ADC,這不就節(jié)省資源了嗎
回復(fù)

使用道具 舉報

11#
ID:258164 發(fā)表于 2018-11-29 09:09 | 只看該作者
Y_G_G 發(fā)表于 2018-11-28 17:28
非得是延時嗎?
比如:按鍵按下一次,進行一次ADC,把ADC運行的時長當成是延時,又可以去抖動又可以延時, ...

是這樣的,我做的這個產(chǎn)品按鍵比較多,單片機資源有比較緊張,所以按鍵都是普通讀IO口的方式。
回復(fù)

使用道具 舉報

12#
ID:258164 發(fā)表于 2018-11-29 10:27 | 只看該作者
感謝各位的回答,在網(wǎng)上看到關(guān)于利用狀態(tài)機處理按鍵的思想,覺得是個不錯的方法,這里分享下
https://blog.csdn.net/xiaocheng_sky/article/details/52146083
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表