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頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、鍵盤管理與程序設(shè)計(jì) 按鍵的分類按結(jié)構(gòu)和使用方法的不同,可將按鍵分為兩大類:獨(dú)立按鍵和矩陣鍵盤。按結(jié)構(gòu)和使用方法的不同,可將按鍵分為兩大類:獨(dú)立按鍵和矩陣鍵盤。矩陣鍵盤矩陣鍵盤 獨(dú)立按鍵獨(dú)立按鍵 直接用直接用I/O控制,每個(gè)按鍵獨(dú)占一控制,每個(gè)按鍵獨(dú)占一個(gè)個(gè)I/O特特點(diǎn)點(diǎn)由行線和列線組成,按鍵位于交叉由行線和列線組成,按鍵位于交叉點(diǎn)上點(diǎn)上互不影響,配置靈活,結(jié)構(gòu)簡(jiǎn)單互不影響,配置靈活,結(jié)構(gòu)簡(jiǎn)單優(yōu)優(yōu)點(diǎn)點(diǎn)組合靈活,按鍵數(shù)量較多時(shí),節(jié)省組合靈活,按鍵數(shù)量較多時(shí),節(jié)省I/O按鍵多時(shí),按鍵多時(shí),I/O口浪費(fèi)嚴(yán)重口浪費(fèi)嚴(yán)重缺缺點(diǎn)點(diǎn)區(qū)分和判斷按鍵動(dòng)作的方法比較復(fù)區(qū)分和判斷按鍵動(dòng)作的方法比較復(fù)雜雜按鍵不超過按鍵

2、不超過8只時(shí)只時(shí)適適用用場(chǎng)場(chǎng)合合按鍵數(shù)量較多時(shí)按鍵數(shù)量較多時(shí) 目 錄 獨(dú)立鍵盤與消抖獨(dú)立鍵盤與消抖 矩陣鍵盤與掃描方法矩陣鍵盤與掃描方法 逐行逐列掃描法逐行逐列掃描法 S1VccP0.7R1 10KS2P2.3(a) (b) 獨(dú)立按鍵的常用接法 80C51單片機(jī)的兩種常見的獨(dú)立按鍵接法:?jiǎn)纹瑱C(jī)的兩種常見的獨(dú)立按鍵接法:I/O口為開漏結(jié)構(gòu)口為開漏結(jié)構(gòu)時(shí),需外接上拉電時(shí),需外接上拉電阻,如阻,如51的的P0口口I/O內(nèi)部自帶弱上拉內(nèi)部自帶弱上拉電阻時(shí),可直接相連,電阻時(shí),可直接相連,如如51的的P1、P2、P3口口5+E0V未按下時(shí)未按下時(shí)為高電平為高電平剛釋放時(shí)剛釋放時(shí)出現(xiàn)抖動(dòng)出現(xiàn)抖動(dòng)剛按下時(shí)剛

3、按下時(shí)出現(xiàn)抖動(dòng)出現(xiàn)抖動(dòng)按下穩(wěn)定按下穩(wěn)定后為低電平后為低電平實(shí)際效果實(shí)際效果窄脈沖干擾窄脈沖干擾 剛釋放時(shí)剛釋放時(shí)出現(xiàn)抖動(dòng)出現(xiàn)抖動(dòng) 按鍵的“抖動(dòng)”現(xiàn)象按鍵的結(jié)構(gòu):和電路圖中的符號(hào)極為相似,它是靠鍍銀的銅合金簧片在按鍵按鍵的結(jié)構(gòu):和電路圖中的符號(hào)極為相似,它是靠鍍銀的銅合金簧片在按鍵柄的擠壓下接觸而導(dǎo)通,松開后簧片恢復(fù)原狀而脫離接觸斷開。柄的擠壓下接觸而導(dǎo)通,松開后簧片恢復(fù)原狀而脫離接觸斷開。S1VccP0.7R1 10K“0”“1”理想效果理想效果按鍵的抖動(dòng):按鍵在人手指按壓按鍵的抖動(dòng):按鍵在人手指按壓/釋放簧片的瞬間,因接觸不良而產(chǎn)生的反復(fù)釋放簧片的瞬間,因接觸不良而產(chǎn)生的反復(fù)跳動(dòng)現(xiàn)象。跳動(dòng)現(xiàn)

4、象?!岸秳?dòng)抖動(dòng)”的脈沖寬度一般在幾十到幾百微秒,也可能達(dá)到毫秒級(jí),的脈沖寬度一般在幾十到幾百微秒,也可能達(dá)到毫秒級(jí),若加在運(yùn)若加在運(yùn)行速度很快的數(shù)字電路中將會(huì)產(chǎn)生很大的影響行速度很快的數(shù)字電路中將會(huì)產(chǎn)生很大的影響。比如將發(fā)生。比如將發(fā)生“抖動(dòng)抖動(dòng)”現(xiàn)象的按鍵作現(xiàn)象的按鍵作為數(shù)字電路的時(shí)鐘輸入,則每按一次鍵都會(huì)產(chǎn)生一串極不穩(wěn)定的脈沖。為數(shù)字電路的時(shí)鐘輸入,則每按一次鍵都會(huì)產(chǎn)生一串極不穩(wěn)定的脈沖。a b c d e f g hcom1 com2 com3 com4 按鍵的“抖動(dòng)”測(cè)試原理編程思路:用按鍵模擬計(jì)數(shù)輸入信號(hào),用編程思路:用按鍵模擬計(jì)數(shù)輸入信號(hào),用4位位LED數(shù)碼管顯示計(jì)數(shù)值。數(shù)碼管顯示

