s5-4鍵盤管理與程序設(shè)計(jì)剖析.ppt_第1頁
s5-4鍵盤管理與程序設(shè)計(jì)剖析.ppt_第2頁
s5-4鍵盤管理與程序設(shè)計(jì)剖析.ppt_第3頁
s5-4鍵盤管理與程序設(shè)計(jì)剖析.ppt_第4頁
s5-4鍵盤管理與程序設(shè)計(jì)剖析.ppt_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余20頁可下載查看

下載本文檔

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

文檔簡介

1、鍵盤管理與程序設(shè)計(jì),按鍵的分類,按結(jié)構(gòu)和使用方法的不同,可將按鍵分為兩大類:獨(dú)立按鍵和矩陣鍵盤。,目 錄,獨(dú)立按鍵的常用接法,80C51單片機(jī)的兩種常見的獨(dú)立按鍵接法:,I/O口為開漏結(jié)構(gòu)時,需外接上拉電阻,如51的P0口,I/O內(nèi)部自帶弱上拉電阻時,可直接相連,如51的P1、P2、P3口,未按下時 為高電平,剛釋放時 出現(xiàn)抖動,剛按下時 出現(xiàn)抖動,按下穩(wěn)定 后為低電平,實(shí)際效果,剛釋放時 出現(xiàn)抖動,按鍵的“抖動”現(xiàn)象,按鍵的結(jié)構(gòu):和電路圖中的符號極為相似,它是靠鍍銀的銅合金簧片在按鍵柄的擠壓下接觸而導(dǎo)通,松開后簧片恢復(fù)原狀而脫離接觸斷開。,理想效果,按鍵的抖動:按鍵在人手指按壓/釋放簧片的瞬

2、間,因接觸不良而產(chǎn)生的反復(fù)跳動現(xiàn)象。,“抖動”的脈沖寬度一般在幾十到幾百微秒,也可能達(dá)到毫秒級,若加在運(yùn)行速度很快的數(shù)字電路中將會產(chǎn)生很大的影響。比如將發(fā)生“抖動”現(xiàn)象的按鍵作為數(shù)字電路的時鐘輸入,則每按一次鍵都會產(chǎn)生一串極不穩(wěn)定的脈沖。,按鍵的“抖動”測試原理,編程思路:用按鍵模擬計(jì)數(shù)輸入信號,用4位LED數(shù)碼管顯示計(jì)數(shù)值。 實(shí)驗(yàn)現(xiàn)象:在理想效果下,每按一次鍵,I/O口僅檢測到1次高/低電平轉(zhuǎn)換,計(jì)數(shù)加1;在實(shí)際效果中,由于“抖動”存在,每按一次鍵, I/O口檢測到多次電平轉(zhuǎn)換,計(jì)數(shù)好幾次。,理想效果:,實(shí)際效果:,按鍵的“抖動”測試程序,存放4位計(jì)數(shù)值,0 x7A,0 x7B,地址 數(shù)據(jù),

3、存放將計(jì)數(shù)值轉(zhuǎn)換成數(shù)碼管顯示的字符碼,ORG 0000H Start:MOV0 x7A,#0 x00;計(jì)數(shù)器高2位寄存器0 x7A清0 MOV0 x7B,#0 x00;計(jì)數(shù)器低2位寄存器0 x7B清0 LD_Data:MOVR0,#0 x7C;取顯示緩沖區(qū)首地址到指針R0 MOVA,0 x7A;取計(jì)數(shù)器高2位數(shù)據(jù) ACALL Split_Display_Byte;將數(shù)據(jù)字符送顯示緩沖區(qū)前2個單元 MOVA,0 x7B;取計(jì)數(shù)器低2位數(shù)據(jù) ACALL Split_Display_Byte;將數(shù)據(jù)字符送顯示緩沖區(qū)后2個單元,0 x00,0 x00,高4位轉(zhuǎn)換的字符碼,低4位轉(zhuǎn)換的字符碼,0 xC0

4、,0 xC0,0 xC0,0 xC0,Display_Loop: ACALLScan_Display_Value;調(diào)用顯示掃描子程序 JBP3.4, Display_Loop ;P3.4是否為0?鍵未按下,轉(zhuǎn)Display_Loop MOV A, #0 x01 ;A取加數(shù)1 ADDA, 0 x7B;計(jì)數(shù)器+1 DAA;10進(jìn)制修正指令 MOV 0 x7B,A;回存低2位的運(yùn)算結(jié)果到0 x7B CLRA ;清0累加器A ADDC A,0 x7A;帶進(jìn)位加法加計(jì)數(shù)器高2位數(shù)據(jù) DAA MOV0 x7A,A;回存高2位的運(yùn)算結(jié)果到0 x7A JNBP3.4, $;檢查按鍵是否松開,P3.4=1 本地

