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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3235|回復: 11
收起左側

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

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

                 判斷長短按;
          }

    }
}


我的疑惑是:假如我現在是1s的短按。我的定時中斷程序50ms執行一次,我的主程序中在等待按鍵松開需要1s中,是不是說我的程序在這個地方一直等待1s?這時候我的單片機運行情況是什么樣?
如果是一直等待中不干別的,那這種方法對單片機的利用效率也太低了吧。
回復

使用道具 舉報

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內你給它設定為等待按鍵松開了呀
回復

使用道具 舉報

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

使用道具 舉報

ID:258164 發表于 2018-11-28 16:02 | 顯示全部樓層
dzbj 發表于 2018-11-28 15:04
不能這么寫吧 while會造成死等

如果 按鍵按下

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

使用道具 舉報

ID:428685 發表于 2018-11-28 16:03 | 顯示全部樓層
你好,可不可以把程序發出來。
回復

使用道具 舉報

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

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

使用道具 舉報

ID:424805 發表于 2018-11-28 16:22 | 顯示全部樓層
在短按一秒的時間內,你可以做其他事。但是你一直按就有問題了。程序沒有處理好。
回復

使用道具 舉報

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

使用道具 舉報

ID:258164 發表于 2018-11-29 09:09 | 顯示全部樓層
Y_G_G 發表于 2018-11-28 17:28
非得是延時嗎?
比如:按鍵按下一次,進行一次ADC,把ADC運行的時長當成是延時,又可以去抖動又可以延時, ...

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

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 三级在线观看 | 国产精品久久亚洲7777 | 久久91视频| 91大神在线资源观看无广告 | 一本色道精品久久一区二区三区 | 伊人天堂网 | 天堂久久天堂综合色 | 91免费在线 | 国产免费观看视频 | 精品久久香蕉国产线看观看亚洲 | 国产激情视频在线免费观看 | 狠狠操av| 精品一区二区三区在线视频 | 91影院在线观看 | 欧美另类视频 | 亚洲一区二区黄 | 婷婷久久网 | 91精品国产色综合久久 | 精精国产xxxx视频在线野外 | 九色av| 国产原创视频 | 精品少妇一区二区三区日产乱码 | 亚洲精品一区在线观看 | 国产成人精品一区二区三区在线 | 91国自视频 | 久久精品91久久久久久再现 | 美女视频黄的 | 精品一区二区观看 | 亚洲综合天堂 | 国产japanhdxxxx麻豆 | 狠狠干狠狠操 | 国产精品成人在线播放 | 国产精品久久久 | 国产成人99久久亚洲综合精品 | 久久久久99 | 丁香婷婷久久久综合精品国产 | 午夜久久久久久久久久一区二区 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 中文字幕在线三区 | 久久精品中文 | 国产精品欧美一区喷水 |