AVR學(xué)習(xí)筆記十九、4X4矩陣鍵盤實驗_第1頁
AVR學(xué)習(xí)筆記十九、4X4矩陣鍵盤實驗_第2頁
AVR學(xué)習(xí)筆記十九、4X4矩陣鍵盤實驗_第3頁
AVR學(xué)習(xí)筆記十九、4X4矩陣鍵盤實驗_第4頁
AVR學(xué)習(xí)筆記十九、4X4矩陣鍵盤實驗_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

AVR學(xué)習(xí)筆記十九、4X4矩陣鍵盤實驗19.1實例功能在前面的實例中我們已經(jīng)學(xué)習(xí)了在單片機(jī)系統(tǒng)中檢測獨(dú)立式按鍵的接口電路和程序設(shè)計,獨(dú)立式按鍵的每個按鍵占用1位I/O口線,其狀態(tài)是獨(dú)立的,相互之間沒有影響,只要單獨(dú)測試鏈接案件的I/O口線電平的高低就能判斷鍵的狀態(tài)。獨(dú)立式按鍵電路簡單、配置靈活,軟件結(jié)構(gòu)也相對簡單。此種接口方式適用于系統(tǒng)需要按鍵數(shù)目較少的場合。在按鍵數(shù)量較多的情況下,如系統(tǒng)需要8個以上按鍵的鍵盤時,采用獨(dú)立式接口方式就會占用太多的I/O口,這對于I/O口資源不太豐富的單片機(jī)系統(tǒng)來說顯得相當(dāng)浪費(fèi),那么當(dāng)按鍵數(shù)目相對較多的時候,為了減少I/O口資源的占用,應(yīng)該采取什么樣的方式才能夠既滿足多按鍵識別,又減少I/O口的占用呢?當(dāng)然我們可以采用端口擴(kuò)展器件比如串并轉(zhuǎn)換芯片實現(xiàn)單片機(jī)I/O口的擴(kuò)展,但是這種方式既增加了電路的復(fù)雜性,又增加了系統(tǒng)的成本開銷。有沒有比較經(jīng)濟(jì)實惠的方法呢?事實上,在實際引用中我們經(jīng)常采用矩陣式鍵盤的方式來節(jié)約I/O口資源和系統(tǒng)成本。在這個實驗中,我們采用4X4矩陣鍵盤來實現(xiàn)使用8個I/O口識別16個按鍵的實驗,本實例分為三個功能模塊,分別描述如下:●單片機(jī)系統(tǒng):利用ATmega16單片機(jī)與矩陣鍵盤電路實現(xiàn)多按鍵識別?!裢鈬娐罚?X4矩陣鍵盤電路、LED數(shù)碼管顯示電路?!褴浖绦颍壕帉戃浖?,實現(xiàn)4X4矩陣鍵盤識別16個按鍵的程序。通過本實例的學(xué)習(xí),掌握以下內(nèi)容:●4X4矩陣鍵盤的電路設(shè)計和程序?qū)崿F(xiàn)。19.2器件和原理19.2.1當(dāng)鍵盤中按鍵數(shù)量較多時,為了減少對I/O口的占用,通常將按鍵排列成矩陣形式,也稱為行列鍵盤,這是一種常見的連接方式。矩陣式鍵盤接口見圖1所示,它由行線和列線組成,按鍵位于行、列的交叉點(diǎn)上。當(dāng)鍵被按下時,其交點(diǎn)的行線和列線接通,相應(yīng)的行線或列線上的電平發(fā)生變化,MCU通過檢測行或列線上的電平變化可以確定哪個按鍵被按下。圖1為一個4x4的行列結(jié)構(gòu),可以構(gòu)成16個鍵的鍵盤。很明顯,在按鍵數(shù)量多的場合,矩陣鍵盤與獨(dú)立式按鍵鍵盤相比可以節(jié)省很多的I/O口線。圖14X4鍵盤掃描電路 矩陣鍵盤不僅在連接上比單獨(dú)式按鍵復(fù)雜,它的按鍵識別方法也比單獨(dú)式按鍵復(fù)雜。在矩陣鍵盤的軟件接口程序中,常使用的按鍵識別方法有行掃描法和線反轉(zhuǎn)法。這兩種方法的基本思路是采用循環(huán)查循的方法,反復(fù)查詢按鍵的狀態(tài),因此會大量占用MCU的時間,所以較好的方式也是采用中斷的方法來設(shè)計,盡量減少鍵盤查詢過程對MCU的占用時間。在本實例中只是簡單演示矩陣鍵盤的按鍵識別技術(shù),所以仍然采用查詢方法。19下面以圖2為例,介紹采用行掃描法對矩陣鍵盤進(jìn)行判別的思路。圖2中,PA0、PA1、PA2、PA3為4根列線,這4根列線通過電阻接正電源,即上拉(當(dāng)然AVR單片機(jī)I/O口有內(nèi)部上拉電阻,可以設(shè)置內(nèi)部上拉電阻使能,從而不用連接4個外部上拉電阻),PA4、PA5、PA6、PA7為4根行線。將行線所接的I/O口作為輸出端,列線所接的I/O口作為輸入端。這樣,當(dāng)沒有按鍵按下時,所有的輸入端都是高電平,。設(shè)置行線輸出低電平,一旦有鍵按下,則輸入線會被拉低,這樣通過讀取輸入線的狀態(tài)就可以得知是否有按鍵按下。行掃描法按鍵識別的過程如下。圖2ATmega16與4X4鍵盤的連接1)、判斷鍵盤中是否有按鍵按下。將全部行線PA4-PA7置低電平輸出,然后讀PA0-PA3四根輸入列線的狀態(tài)。只要有低電平出現(xiàn),則說明有鍵按下(實際編程時,還要考慮按鍵的消抖)。如讀到的都是高電平,則表示無鍵按下。2)、判斷閉合鍵所在位置。在確認(rèn)有鍵按下后,即可進(jìn)入確定具體哪個鍵按下的過程。其思路是:依次將4根行線分別置為低電平,即在某根行線置為低電平時,其余行線為高電平,在確定某根行線置為低電平后,再逐列檢查各列線的電平狀態(tài),若某列為低電平,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。矩陣按鍵的識別僅僅是確認(rèn)和定位了行和列的交叉點(diǎn)上的按鍵,接下來還要考慮鍵盤的編碼,即對各個按鍵進(jìn)行編號。在軟件中常通過計算的方法或查表的方法對按鍵進(jìn)行具體的定義和編號。在單片機(jī)嵌入式系統(tǒng)中,鍵盤掃描只是MCU的工作內(nèi)容之一。MCU除了要檢測鍵盤和處理鍵盤操作之外,還要進(jìn)行其他事物的處理,因此,MCU如何響應(yīng)鍵盤的輸入需要在實際系統(tǒng)程序設(shè)計時認(rèn)真考慮。 通常,完成鍵盤掃描和處理的程序是系統(tǒng)程序中的一個專用子程序,MCU調(diào)用該鍵盤掃描子程序?qū)︽I盤進(jìn)行掃描和處理的方式有三種:程序控制掃描、定時掃描和中斷掃描。程序控制掃描方式。在主控程序中的適當(dāng)位置調(diào)用鍵盤掃描程序,對鍵盤進(jìn)行讀取和處理。定時掃描方式。在該方式中,要使用MCU的一個定時器,使其產(chǎn)生一個10ms的定時中斷,MCU響應(yīng)定時中斷,執(zhí)行鍵盤掃描,當(dāng)在連續(xù)兩次中斷中都讀到相同的按鍵按下(間隔10ms作為消抖處理),MCU才執(zhí)行相應(yīng)的鍵處理程序。中斷方式。使用中斷方式時,鍵盤的硬件電路要做一定的改動,增加一個按鍵產(chǎn)生中斷信號的輸入線,當(dāng)鍵盤有按鍵按下時,鍵盤硬件電路產(chǎn)生一個外部的中斷信號,MCU響應(yīng)外部中斷,進(jìn)行鍵盤處理。在本實例中我們介紹基于程序控制掃描方式的鍵盤處理系統(tǒng)的設(shè)計方法。19.3電路和連接本實驗主要有兩部分電路模塊組成:數(shù)碼管顯示電路,4X4鍵盤電路。數(shù)碼管顯示電路電路在前面的實例中我們已經(jīng)做過介紹,在此不再重復(fù)。這里我們重點(diǎn)介紹一下4X4鍵盤電路。4X4鍵盤電路如圖3所示圖34X4鍵盤電路18.4程序設(shè)計1、程序功能在本實例中,我們利用數(shù)碼管將4X4鍵盤中按下的按鍵的鍵碼值顯示出來。2、函數(shù)說明本實例主要有數(shù)碼管顯示程序和4X4鍵盤識別程序,數(shù)碼管顯示程序我們前面例子中已經(jīng)介紹過,本實例的程序中不再詳細(xì)說明。3、編程說明使用WINAVR開發(fā)環(huán)境,使用的是外部12M的晶振,所以需要將makefile文件中的時鐘頻率修改為12M。另外在程序燒錄到單片機(jī)的時候,熔絲位也要選擇為外部12M晶振(注意是晶振,不是外部振蕩器,一定不要選擇錯了,否則會導(dǎo)致單片機(jī)不能再燒寫程序)。4、程序代碼關(guān)于數(shù)碼管顯示程序,在此不再列出,直接打包到程序文件夾中。下面列出主程序以及4X4鍵盤識別程序。/***************************************************AVR使用范例4*4矩陣鍵盤檢測*******MCU:ATmega16*******作者:maweili*******編譯器:usbisp************** 2009.04.03**************************************************/#include<avr/io.h>//io端口寄存器配置文件,必須包含#include<util/delay.h>//GCC中的延時函數(shù)頭文件unsignedcharDisp_Buff[16]={0xaf,0xa0,0xc7,0xe6,0xe8,0x6e,0x6f,0xa2,0xef,0xee,0xeb,0x6d,0x0f,0xe5,0x4f,0x4b}; //數(shù)碼管字型碼表顯示:0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,FunsignedcharKeyNumber;//函數(shù)聲明voidDelayus(unsignedintlus);//us延時函數(shù)voidDelayms(unsignedintlms);//ms延時函數(shù)unsignedcharRead_Key(void);//讀取鍵值intmain(void)//GCC中main文件必須為返回整形值的函數(shù),沒有參數(shù){ PORTB=0X00;//PORTB口全部輸出低電平,使數(shù)碼管的段位全部為低電平,不亮 DDRB=0XFF;//配置端口PB全部為輸出口 PORTC&=~(1<<PC6);//配置數(shù)碼管0的位選通口為低電平,不導(dǎo)通數(shù)碼管 DDRC|=(1<<PC6);/// KeyNumber=16;//開始沒有按鍵按下,不顯示 while(1) { Read_Key();//讀取鍵值 PORTB=Disp_Buff[KeyNumber];//鍵值送數(shù)碼管顯示 PORTC|=(1<<PC6);//數(shù)碼管的位選通端口輸出高電平,使數(shù)碼管顯示 }}//us級別的延時函數(shù)voidDelayus(unsignedintlus){ while(lus--) { _delay_loop_2(3);//_delay_loop_2(1)是延時4個時鐘周期,參數(shù)為3則延時12 //個時鐘周期,本實驗用12M晶體,則12個時鐘周期為12/12=1us}}//ms級別的延時函數(shù)voidDelayms(unsignedintlms){ while(lms--) { Delayus(1000);//延時1ms}}//4*4矩陣鍵盤掃描,PD高四位為行輸出口,低四位為列輸入口unsignedcharRead_Key(void){ unsignedchari,j; DDRD=0xf0;//設(shè)置PD高四位為輸出口,低四位為輸入口 PORTD=0x00;//初始運(yùn)行輸出全為0 if((PIND&0x0f)==0x0f)return0;//判斷有無按鍵動作,沒有,返回0 else { Delayms(20);//按鍵消抖 if((PIND&0x0f)==0x0f)return0;//再次判斷是否有按鍵動作 else { for(i=4

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論