5、循環(huán) AJMP LD_Data;按鍵松開,轉(zhuǎn)LD_Data,數(shù)碼管顯示:,0 x01,按鍵的“抖動”測試程序流程圖,Y,啟動延時,停止延時,消除“抖動”的方法,消除“抖動”的方法:硬件消抖和軟件消抖兩大類。 常見的硬件消抖方法是:低通濾波施密特整形以及RS觸發(fā)器,而軟件消抖方法就是插入適當(dāng)?shù)难訒r。,軟件消抖: 在按鍵按下的瞬間啟動定時器開始延時,延時td時間后再判斷按鍵是否仍然按下,若仍按下,則本次按鍵有效;否則本次按鍵無效。,思考題: 如何增加延時消除“抖動”,請嘗試修改前面的程序。 如果認(rèn)真觀察實(shí)驗(yàn),一定會發(fā)現(xiàn)前面的程序有一個小小的不足,就是在按鍵按下的瞬間顯示器會熄滅,請分析原因。,目

6、錄,矩陣鍵盤工作原理,行 線,列 線,按鍵的兩端分別接在行線和列線上,矩陣鍵盤:用盡可能少的I/O口去管理較多的按鍵。 最大的優(yōu)點(diǎn)是組合靈活,假如有16個I/O可用作鍵盤電路,可以將它接成610、511或88等許多種接法。當(dāng)然,使用效率最高的是88的接法,最多可以接64個按鍵。 矩陣連接法要區(qū)分和判斷按鍵動作的方法比較復(fù)雜,所以這種接法一般只用在計(jì)算機(jī)技術(shù)中。,目 錄,逐行掃描實(shí)驗(yàn)電路,TinyView的2 4 矩陣鍵盤,行 線,列 線,I/O口復(fù)用,TinyView的2 4 矩陣鍵盤,行 線,列 線,I/O口復(fù)用:將同一個(或組)I/O口用于2種不同作用的2個器件上。 能夠復(fù)用的原因:因?yàn)橛?jì)

7、算機(jī)是一種“串行”執(zhí)行程序的機(jī)器,是一條接一條的執(zhí)行指令,而不是全部指令一起上。利用這種在時間上的可區(qū)分性使其在不同的時間管理不同的部件。,這種復(fù)用是有條件的,對于需要保持確定狀態(tài)的控制口(如控制一個繼電器開關(guān)的端口)是沒辦法復(fù)用的。,逐行逐列掃描法,逐行掃描鍵盤的方法 選擇KR1和KR2為輸入,它們的常態(tài)是電平“1”。當(dāng)沒有按鍵按下時,KR1和KR2保持常態(tài)。當(dāng)KY1按下時,KR1在KC1輸出“0”電平時得到“0”信號,而KR2在不受影響仍然保持常態(tài)。,2 4 矩陣鍵盤,行 線,列 線,利用這種必須配合KC1KC4的輸出情況才能使KR1或KR2得到“0”信號的特點(diǎn),人們發(fā)明出鍵盤的逐行掃描法

8、。 即每次只有一根列線輸出“0”,然后逐行掃描讀入行信號,通過行信號來判斷鍵盤所有按鍵的狀態(tài)。,1,1 1 1 1,0 1 1 1,1,0,逐列掃描鍵盤的方法:把行和列的輸入輸出顛倒,其原理和操作方法與逐行掃描鍵盤的方法一致。 逐個掃描鍵盤的方法:,逐行掃描讀鍵子程序代碼,Scan_Key:MOV P1, #0 xFF;關(guān)閉所有段選,阻止掃描鍵盤對顯示的影響 MOV R6, #0 x04;設(shè)定鍵盤計(jì)數(shù)器為4,即循環(huán)4次 MOV R5, #0 xFB 取第一位掃描控制數(shù)據(jù) Scan_KLP:MOV P3, R5;送位選數(shù)據(jù)到位選口 SETB P3.6;設(shè)置采樣口P3.6進(jìn)入采樣狀態(tài) SETB P

9、3.7;設(shè)置采樣口P3.7進(jìn)入采樣狀態(tài) JNBP3.6, Scan_KBK1;檢查KR1為0否,是,轉(zhuǎn)Scan_KBK1 JNBP3.7, Scan_KBK2 ;檢查KR2為0否,是,轉(zhuǎn)Scan_KBK2 MOV A, R5;位選暫存器到A RLA;A循環(huán)左移使下一只位選輸出0電平 MOV R5, A;A返存回位選暫存器 DJNZR6, Scan_KLP;鍵盤計(jì)數(shù)器減1,非0,返回Scan_KLP Scan_KBK1:MOVA, R6;A取位選計(jì)數(shù)器數(shù)值 RET Scan_KBK2:MOVA, R6;A取位選計(jì)數(shù)器數(shù)值 ADDA, #4 RET,P1:數(shù)碼管段選控制端,因數(shù)碼管位選與鍵盤列控制