5、計(jì)數(shù)值。實(shí)驗(yàn)現(xiàn)象:在理想效果下,每按一次鍵,實(shí)驗(yàn)現(xiàn)象:在理想效果下,每按一次鍵,I/O口僅檢測(cè)到口僅檢測(cè)到1次高次高/低電平轉(zhuǎn)換,計(jì)數(shù)低電平轉(zhuǎn)換,計(jì)數(shù)加加1;在實(shí)際效果中,由于;在實(shí)際效果中,由于“抖動(dòng)抖動(dòng)”存在,每按一次鍵,存在,每按一次鍵, I/O口檢測(cè)到口檢測(cè)到多次電平轉(zhuǎn)換,計(jì)數(shù)好幾次。多次電平轉(zhuǎn)換,計(jì)數(shù)好幾次。SVccP3.4R10Ka b c d e f g hcom1 com2 com3 com4 理想效果:理想效果: 實(shí)際效果:實(shí)際效果: 按鍵的“抖動(dòng)”測(cè)試程序存放存放4位計(jì)數(shù)值位計(jì)數(shù)值0 x7A 0 x7B 地址地址 數(shù)據(jù)數(shù)據(jù) 0 x7C 0 x7D 0 x7E 0 x7F 存

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

7、計(jì)數(shù)器低取計(jì)數(shù)器低2位數(shù)據(jù)位數(shù)據(jù)ACALL Split_Display_Byte;將數(shù)據(jù)字符送顯示緩沖區(qū)后將數(shù)據(jù)字符送顯示緩沖區(qū)后2個(gè)單元個(gè)單元0 x00 0 x00 高高4位轉(zhuǎn)換的字符碼位轉(zhuǎn)換的字符碼低低4位轉(zhuǎn)換的字符碼位轉(zhuǎn)換的字符碼0 xC0 0 xC0 0 xC0 0 xC0 Display_Loop:ACALLScan_Display_Value;調(diào)用顯示掃描子程序調(diào)用顯示掃描子程序 JBP3.4, Display_Loop ;P3.4是否為是否為0?鍵未按下,轉(zhuǎn)?鍵未按下,轉(zhuǎn)Display_LoopMOV A, #0 x01 ;A取加數(shù)取加數(shù)1 ADDA, 0 x7B;計(jì)數(shù)器計(jì)數(shù)器+

8、1DAA;10進(jìn)制修正指令進(jìn)制修正指令 MOV 0 x7B,A;回存低回存低2位的運(yùn)算結(jié)果到位的運(yùn)算結(jié)果到0 x7B CLRA ;清清0累加器累加器AADDC A,0 x7A;帶進(jìn)位加法加計(jì)數(shù)器高帶進(jìn)位加法加計(jì)數(shù)器高2位數(shù)據(jù)位數(shù)據(jù)DAAMOV0 x7A,A;回存高回存高2位的運(yùn)算結(jié)果到位的運(yùn)算結(jié)果到0 x7AJNBP3.4, $;檢查按鍵是否松開,檢查按鍵是否松開,P3.4=1 本地循環(huán)本地循環(huán)AJMP LD_Data;按鍵松開,轉(zhuǎn)按鍵松開,轉(zhuǎn)LD_Dataa b c d e f g hcom1 com2 com3 com4 數(shù)碼管顯示:數(shù)碼管顯示:判斷是否有按鍵按下判斷是否有按鍵按下0 x0

9、1 按鍵的“抖動(dòng)”測(cè)試程序流程圖 數(shù)碼管顯示計(jì)數(shù)數(shù)碼管顯示計(jì)數(shù)流程圖流程圖 P3.4=0?N 計(jì)數(shù)器清計(jì)數(shù)器清0計(jì)數(shù)值轉(zhuǎn)換成字符碼計(jì)數(shù)值轉(zhuǎn)換成字符碼計(jì)數(shù)器計(jì)數(shù)器+1,調(diào)整,調(diào)整10進(jìn)進(jìn)制數(shù)制數(shù)P3.4=1?N Y Y 9+EKR 110KY+E0VY:td啟動(dòng)延時(shí)啟動(dòng)延時(shí)停止延時(shí)停止延時(shí) 消除“抖動(dòng)”的方法消除消除“抖動(dòng)抖動(dòng)”的方法:硬件消抖和軟件消抖兩大類。的方法:硬件消抖和軟件消抖兩大類。常見的硬件消抖方法是:低通濾波施密特整形以及常見的硬件消抖方法是:低通濾波施密特整形以及RS觸發(fā)器,而軟件消抖觸發(fā)器,而軟件消抖方法就是插入適當(dāng)?shù)难訒r(shí)。方法就是插入適當(dāng)?shù)难訒r(shí)。復(fù)習(xí)數(shù)字電路相復(fù)習(xí)數(shù)字電路相

