久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3240|回復: 11
打印 上一主題 下一主題
收起左側

關于單片機程序運行和中斷處理的疑惑

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

                 判斷長短按;
          }

    }
}


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

使用道具 舉報

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

使用道具 舉報

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

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

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

如果 按鍵按下

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久草在线青青草 | 人妖一区 | 国产aaaaav久久久一区二区 | 欧美日韩国产一区 | 免费成人在线网站 | 福利在线观看 | 蜜桃视频一区二区三区 | 一级做a爰片性色毛片视频停止 | 91网站在线观看视频 | 国产精品久久久久久久午夜片 | 亚洲在线一区二区 | 久久综合久久久 | 日韩a v在线免费观看 | 久久精品视频播放 | 久久久精品网站 | 在线黄 | 噜啊噜在线 | 免费h在线 | av日韩一区 | 欧美日韩视频在线 | 成人午夜电影在线观看 | 国产免费高清 | 精品国产区 | 日韩在线 | 中文字幕亚洲视频 | 99tv| 97国产精品 | 欧美综合久久 | 色综合一区二区 | 涩爱av一区二区三区 | 欧美精品在线播放 | 中文字幕一区在线观看视频 | 亚洲成人精品 | 国产精品精品视频一区二区三区 | 精品国产乱码久久久久久蜜退臀 | 日韩网站在线观看 | 视频一区二区三区中文字幕 | 在线播放日韩 | 欧美精品第一区 | 91精品国产一区二区三区 | 91热在线|