• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機學習之十:查詢方式按鍵

    單片機學習之十:查詢方式按鍵

    作者: 時間:2016-09-27 來源:網絡 收藏

      一、實驗現象

    本文引用地址:http://www.czjhyjcfj.com/article/201609/310402.htm

      最右面的數碼管初始顯示0,每次按下外部按鍵K1執行加一,計數到九時重新回零。

      二、實驗目的

      掌握讀取外部按鍵時候應該注意的事項,掌握查詢方式響應按鍵的方法

      掌握讀取按鍵去抖動的方法

      掌握判直接尋址位轉移指令jb,jnb的用法。

      三、實驗任務分析

      響應外部按鍵的方式有兩種,一種是查詢方式,一種是方式。

      查詢方式的響應過程如下:不斷的查詢是否有按鍵按下,如果有按鍵按下的話,就執行相應的程序,否則繼續查詢。

      方式的響應過程如下:處理自己的工作,如果有按鍵按下,向單片機發出請求。單片機停下現在正在處理的工作,轉去執行中斷程序,執行之后回來繼續剛才的工作。

      本試驗程序我們采用查詢方式完成,下一個試驗我們采用中斷方式完成。

      還是先看看電路圖吧,當JMP4跳線拔下的時候,電路圖如下圖6-1所示。

      (注:如果JMP4跳線插上,則按鍵和中斷建立聯系。在本試驗中,JMP4跳線可以插也可以不插。因為我們采用查詢方式,沒有開中斷。具體情況下一個試驗介紹。)

      

     

      從圖上我們可以看到,當按鍵k1按下的時候,對應P1.0輸入低電平。因此,我們要查詢k1是否按下,只要檢測到p1.0是低電平就可以拉。

      注意,在查詢按鍵是否按下時候,特別需要注意按鍵的去抖動問題,為什么呢?

      由于按鍵或者鍵盤都是利用機械觸點的合、斷作用。由于機械觸點的彈性作用,在閉合和斷開的瞬間都會出現抖動問題。由于這種抖動,使得電壓信號在機械觸點的閉合、斷開瞬間會出現一系列的脈沖信號,如下圖所示。抖動的時間長短,與開關的機械特性有關,一般為5~10ms。

      按鍵的穩定閉合期,由操作人員的按鍵動作確定,一般為十分之幾秒至幾秒。為了保證按下一次按鍵,單片機只對按鍵作一次處理,就必須經過去抖動處理。

      

     

      通常去抖動的方法有硬件和軟件兩種。

      硬件去抖是利用基本RS觸發器或者單穩態電路構成,大家可以參考相關數電教材。

      軟件處理的方法是:在檢測到按鍵按下時,執行一個10ms左右的延時程序后,再次檢測該按鍵是否按下。如果仍然是按下狀態,就確認為鍵真正按下,從而消除了抖動的影響。

      按照這個思路編寫的程序如下:

      四、實驗程序

      org 0000h

      start: clr p1.5

      mov p0,#48h

      mov p2,#01h ;初始狀態最右面的數碼管顯示0

      main: mov r7,#0ffh

      wait1: jb p1.0,wait1 ;如果P1.0為1,轉回wait1繼續查詢。否則調用延時程序

      lcall del10ms ;調用10ms延時

      jb p1.0,wait1 ;再次查詢P1.0,如果是1,表示是抖動,轉回wait1

      ljmp play1 ;確定按鍵按下,轉去數碼顯示程序

      play1: inc r7

      mov a,r7

      mov dptr,#tab

      movc a,@a+dptr ;利用查表指令找欲顯示的數字,

      mov p0,a ;把 這個數字送到P0顯示

      cjne a,#48h,wait1 ;如果沒有顯示到最后一個數字,就繼續查詢按鍵狀態

      ljmp main ;如果顯示到最后一個數字就重新開始

      tab: db 0ebh,52h,62h,0e1h,64h,44h,0eah,40h,60h,48h ;存放欲顯示數字的表格

      del10ms:mov r6,#14h ;10ms延時子程序

      del1: mov r5,#0ffh

      del2: djnz r4,del2

      djnz r3,del1

      ret

      end

      把這個程序下載到學習板上,按下k1,發現了什么?

      我們發現這個程序運行不是很穩定,如果我們按下的時間稍微長一點,顯示的數字就會變換幾次。

      這是為什么呢?

      由于數字顯示之后,單片機會返回重新查詢P1.0的狀態,如果按下的時間很長,就會導致單片機又檢測到低電平,所以就繼續顯示。因此就會出現錯誤。

      如果我們希望按下一次按鍵,無論時間長短,單片機只作一次按鍵處理,應該怎么辦呢?

      我們可以這樣作:在數字顯示之后,返回重新查詢之前,我們加入一條指令,讓單片機檢測P1.0是否回到高電平。如果是,就表示按鍵按下了一次,程序可以返回繼續查詢,否則等待,一直到P1.0回到高電平。這樣就保證了按鍵按下一次,無論時間長短,單片機只作一次按鍵處理。

      具體的做法是在原來的程序中增加如下的紅色語句,改進后的程序如下:

      org 0000h

      start:clr p1.5

      mov p0,#48h

      mov p2,#01h ;初始狀態右面數碼管顯示0

      main: mov r7,#0ffh

      wait1:jb p1.0,wait1 ;按鍵沒有按下,等待

      call del10ms ;調用延時

      jb p1.0,wait1 ;繼續查詢

      ljmp play1

      play1: inc r7

      mov a,r7

      mov dptr,#tab

      movc a,@a+dptr

      mov p0,a ;查表顯示數字

      wait2: jnb p1.0,wait2 ;等待按鍵彈起

      cjne a,#48h,wait1 ;判斷是否顯示到最后一個數字

      ljmp main

      ret

      tab: db 0ebh,52h,62h,0e1h,64h,44h,0eah,40h,60h,48h

      del10ms:mov r6,#14h

      del1: mov r5,#0ffh

      del2: djnz r4,del2

      djnz r3,del1

      ret

      end



    關鍵詞: 單片機 中斷

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 南澳县| 石棉县| 高邑县| 民和| 田阳县| 沾化县| 盐边县| 安化县| 绵阳市| 胶州市| 青田县| 乾安县| 鸡东县| 巫溪县| 玉林市| 岳普湖县| 弥勒县| 城步| 溧水县| 南宁市| 广安市| 江孜县| 龙门县| 凤凰县| 钟山县| 普陀区| 根河市| 囊谦县| 德安县| 泾阳县| 隆回县| 安新县| 娄底市| 淳化县| 香河县| 望谟县| 夏河县| 皋兰县| 昭平县| 永新县| 峨眉山市|