10、關(guān)內(nèi)容關(guān)內(nèi)容軟件消抖:軟件消抖:在按鍵按下的瞬間啟動(dòng)定時(shí)器開始延時(shí),延時(shí)在按鍵按下的瞬間啟動(dòng)定時(shí)器開始延時(shí),延時(shí)td時(shí)間后再判斷按鍵是否仍然時(shí)間后再判斷按鍵是否仍然按下,若仍按下,則本次按鍵有效;否則本次按鍵無效。按下,若仍按下,則本次按鍵有效;否則本次按鍵無效。思考題:思考題: 如何增加延時(shí)消除如何增加延時(shí)消除“抖動(dòng)抖動(dòng)”,請(qǐng)嘗試修改前面的程序。,請(qǐng)嘗試修改前面的程序。 如果認(rèn)真觀察實(shí)驗(yàn),一定會(huì)發(fā)現(xiàn)前面的程序有一個(gè)小小的不足,就是在按如果認(rèn)真觀察實(shí)驗(yàn),一定會(huì)發(fā)現(xiàn)前面的程序有一個(gè)小小的不足,就是在按鍵按下的瞬間顯示器會(huì)熄滅,請(qǐng)分析原因。鍵按下的瞬間顯示器會(huì)熄滅,請(qǐng)分析原因。 目 錄 獨(dú)立鍵盤與

11、消抖獨(dú)立鍵盤與消抖 矩陣鍵盤與掃描方法矩陣鍵盤與掃描方法 逐行逐列掃描法逐行逐列掃描法 矩陣鍵盤工作原理 4 4 矩陣鍵盤矩陣鍵盤 行行線線 列列 線線 按鍵的兩端分別按鍵的兩端分別接在行線和列線接在行線和列線上上矩陣鍵盤:用盡可能少的矩陣鍵盤:用盡可能少的I/O口去口去管理較多的按鍵。管理較多的按鍵。 最大的優(yōu)點(diǎn)是組合靈活,假如最大的優(yōu)點(diǎn)是組合靈活,假如有有16個(gè)個(gè)I/O可用作鍵盤電路,可以可用作鍵盤電路,可以將它接成將它接成610、511或或88等等許多種接法。當(dāng)然,使用效率最許多種接法。當(dāng)然,使用效率最高的是高的是88的接法,最多可以接的接法,最多可以接64個(gè)按鍵。個(gè)按鍵。 矩陣連接法要

12、區(qū)分和判斷按鍵矩陣連接法要區(qū)分和判斷按鍵動(dòng)作的方法比較復(fù)雜,所以這種動(dòng)作的方法比較復(fù)雜,所以這種接法一般只用在計(jì)算機(jī)技術(shù)中。接法一般只用在計(jì)算機(jī)技術(shù)中。 目 錄 獨(dú)立鍵盤與消抖獨(dú)立鍵盤與消抖 矩陣鍵盤與掃描方法矩陣鍵盤與掃描方法 逐行逐列掃描法逐行逐列掃描法 逐行掃描實(shí)驗(yàn)電路TinyView的的2 4 矩陣鍵盤矩陣鍵盤 行行線線 列列線線 KC1KC4并接在并接在com1com4上,與上,與P3.2P3.5相相連連與與P3.6、P3.7相連相連 I/O口復(fù)用TinyView的的2 4 矩陣鍵盤矩陣鍵盤 行行線線 列列線線 與數(shù)碼管的位選與數(shù)碼管的位選控制端復(fù)用控制端復(fù)用I/O口復(fù)用:將口復(fù)用:

13、將同一個(gè)(或組)同一個(gè)(或組)I/O口用于口用于2種不同作用的種不同作用的2個(gè)器件上。個(gè)器件上。能夠復(fù)用的原因:因?yàn)橛?jì)算機(jī)是能夠復(fù)用的原因:因?yàn)橛?jì)算機(jī)是一種一種“串行串行”執(zhí)行程序的機(jī)器,是執(zhí)行程序的機(jī)器,是一條接一條的執(zhí)行指令,而不是全一條接一條的執(zhí)行指令,而不是全部指令一起上。利用這種在時(shí)間上部指令一起上。利用這種在時(shí)間上的可區(qū)分性使其在不同的時(shí)間管理的可區(qū)分性使其在不同的時(shí)間管理不同的部件。不同的部件。這種復(fù)用是有條件的,對(duì)于需要保這種復(fù)用是有條件的,對(duì)于需要保持確定狀態(tài)的控制口(如控制一個(gè)繼持確定狀態(tài)的控制口(如控制一個(gè)繼電器開關(guān)的端口)是沒辦法復(fù)用的。電器開關(guān)的端口)是沒辦法復(fù)用的。