10、線復(fù)用,故在此先關(guān)閉所有段選,阻止掃描鍵盤對顯示的影響。 R6:鍵盤計(jì)數(shù)器,4:4列,單次逐行掃描到所有按鍵循環(huán)的次數(shù)。 R5:位選/列線控制數(shù)據(jù),控制每次只有一根列線為“0”。,實(shí)現(xiàn)功能:單次逐行掃描8個按鍵。當(dāng)有鍵按下時,程序立即跳出循環(huán),輸出參數(shù)A不為0;當(dāng)無鍵按下時,R6被減為0并退出循環(huán),輸出參數(shù)A=0。,按鍵掃描順序:先判斷KY1是否按下?如果是,R6為4傳給A并退出子程序;如果不是,接著判斷KY5是否按下;如果是,R6為4傳給A,A加4后退出子程序;如果不是,則接著判斷KY2是否按下依此類推,KY1KY5 KY2 KY6 KY3 KY7 KY4 KY8 輸出參數(shù):無鍵按下,A=0

11、; KY1按下,A=4;KY5按下,A=8; KY2按下,A=3;KY6按下,A=7; KY3按下,A=2; KY7按下,A=6; KY4按下,A=1; KY8按下,A=5,逐行掃描讀鍵子程序流程圖,逐行掃描讀鍵程序范例,程序流程: 首先對四位計(jì)數(shù)器賦初值0,并進(jìn)行顯示循環(huán),在循環(huán)中運(yùn)行鍵盤程序隨時檢查按鍵狀態(tài)。 當(dāng)無鍵按下時,程序保持循環(huán)狀態(tài)。 當(dāng)有鍵按下時,先判斷是否是KY1按下?如果是,則計(jì)數(shù)器加1。如果不是,則轉(zhuǎn)而檢查是否是KY8按下?如果是,計(jì)數(shù)器減1。如果不是,則程序不做任何操作返回重來。,ORG0000H Start:MOV0 x7A,#0 x00;清0計(jì)數(shù)器高2位寄存器0 x7

12、A MOV0 x7B,#0 x00;清0計(jì)數(shù)器低2位寄存器0 x7B LD_Data: ACALL L_DisplayBuf;將0 x7A、0 x7B數(shù)字字符調(diào)入顯示緩沖區(qū) Display_Loop:ACALL Scan_Display_Value;調(diào)用顯示掃描子程序 ACALL Scan_Key ;調(diào)用鍵盤掃描子程序 JZDisplay_Loop ;無鍵按下,轉(zhuǎn)Display_Loop重復(fù)顯示,逐行掃描讀鍵程序范例,程序流程: 首先對四位計(jì)數(shù)器賦初值0,并進(jìn)行顯示循環(huán),在循環(huán)中運(yùn)行鍵盤程序隨時檢查按鍵狀態(tài)。 當(dāng)無鍵按下時,程序保持循環(huán)狀態(tài)。 當(dāng)有鍵按下時,先判斷是否是KY1按下?如果是,則計(jì)

13、數(shù)器加1。如果不是,則轉(zhuǎn)而檢查是否是KY8按下?如果是,計(jì)數(shù)器減1。如果不是,則程序不做任何操作返回重來。,CJNEA, #0 x04, Next_Key ;是KY1鍵按下嗎?不是,則轉(zhuǎn)Next_Key ; 加1計(jì)數(shù)程序 MOV A, 0 x7B ;取計(jì)數(shù)器的低2位數(shù)值 ADDA, #0 x01 ;數(shù)值加1 DAA ;調(diào)整10進(jìn)制數(shù) MOV 0 x7B, A;將低2位運(yùn)算結(jié)果回存到0 x7B MOV A, 0 x7A ;取計(jì)數(shù)器的高2位數(shù)值 ADDC A,#0 x00;帶進(jìn)位加法加0,如有進(jìn)位高2位加1 DAA;調(diào)整10進(jìn)制數(shù) MOV0 x7A, A;將高2位的運(yùn)算結(jié)果回存0 x7A AJMP

14、 Key_Back;轉(zhuǎn)Key_Back鍵返回處理程序,4 位 計(jì) 數(shù) 器 加 1,逐行掃描讀鍵程序范例,程序流程: 首先對四位計(jì)數(shù)器賦初值0,并進(jìn)行顯示循環(huán),在循環(huán)中運(yùn)行鍵盤程序隨時檢查按鍵狀態(tài)。 當(dāng)無鍵按下時,程序保持循環(huán)狀態(tài)。 當(dāng)有鍵按下時,先判斷是否是KY1按下?如果是,則計(jì)數(shù)器加1。如果不是,則轉(zhuǎn)而檢查是否是KY8按下?如果是,計(jì)數(shù)器減1。如果不是,則程序不做任何操作返回重來。,Next_Key :CJNEA,#0 x05,Display_Loop ;是KY8鍵按下嗎?否,返回Display_Loop ; 減1計(jì)數(shù)程序 MOV A, 0 x7B;取計(jì)數(shù)器低2位數(shù)值 ADDA, #0 x

