找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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

                 判斷長短按;
          }

    }
}


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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

如果 按鍵按下

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

謝謝,這也是一種方法,有沒有效率更高的方法呢,因?yàn)槲业恼麄€(gè)程序要做的事情很多,所以一個(gè)循環(huán)周期越短越好
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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