14、 逐行逐列掃描法逐行掃描鍵盤的方法逐行掃描鍵盤的方法選擇選擇KR1和和KR2為輸入,它們?yōu)檩斎?,它們的常態(tài)是電平的常態(tài)是電平“1”。當(dāng)沒有按鍵按。當(dāng)沒有按鍵按下時(shí),下時(shí),KR1和和KR2保持常態(tài)。當(dāng)保持常態(tài)。當(dāng)KY1按下時(shí),按下時(shí),KR1在在KC1輸出輸出“0”電平時(shí)得到電平時(shí)得到“0”信號(hào),而信號(hào),而KR2在不在不受影響仍然保持常態(tài)。受影響仍然保持常態(tài)。2 4 矩陣鍵盤矩陣鍵盤 行行線線 列列線線 單片機(jī)的輸出單片機(jī)的輸出單片機(jī)的輸入單片機(jī)的輸入利用這種必須配合利用這種必須配合KC1KC4的輸出情況才能使的輸出情況才能使KR1或或KR2得到得到“0”信號(hào)的特點(diǎn),人們發(fā)明出鍵盤信號(hào)的特點(diǎn),人們

15、發(fā)明出鍵盤的逐行掃描法。的逐行掃描法。即每次只有一根列線輸出即每次只有一根列線輸出“0”,然后逐行掃描讀入行信號(hào),通過行然后逐行掃描讀入行信號(hào),通過行信號(hào)來判斷鍵盤所有按鍵的狀態(tài)。信號(hào)來判斷鍵盤所有按鍵的狀態(tài)。1 1111101111 10 0逐列掃描鍵盤的方法:把行和列的輸入逐列掃描鍵盤的方法:把行和列的輸入輸出顛倒,其原理和操作方法與逐行掃輸出顛倒,其原理和操作方法與逐行掃描鍵盤的方法一致。描鍵盤的方法一致。逐個(gè)掃描鍵盤的方法:逐個(gè)掃描鍵盤的方法: 逐行掃描讀鍵子程序代碼Scan_Key:MOV P1, #0 xFF;關(guān)閉所有段選,阻止掃描鍵盤對(duì)顯示的關(guān)閉所有段選,阻止掃描鍵盤對(duì)顯示的影響

16、影響MOV R6, #0 x04;設(shè)定鍵盤計(jì)數(shù)器為設(shè)定鍵盤計(jì)數(shù)器為4,即循環(huán),即循環(huán)4次次 MOV R5, #0 xFB 取第一位掃描控制數(shù)據(jù)取第一位掃描控制數(shù)據(jù)Scan_KLP: MOV P3, R5;送位選數(shù)據(jù)到位選口送位選數(shù)據(jù)到位選口SETB P3.6;設(shè)置采樣口設(shè)置采樣口P3.6進(jìn)入采樣狀態(tài)進(jìn)入采樣狀態(tài)SETB P3.7;設(shè)置采樣口設(shè)置采樣口P3.7進(jìn)入采樣狀態(tài)進(jìn)入采樣狀態(tài)JNBP3.6, Scan_KBK1;檢查檢查KR1為為0否,是否,是,轉(zhuǎn)轉(zhuǎn)Scan_KBK1JNBP3.7, Scan_KBK2 ;檢查檢查KR2為為0否,是否,是,轉(zhuǎn)轉(zhuǎn)Scan_KBK2MOV A, R5;位選暫

17、存器到位選暫存器到ARLA;A循環(huán)左移使下一只位選輸出循環(huán)左移使下一只位選輸出0電平電平MOV R5, A;A返存回位選暫存器返存回位選暫存器DJNZR6, Scan_KLP;鍵盤計(jì)數(shù)器減鍵盤計(jì)數(shù)器減1,非,非0,返回,返回Scan_KLPScan_KBK1:MOVA, R6;A取位選計(jì)數(shù)器數(shù)值取位選計(jì)數(shù)器數(shù)值RETScan_KBK2:MOVA, R6;A取位選計(jì)數(shù)器數(shù)值取位選計(jì)數(shù)器數(shù)值A(chǔ)DDA, #4RETP1:數(shù)碼管段選控制端,因數(shù)碼管位選:數(shù)碼管段選控制端,因數(shù)碼管位選與鍵盤列控制線復(fù)用,故在此先關(guān)與鍵盤列控制線復(fù)用,故在此先關(guān)閉所有段選,阻止掃描鍵盤對(duì)顯示閉所有段選,阻止掃描鍵盤對(duì)顯示