15、99 ;加99,相當(dāng)于減1操作 DAA ;進(jìn)行10進(jìn)制修正 MOV 0 x7B, A;將低2位運(yùn)算結(jié)果回存到0 x7B JC Key_Back;是否有溢出,是,則不借位 MOV A, 0 x7A;取計(jì)數(shù)器高2位數(shù)值 ADD A, #0 x99 ;加99,相當(dāng)于減1操作 DA A;10進(jìn)制修正指令 MOV0 x7A, A;將高2位的運(yùn)算結(jié)果回存0 x7A,4 位 計(jì) 數(shù) 器 減 1,減1操作: 因?yàn)椤癉A A”指令只對加法指令起作用,所以程序以加99來處理減1。 對于8位寄存器,值不為0時,加99后會產(chǎn)生進(jìn)位,8位寄存器被減1,如6+99=105,8位寄存器中的值為5,實(shí)現(xiàn)減1。 值為0時,加9

16、9后8位寄存器中的值變成99,不產(chǎn)生進(jìn)位,需要向高位借位。,逐行掃描讀鍵程序范例,程序流程: 首先對四位計(jì)數(shù)器賦初值0,并進(jìn)行顯示循環(huán),在循環(huán)中運(yùn)行鍵盤程序隨時檢查按鍵狀態(tài)。 當(dāng)無鍵按下時,程序保持循環(huán)狀態(tài)。 當(dāng)有鍵按下時,先判斷是否是KY1按下?如果是,則計(jì)數(shù)器加1。如果不是,則轉(zhuǎn)而檢查是否是KY8按下?如果是,計(jì)數(shù)器減1。如果不是,則程序不做任何操作返回重來。,Key_Back: ACALL L_DisplayBuf ;將0 x7A、0 x7B數(shù)字字符調(diào)入顯示緩沖區(qū) ACALL Scan_Display_Value;調(diào)用顯示掃描程序 ACALL Scan_Key ;調(diào)用鍵盤掃描程序 JNZ

17、 Key_Back;按鍵是否松開?否,則轉(zhuǎn)Key_Back繼續(xù)檢查 SJMP Display_Loop ;有,返Display_Loop,“線反轉(zhuǎn)法”按鍵檢測技術(shù),問題提出:當(dāng)這個矩陣擴(kuò)大到一定數(shù)目時,逐行掃描的方法會很費(fèi)時,如果需要對2個以上的按鍵“同時”操作時,則處理起來更麻煩。 解決方法:按鍵的處理程序并非只有逐行掃描法這一種,如:“線反轉(zhuǎn)法”按鍵檢測技術(shù),也是矩陣鍵盤應(yīng)用中的一種經(jīng)典程序處理方法。,線反轉(zhuǎn)法:將矩陣電路行、列的I/O屬性進(jìn)行調(diào)換處理。矩陣電路的行、列線必須一組輸出、一組輸入,而線反轉(zhuǎn)的操作方法是多進(jìn)行一次這種操作。 具體實(shí)現(xiàn):假設(shè)有KY1、KY3、KY8這3個按鍵同時按

18、下。,第一步:,輸入,輸出,輸出,輸入,1 1 1 1,1,1,0 0 0 0,0,0,第二步:線反轉(zhuǎn),1,1,1 1 1 1,0,0 1 0 1,由KR1和KR2可推斷出:兩行都有按鍵按下。, 結(jié)合第一步的推斷,可知KY1和KY3按下; 結(jié)合第一步的推斷,可知KY8按下。,0,1 1 1 0,線反轉(zhuǎn)法不但采樣速度快,而且鍵盤信息全面,但它對硬件有一定的要求:行線和列線都必須是可反轉(zhuǎn)的,既可配置為輸出,又可配置成輸入。此外,行線和列線的分組最好在2個不同的操作口上,比如,80C51的P1和P3。,“線反轉(zhuǎn)法”按鍵檢測應(yīng)用,AT89C52,P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7,+5v,0行,1行,2行,3行,0列,1列,2列,3列, 由行線輸出全“0”,讀入列線,判有無鍵按下。 若有鍵按下,再將讀入的列 線值由列線輸出,讀進(jìn)行線的值。 第一步讀進(jìn)的列線值與第二步讀進(jìn)的行線值相加,從而得到代表此鍵的唯一的特征值。,AT89C52,P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7,+5v,MOV P1,#0F0H ;低位送全“0” MO

溫馨提示

  • 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

提交評論