18、的影響的影響。R6:鍵盤計(jì)數(shù)器,:鍵盤計(jì)數(shù)器,4:4列,單次逐行掃列,單次逐行掃描到所有按鍵循環(huán)的次數(shù)。描到所有按鍵循環(huán)的次數(shù)。R5:位選:位選/列線控制數(shù)據(jù),控制每次只有列線控制數(shù)據(jù),控制每次只有一根列線為一根列線為“0”。P1、R6、R5初始化初始化KR1、KR2行掃行掃描口置常態(tài)描口置常態(tài)“1”為為0則有鍵按下,跳轉(zhuǎn);則有鍵按下,跳轉(zhuǎn);否則繼續(xù)往下執(zhí)行程否則繼續(xù)往下執(zhí)行程序序左移,更換為左移,更換為“0”的的位選位選/列線列線KR1所在行有按鍵按下時(shí),將所在行有按鍵按下時(shí),將R6的值傳的值傳送給送給A,并退出子程序,并退出子程序KR2所在行有按鍵按下時(shí),將所在行有按鍵按下時(shí),將R6的值傳

19、的值傳送給送給A,A統(tǒng)一加統(tǒng)一加4后退出子程序后退出子程序R6-1為為0,繼續(xù)往下執(zhí),繼續(xù)往下執(zhí)行程序;不為行程序;不為0則跳轉(zhuǎn)則跳轉(zhuǎn)實(shí)現(xiàn)功能:?jiǎn)未沃鹦袙呙鑼?shí)現(xiàn)功能:?jiǎn)未沃鹦袙呙?個(gè)按鍵。當(dāng)有個(gè)按鍵。當(dāng)有鍵按下時(shí),程序立即跳出循環(huán),輸出參鍵按下時(shí),程序立即跳出循環(huán),輸出參數(shù)數(shù)A不為不為0;當(dāng)無鍵按下時(shí),;當(dāng)無鍵按下時(shí),R6被減為被減為0并退出循環(huán),輸出參數(shù)并退出循環(huán),輸出參數(shù)A=0。按鍵掃描順序:先判斷按鍵掃描順序:先判斷KY1是否按下?是否按下?如果是,如果是,R6為為4傳給傳給A并退出子程序;如并退出子程序;如果不是,接著判斷果不是,接著判斷KY5是否按下;如果是否按下;如果是,是,R6為

20、為4傳給傳給A,A加加4后退出子程序;后退出子程序;如果不是,則接著判斷如果不是,則接著判斷KY2是否按是否按下下依此類推,依此類推,KY1KY5 KY2 KY6 KY3 KY7 KY4 KY8輸出參數(shù):無鍵按下,輸出參數(shù):無鍵按下,A=0;KY1按下,按下,A=4;KY5按下,按下,A=8;KY2按下,按下,A=3;KY6按下,按下,A=7;KY3按下,按下,A=2; KY7按下,按下,A=6;KY4按下,按下,A=1; KY8按下,按下,A=5 逐行掃描讀鍵子程序流程圖給給P1、R6、R5賦初賦初值值送位選數(shù)據(jù)到位選口送位選數(shù)據(jù)到位選口P3P3.6、P3.7置初態(tài)置初態(tài)1P3.6=0?P3

21、.7=0?位選數(shù)據(jù)左移位選數(shù)據(jù)左移1位位R6-1=0?將將R6的值傳給的值傳給A退出子程序退出子程序?qū)6的值傳給的值傳給A(A)(A)+4退出子程序退出子程序Y N N Y Y N 流程圖流程圖 逐行掃描讀鍵程序范例程序流程:程序流程: 首先對(duì)四位計(jì)數(shù)器賦初值首先對(duì)四位計(jì)數(shù)器賦初值0,并進(jìn)行顯示循環(huán),在循環(huán)中運(yùn)行鍵盤程序隨時(shí)檢查,并進(jìn)行顯示循環(huán),在循環(huán)中運(yùn)行鍵盤程序隨時(shí)檢查按鍵狀態(tài)。按鍵狀態(tài)。 當(dāng)無鍵按下時(shí),程序保持循環(huán)狀態(tài)。當(dāng)無鍵按下時(shí),程序保持循環(huán)狀態(tài)。 當(dāng)有鍵按下時(shí),先判斷是否是當(dāng)有鍵按下時(shí),先判斷是否是KY1按下?如果是,則計(jì)數(shù)器加按下?如果是,則計(jì)數(shù)器加1。如果不是,則。如果不是

22、,則轉(zhuǎn)而檢查是否是轉(zhuǎn)而檢查是否是KY8按下?如果是,計(jì)數(shù)器減按下?如果是,計(jì)數(shù)器減1。如果不是,則程序不做任何操。如果不是,則程序不做任何操作返回重來。作返回重來。ORG0000HStart:MOV0 x7A,#0 x00;清清0計(jì)數(shù)器高計(jì)數(shù)器高2位寄存器位寄存器0 x7AMOV0 x7B,#0 x00;清清0計(jì)數(shù)器低計(jì)數(shù)器低2位寄存器位寄存器0 x7BLD_Data: ACALL L_DisplayBuf;將將0 x7A、0 x7B數(shù)數(shù)字字符調(diào)入顯示緩沖區(qū)字字符調(diào)入顯示緩沖區(qū)Display_Loop:ACALL Scan_Display_Value;調(diào)用顯示掃描調(diào)用顯示掃描子子程序程序 AC

23、ALL Scan_Key ;調(diào)用鍵盤掃描調(diào)用鍵盤掃描子子程序程序JZDisplay_Loop ;無鍵按下,轉(zhuǎn)無鍵按下,轉(zhuǎn)Display_Loop重復(fù)顯示重復(fù)顯示4位計(jì)數(shù)器清位計(jì)數(shù)器清04位計(jì)數(shù)值轉(zhuǎn)成數(shù)字位計(jì)數(shù)值轉(zhuǎn)成數(shù)字字符并載入顯示緩字符并載入顯示緩沖區(qū)沖區(qū)數(shù)碼管顯示數(shù)碼管顯示4位計(jì)數(shù)位計(jì)數(shù)值值單次逐行掃描按鍵,無鍵單次逐行掃描按鍵,無鍵按下,按下,A為為0;有鍵按下,;有鍵按下,A不為不為0A為為0,跳轉(zhuǎn);,跳轉(zhuǎn);A不為不為0,繼續(xù)往下執(zhí)行程,繼續(xù)往下執(zhí)行程序序 逐行掃描讀鍵程序范例程序流程:程序流程: 首先對(duì)四位計(jì)數(shù)器賦初值首先對(duì)四位計(jì)數(shù)器賦初值0,并進(jìn)行顯示循環(huán),在循環(huán)中運(yùn)行鍵盤程序隨時(shí)

24、檢查,并進(jìn)行顯示循環(huán),在循環(huán)中運(yùn)行鍵盤程序隨時(shí)檢查按鍵狀態(tài)。按鍵狀態(tài)。 當(dāng)無鍵按下時(shí),程序保持循環(huán)狀態(tài)。當(dāng)無鍵按下時(shí),程序保持循環(huán)狀態(tài)。 當(dāng)有鍵按下時(shí),先判斷是否是當(dāng)有鍵按下時(shí),先判斷是否是KY1按下?如果是,則計(jì)數(shù)器加按下?如果是,則計(jì)數(shù)器加1。如果不是,則。如果不是,則轉(zhuǎn)而檢查是否是轉(zhuǎn)而檢查是否是KY8按下?如果是,計(jì)數(shù)器減按下?如果是,計(jì)數(shù)器減1。如果不是,則程序不做任何操。如果不是,則程序不做任何操作返回重來。作返回重來。CJNEA, #0 x04, Next_Key ;是是KY1鍵按下鍵按下嗎?不是嗎?不是,則則轉(zhuǎn)轉(zhuǎn)Next_Key; 加加1計(jì)數(shù)程序計(jì)數(shù)程序 MOV A, 0 x7B

25、 ;取計(jì)數(shù)器取計(jì)數(shù)器的的低低2位數(shù)值位數(shù)值 ADDA, #0 x01 ;數(shù)值加數(shù)值加1DAA ;調(diào)整調(diào)整10進(jìn)制進(jìn)制數(shù)數(shù) MOV 0 x7B, A;將低將低2位運(yùn)算結(jié)果回存到位運(yùn)算結(jié)果回存到0 x7B MOV A, 0 x7A ;取計(jì)數(shù)器取計(jì)數(shù)器的的高高2位數(shù)值位數(shù)值A(chǔ)DDC A,#0 x00;帶進(jìn)位加法加帶進(jìn)位加法加0,如有進(jìn)位高,如有進(jìn)位高2位加位加1DAA;調(diào)整調(diào)整10進(jìn)制進(jìn)制數(shù)數(shù)MOV0 x7A, A;將高將高2位的運(yùn)算結(jié)果回存位的運(yùn)算結(jié)果回存0 x7AAJMP Key_Back;轉(zhuǎn)轉(zhuǎn)Key_Back鍵返回處理程序鍵返回處理程序A為為0 x04,KY1按下,繼續(xù)按下,繼續(xù)往下執(zhí)行程序;

26、不為往下執(zhí)行程序;不為0 x04,跳轉(zhuǎn)跳轉(zhuǎn)4位位計(jì)計(jì)數(shù)數(shù)器器加加1 逐行掃描讀鍵程序范例程序流程:程序流程: 首先對(duì)四位計(jì)數(shù)器賦初值首先對(duì)四位計(jì)數(shù)器賦初值0,并進(jìn)行顯示循環(huán),在循環(huán)中運(yùn)行鍵盤程序隨時(shí)檢查,并進(jìn)行顯示循環(huán),在循環(huán)中運(yùn)行鍵盤程序隨時(shí)檢查按鍵狀態(tài)。按鍵狀態(tài)。 當(dāng)無鍵按下時(shí),程序保持循環(huán)狀態(tài)。當(dāng)無鍵按下時(shí),程序保持循環(huán)狀態(tài)。 當(dāng)有鍵按下時(shí),先判斷是否是當(dāng)有鍵按下時(shí),先判斷是否是KY1按下?如果是,則計(jì)數(shù)器加按下?如果是,則計(jì)數(shù)器加1。如果不是,則。如果不是,則轉(zhuǎn)而檢查是否是轉(zhuǎn)而檢查是否是KY8按下?如果是,計(jì)數(shù)器減按下?如果是,計(jì)數(shù)器減1。如果不是,則程序不做任何操。如果不是,則程序不

27、做任何操作返回重來。作返回重來。Next_Key : CJNEA,#0 x05,Display_Loop ;是是KY8鍵按下嗎?否,返回鍵按下嗎?否,返回Display_Loop; 減減1計(jì)數(shù)程序計(jì)數(shù)程序 MOV A, 0 x7B;取計(jì)數(shù)器低取計(jì)數(shù)器低2位數(shù)值位數(shù)值 ADDA, #0 x99 ;加加99,相當(dāng)于減,相當(dāng)于減1操作操作DAA ;進(jìn)行進(jìn)行10進(jìn)制修正進(jìn)制修正 MOV 0 x7B, A;將低將低2位運(yùn)算結(jié)果回存到位運(yùn)算結(jié)果回存到0 x7BJC Key_Back;是否有溢出,是,則不借位是否有溢出,是,則不借位MOV A, 0 x7A;取計(jì)數(shù)器高取計(jì)數(shù)器高2位數(shù)值位數(shù)值A(chǔ)DD A, #

28、0 x99 ;加加99,相當(dāng)于減,相當(dāng)于減1操作操作DA A;10進(jìn)制修正指令進(jìn)制修正指令MOV0 x7A, A;將高將高2位的運(yùn)算結(jié)果回存位的運(yùn)算結(jié)果回存0 x7AA為為0 x05,KY8按下,繼續(xù)按下,繼續(xù)往下執(zhí)行程序;不為往下執(zhí)行程序;不為0 x05,跳轉(zhuǎn)跳轉(zhuǎn)4位位計(jì)計(jì)數(shù)數(shù)器器減減1 減減1操作:操作: 因?yàn)橐驗(yàn)椤癉A A”指令只對(duì)加法指令起指令只對(duì)加法指令起作用,所以程序以加作用,所以程序以加99來處理減來處理減1。 對(duì)于對(duì)于8位寄存器,值不為位寄存器,值不為0時(shí),加時(shí),加99后后會(huì)產(chǎn)生進(jìn)位,會(huì)產(chǎn)生進(jìn)位,8位寄存器被減位寄存器被減1,如,如6+99=105,8位寄存器中的值為位寄存器中

29、的值為5,實(shí),實(shí)現(xiàn)減現(xiàn)減1。 值為值為0時(shí),加時(shí),加99后后8位寄存器中的值變位寄存器中的值變成成99,不產(chǎn)生進(jìn)位,需要向高位借位。,不產(chǎn)生進(jìn)位,需要向高位借位。 逐行掃描讀鍵程序范例程序流程:程序流程: 首先對(duì)四位計(jì)數(shù)器賦初值首先對(duì)四位計(jì)數(shù)器賦初值0,并進(jìn)行顯示循環(huán),在循環(huán)中運(yùn)行鍵盤程序隨時(shí)檢查,并進(jìn)行顯示循環(huán),在循環(huán)中運(yùn)行鍵盤程序隨時(shí)檢查按鍵狀態(tài)。按鍵狀態(tài)。 當(dāng)無鍵按下時(shí),程序保持循環(huán)狀態(tài)。當(dāng)無鍵按下時(shí),程序保持循環(huán)狀態(tài)。 當(dāng)有鍵按下時(shí),先判斷是否是當(dāng)有鍵按下時(shí),先判斷是否是KY1按下?如果是,則計(jì)數(shù)器加按下?如果是,則計(jì)數(shù)器加1。如果不是,則。如果不是,則轉(zhuǎn)而檢查是否是轉(zhuǎn)而檢查是否是KY

30、8按下?如果是,計(jì)數(shù)器減按下?如果是,計(jì)數(shù)器減1。如果不是,則程序不做任何操。如果不是,則程序不做任何操作返回重來。作返回重來。Key_Back: ACALL L_DisplayBuf ;將將0 x7A、0 x7B數(shù)字字符調(diào)入顯示緩沖區(qū)數(shù)字字符調(diào)入顯示緩沖區(qū)ACALL Scan_Display_Value;調(diào)用顯示掃描程序調(diào)用顯示掃描程序ACALL Scan_Key ;調(diào)用鍵盤掃描程序調(diào)用鍵盤掃描程序JNZ Key_Back;按鍵是否松開按鍵是否松開?否,則?否,則轉(zhuǎn)轉(zhuǎn)Key_Back繼續(xù)繼續(xù)檢查檢查SJMP Display_Loop ;有,返有,返Display_Loop 在檢測(cè)按鍵是否松開

31、的循環(huán)中增在檢測(cè)按鍵是否松開的循環(huán)中增加顯示掃描,即避免了顯示器的加顯示掃描,即避免了顯示器的熄滅,又增加了防按鍵熄滅,又增加了防按鍵“抖動(dòng)抖動(dòng)”的延時(shí)的延時(shí) “線反轉(zhuǎn)法”按鍵檢測(cè)技術(shù) 問題提出:當(dāng)這個(gè)矩陣擴(kuò)大到一定數(shù)目時(shí),逐行掃描的方法會(huì)很費(fèi)時(shí),如果需要對(duì)問題提出:當(dāng)這個(gè)矩陣擴(kuò)大到一定數(shù)目時(shí),逐行掃描的方法會(huì)很費(fèi)時(shí),如果需要對(duì)2個(gè)以上的按鍵個(gè)以上的按鍵“同時(shí)同時(shí)”操作時(shí),則處理起來更麻煩。操作時(shí),則處理起來更麻煩。解決方法:按鍵的處理程序并非只有逐行掃描法這一種,如:解決方法:按鍵的處理程序并非只有逐行掃描法這一種,如:“線反轉(zhuǎn)法線反轉(zhuǎn)法”按鍵檢按鍵檢測(cè)技術(shù),也是矩陣鍵盤應(yīng)用中的一種經(jīng)典程序

32、處理方法。測(cè)技術(shù),也是矩陣鍵盤應(yīng)用中的一種經(jīng)典程序處理方法。TinyView的的2 4 矩陣鍵盤矩陣鍵盤 線反轉(zhuǎn)法:將矩陣電路行、列的線反轉(zhuǎn)法:將矩陣電路行、列的I/O屬性進(jìn)行調(diào)換處理。矩陣電路的行、列線必須屬性進(jìn)行調(diào)換處理。矩陣電路的行、列線必須一組輸出、一組輸入,而線反轉(zhuǎn)的操作方法是多進(jìn)行一次這種操作。一組輸出、一組輸入,而線反轉(zhuǎn)的操作方法是多進(jìn)行一次這種操作。具體實(shí)現(xiàn):假設(shè)有具體實(shí)現(xiàn):假設(shè)有KY1、KY3、KY8這這3個(gè)按鍵同時(shí)按下。個(gè)按鍵同時(shí)按下。TinyView的的2 4 矩陣鍵盤矩陣鍵盤 第一步:第一步:輸入輸入 輸出輸出 輸出輸出 輸入輸入 11111 11 1000000第二步

33、:線反轉(zhuǎn)第二步:線反轉(zhuǎn) 1 11 1111100101由由KR1和和KR2可推斷出:兩行都有按鍵按下??赏茢喑觯簝尚卸加邪存I按下。 結(jié)合第一步的推斷,可知結(jié)合第一步的推斷,可知KY1和和KY3按下;按下; 結(jié)合第一步的推斷,可知結(jié)合第一步的推斷,可知KY8按下。按下。01110線反轉(zhuǎn)法不但采樣速度快,而且鍵盤信息全面,但它對(duì)硬件有一定的要求:行線反轉(zhuǎn)法不但采樣速度快,而且鍵盤信息全面,但它對(duì)硬件有一定的要求:行線和列線都必須是可反轉(zhuǎn)的,既可配置為輸出,又可配置成輸入。此外,行線和列線和列線都必須是可反轉(zhuǎn)的,既可配置為輸出,又可配置成輸入。此外,行線和列線的分組最好在線的分組最好在2個(gè)不同的操作

34、口上,比如,個(gè)不同的操作口上,比如,80C51的的P1和和P3。“線反轉(zhuǎn)法”按鍵檢測(cè)應(yīng)用AT89C52AT89C52P1.0 P1.0 P1.1 P1.1 P1.2 P1.2 P1.3P1.3 P1.4 P1.4 P1.5 P1.5 P1.6 P1.6 P1.7P1.7+5v0行行1行行2行行3行行0列列1列列2列列3列列 由行線輸出全由行線輸出全“0”0”,讀入列線,讀入列線,判有無鍵按下。判有無鍵按下。 若有鍵按下若有鍵按下, ,再將讀入的列再將讀入的列 線值由列線輸出線值由列線輸出, ,讀進(jìn)行線的值。讀進(jìn)行線的值。 第一步讀進(jìn)的列線值與第二步讀第一步讀進(jìn)的列線值與第二步讀進(jìn)的行線值相加,從而得到代表此進(jìn)的行線值相加,從而得到代表此鍵的唯一的特征值。鍵的唯一的特征值。AT89C52AT89C52P1.0 P1.0 P1.1 P1.1 P1.2 P1.2 P1.3P1.3 P1.4 P1.4 P1.5 P1.5 P1.6 P1.6 P1.7P1.7+5vMOV P1MOV P1,#0F0H ;#0F0H ;低位送全低位送全“0”0” MOV A

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論