單片機(jī)鍵盤中斷模塊編程實(shí)例_第1頁
單片機(jī)鍵盤中斷模塊編程實(shí)例_第2頁
單片機(jī)鍵盤中斷模塊編程實(shí)例_第3頁
單片機(jī)鍵盤中斷模塊編程實(shí)例_第4頁
單片機(jī)鍵盤中斷模塊編程實(shí)例_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、9.2 匯編語言鍵盤中斷模塊編程實(shí)例(2)鍵盤編程匯編語言子程序下面給出有關(guān)鍵盤編程的匯編語言子程序。它們是:鍵盤中斷初始化子程序、掃描法讀取鍵值子程序、鍵值轉(zhuǎn)為定義值子程序。即使不使用中斷方式識(shí)別按鍵,三個(gè)子程序仍然需要使用。只不過鍵盤初始化子程序中改為不允許中斷進(jìn)入。掃描法讀取鍵值與鍵值轉(zhuǎn)為定義值兩個(gè)子程序在鍵盤編程中通常需要使用的。KBsub.ASM*-*文件描述:包含3個(gè)鍵盤子程序,分別為: * * (1)鍵盤初始化子程序(KB_Init) * (2)掃描讀取鍵值子程序(KB_Scan) * (3)鍵值轉(zhuǎn)為定義值子程序(KB_Def) *-*=以下為子程序源代碼=*KB_P EQU P

2、TA ;鍵盤接在PTA口上KB_D EQU DDRA ;相應(yīng)的方向寄存器KB_PUE EQU PTAPUE ;相應(yīng)的上拉電阻允許寄存器*KB_Init:鍵盤初始化子程序-*功能:初始化鍵盤中斷的引腳,但未開放鍵盤中斷 *入口:無 *出口:無 *堆棧深度:2 *-* KB_Init: PSHA ;保護(hù)A LDA #$00 ;復(fù)位相應(yīng)寄存器 STA KB_P LDA #%00001111 ;定義7-4為輸入,3-0為輸出 STA KB_D LDA #%11110000 ;定義輸入引腳有內(nèi)部上拉電阻 STA KB_PUE BSET 1,INTKBSCR ;屏蔽鍵盤中斷(IMASK=1) LDA #%

3、11110000 ;允許輸入引腳的中斷可進(jìn)入 STA INTKBIER BSET 2,INTKBSCR ;清除鍵盤中斷請求(ACKK=1) PULA ;恢復(fù)A RTS*KB_Scan:掃描讀取鍵值子程序-*功能:掃描4*4鍵盤,讀取鍵值->A,無按鍵,為$FF *入口:無 *出口:A=鍵值 *堆棧深度:2+2=4 *-* KB_Scan: AIS #-!2 ;開辟臨時(shí)變量 LDA #%11111110 ;使第一根行線為0(低電平) STA !1,SP LDA #$04 ;將掃描4根行線 STA !2,SPKB_Scan1: LDA KB_P ;取KB_P->A ORA #%0000

4、1111 ;KB_P.7-4保留,KB_P.3-0為1 AND $1,SP ;令KB_P.n=0,n=0、1、2、3 STA KB_P NOP NOP LDA KB_P ;看第n行是否有鍵按下 AND #%11110000 ;KB_P.7-4保留,令低4位=0 CBEQA #$F0,KB_Scan2 ;本行無鍵按下,轉(zhuǎn)KB_Scan2 LDA KB_P ;本行有鍵按下 BRA KB_Scan_ExitKB_Scan2: SEC ;C=1 ROL $1,SP ;使下一個(gè)行線為0 DBNZ !2,SP,KB_Scan1 ;對行線循環(huán) LDA #$FF ;沒有鍵被按下返回$FFKB_Scan_Exi

5、t: AIS #!2 ;釋放臨時(shí)變量 RTS*KB_Def:鍵值轉(zhuǎn)為定義值子程序-*功能:鍵值轉(zhuǎn)為鍵盤定義值 *入口:A=鍵值 *出口:A=鍵定義值 *堆棧深度:2+3=5 *-*KB_Def: PSHH ;保護(hù)HX PSHX AIS #-!1 ;開辟臨時(shí)變量 STA !1,SP ;把鍵值存入(!1,SP) LDHX #KB_Table ;取鍵盤定義表首地址KB_Def1: LDA ,X CMP #$00 ;與0(定義表結(jié)束標(biāo)志)相比較 BEQ KB_Def3 ;=0,表示即表中無次定義值 CMP $1,SP ;與鍵值相比較 BNE KB_Def2 ;不等,未找到轉(zhuǎn)KB_Def2 AIX #!

6、1 ;找到 LDA ,X ;取鍵定義值-A BRA KB_DefR KB_Def2: AIX #!2 ;指向下一個(gè)鍵值 BRA KB_Def1 ;繼續(xù)判斷KB_Def3: LDA #$FF ;無此定義,用FF標(biāo)志KB_DefR: AIS #!1 ;釋放臨時(shí)變量 PULX ;恢復(fù)HX PULH RTS;鍵盤定義表KB_Table FCB $EE,"1",$DE,"2",$BE,"3",$7E,"A" FCB $ED,"4",$DD,"5",$BD,"6",$

7、7D,"B" FCB $EB,"7",$DB,"8",$BB,"9",$7B,"C" FCB $E7,"*",$D7,"0",$B7,"#",$77,"D" FCB $009.2.2 鍵盤中斷編程舉例下面給出的實(shí)例程序的功能是,當(dāng)按下鍵盤上任何一個(gè)鍵,產(chǎn)生鍵盤中斷,在鍵盤中斷程序中,通過串行口發(fā)送“鍵值”及“鍵定義值”。PC機(jī)方程序,接收它們,并顯示。(1)鍵盤中斷編程匯編主程序?qū)嵗幪?hào):A03 路徑:ASM A03

8、_鍵盤實(shí)驗(yàn) (Keyboard.asm)*-鍵盤實(shí)驗(yàn)-*文 件 名:Keyboard.asm *硬件連接:PTA.7-4接鍵盤4根列線,PTA.3-0接鍵盤4根行線 *程序描述:按下鍵盤按鍵,串口發(fā)送對應(yīng)的鍵值 *目 的:鍵盤掃描,鍵盤中斷,鍵值識(shí)別,鍵盤編碼 *注 意:如果鍵盤插在實(shí)驗(yàn)板的上排插孔,無須連線,若插在下排 * 插孔,需手工接線 *-嵌入式應(yīng)用技術(shù)基礎(chǔ)教程教學(xué)實(shí)例-*頭文件$include "GP32ASM.H"*兩個(gè)起始地址RAMstartAddr equ $0040 ;RAM的起始地址FlashStartAddr equ $8000 ;程序開始地址*=*主

9、程序 org FlashStartAddr ;程序起始地址MainInit: ;復(fù)位后程序從此開始執(zhí)行 ;系統(tǒng)初始化 SEI ;關(guān)中斷 LDHX #$023F TXS JSR GP32Init ;調(diào)系統(tǒng)初始化子程序GP32Init JSR SCIInit ;調(diào)串行口初始化子程序SCIInit JSR KB_Init ;調(diào)鍵盤初始化子程序 BCLR 1,INTKBSCR ;開放鍵盤中斷(IMASK=0) CLI ;開中斷 ;程序總循環(huán)入口,無中斷時(shí)空操作MainLoop: NOP NOP BRA MainLoop *=以下為子程序存放處=*KB_Int:鍵盤中斷處理程序-*功能:鍵盤中斷程序,把

10、鍵定義值從串口發(fā)送出去 *調(diào)用子程序:(1)掃描法讀取鍵值子程序(KB_Scan) * (2)鍵值轉(zhuǎn)為定義值子程序(KB_Def) *-*KB_Int: SEI ;關(guān)總中斷 PSHH ;保護(hù)H BSET 1,INTKBSCR ;禁止鍵盤中斷 JSR KB_Scan ;掃描鍵盤,讀取鍵值->A JSR SCISend1 ;發(fā)送鍵值 JSR KB_Def ;轉(zhuǎn)成鍵定義值->A JSR SCISend1 ;發(fā)送鍵定義值 JSR KB_Init BCLR 1,INTKBSCR ;開放鍵盤中斷(IMASKK=0) PULH ;恢復(fù)H CLI ;開總中斷 RTI*外部子程序存放處$includ

11、e "GP32init.asm"$include "SCIInit.asm"$include "H08SCI.asm"$include "KBsub.asm"*中斷向量 ORG $FFE0 ;鍵盤中斷矢量 DW KB_Int ORG $FFFE ;復(fù)位矢量 DW MainInit(2)鍵盤中斷編程的PC機(jī)方的VB界面與程序圖9-4 鍵盤中斷編程的PC機(jī)方的VB界面圖9-4為針對上述MCU程序的PC機(jī)方的VB界面。通過它可以清楚地知道定義值與鍵值的對應(yīng)關(guān)系,若顯示不對,可以修改鍵值轉(zhuǎn)為定義值子程序中的鍵值表。實(shí)例編號(hào)

12、:A03 路徑:ASMA03_鍵盤實(shí)驗(yàn)VB_KB'程序描述:把接收到的數(shù)據(jù)顯示在接收窗口中'-Option Explicit '檢查未經(jīng)聲明的變量Dim RecvData() As Byte '接收數(shù)據(jù)數(shù)組Private Sub Form_Load() '清空有關(guān)文本框 Txthex.Text = "" Txtchr.Text = "" '串行口初始化 Call SCIinit(MSComm1, 1, "9600,N,8,1") '開放串行中斷 MSComm1.RThreshol

13、d = 1End SubPublic Sub MSComm1_OnComm() '串行接收中斷 Dim i As Integer Dim S1 As String, S2 As String MSComm1.RThreshold = 0 '關(guān)閉串行中斷 RecvData = MSComm1.Input S1 = Hex(RecvData(0) S2 = Chr(RecvData(1) Txthex.Text = S2 Txtchr.Text = S1 MSComm1.RThreshold = 1 '開放串行中斷End SubPrivate Sub CmdCLR_Clic

14、k() '單擊"清空"按鈕 Txthex.Text = "" Txtchr.Text = ""End SubPrivate Sub CmdEXIT_Click() '單擊"退出"按鈕 If MSComm1.PortOpen = True Then MSComm1.PortOpen = False EndEnd SubPrivate Sub CmdEXIT_Click() '單擊"退出"按鈕 If MSComm1.PortOpen = True Then MSComm1.P

15、ortOpen = False EndEnd Sub9.3 08C語言鍵盤中斷模塊編程實(shí)例本節(jié)給出與匯編程序相對應(yīng)的08C語言程序。PC機(jī)部分的VB程序相同。9.3.1 按鍵識(shí)別與鍵盤定義函數(shù)H08KB.C/*-*文件描述:本文件包含了H08C鍵盤中斷子函數(shù),分別為: * *(1)KB_Init:鍵盤初始化函數(shù) * void KB_Init(void) *(2)KB_Scan:掃描讀取鍵值函數(shù) * unsigned char KB_Scan(void) *(3)KB_Def:鍵值轉(zhuǎn)為定義值函數(shù) * unsigned char KB_Def(unsigned char KB_valve) *-*

16、/*以下為子程序源代碼*/*頭文件*/#include "GP32C.H"#include "KB.h"/*KB_Init:鍵盤初始化函數(shù)-*功 能:初始化鍵盤中斷的引腳,但未開放鍵盤中斷 *參 數(shù):無 *返 回:無 *-*/ void KB_Init(void) KB_P=0x00; /復(fù)位KB_P KB_D=0b00001111; /定定義7-4為輸入,3-0為輸出 KB_PUE=0b11110000; /定義輸入引腳有內(nèi)部上拉電阻 INTKBSCR|= (1<<IntBit);/屏蔽鍵盤中斷(IMASKk=1) INTKBIER=0b1

17、1110000; /允許輸入引腳的中斷可進(jìn)入 INTKBSCR|= (1<<ACKKBit); /清鍵盤中斷請求(ACKK=1)/*KB_Scan:掃描讀取鍵值函數(shù)-*功 能:掃描一次4*4鍵盤上的按鍵,讀取鍵值->*p ,若無按鍵, * *p為0xff *參 數(shù):無 *返 回:掃描到的鍵值 *-*/ unsigned char KB_Scan(void) unsigned char line,i,tmp; line=0b11111110; /使第一根行線為0(低電平) for(i=1;i<=4;i+) /將掃描4根行線 tmp=KB_P; /取KB_P->tmp

18、 tmp|=0b00001111; /KB_P.7-4保留,KB_P.3-0為1 KB_P=tmp&line; /令KB_P.n=0,n=0、1、2、3 asm("NOP"); /等待,消除按鍵抖動(dòng) asm("NOP"); tmp=KB_P; tmp&=0b11110000; /看第n行是否有鍵按下 if(tmp!=0xf0) /本行有鍵按下 tmp=KB_P; break; else /本行無鍵按下,掃描下一行 line=(line<<1)|0x01; if(i=5) tmp=0xff; return(tmp); /*KB_

19、Def:鍵值轉(zhuǎn)為定義值函數(shù)-*功 能:鍵值轉(zhuǎn)為定義值 *參 數(shù):鍵值 *返 回:鍵定義值 *-*/鍵盤定義表const unsigned char KB_Table= 0xEE,'1',0xDE,'2',0xBE,'3',0x7E,'A', 0xED,'4',0xDD,'5',0xBD,'6',0x7D,'B', 0xEB,'7',0xDB,'8',0xBB,'9',0x7B,'C', 0xE7,'

20、;*',0xD7,'0',0xB7,'#',0x77,'D', 0x00;unsigned char KB_Def(unsigned char KB_valve) unsigned char KeyPress; unsigned char i; unsigned char j; i=0; while(1) j=KB_Tablei; /與0(定義表結(jié)束標(biāo)志)相比較 if (j=0) /=0,即表中無次定義值 KeyPress=0xff; break; /返回0xff else /與鍵值相比較 if (j=KB_valve) /找到 KeyP

21、ress=KB_Tablei+1;break; /取鍵定義值 else i+=2; /指向下一個(gè)鍵值,繼續(xù)判斷 ; return KeyPress; 9.3.2 鍵盤中斷編程08C語言舉例(1)鍵盤中斷編程實(shí)例的08C主函數(shù)實(shí)例編號(hào):C03 路徑:C C03_C03_鍵盤實(shí)驗(yàn) /*-鍵盤實(shí)驗(yàn)-*工 程 名:Keyboard.prj *硬件連接:PTA.7-4接鍵盤4根列線,PTA.3-0接鍵盤4根行線 *程序描述:按下鍵盤按鍵,串口發(fā)送對應(yīng)的鍵值 *目 的:鍵盤掃描,鍵盤中斷,鍵值識(shí)別,鍵盤編碼 *注 意:如果鍵盤插在實(shí)驗(yàn)板上排插孔,無須連線,若插在下 * 排插孔,需手工接線 *-嵌入式應(yīng)用技

22、術(shù)基礎(chǔ)教程教學(xué)實(shí)例-*/*頭文件*/#include "GP32C.H"#include "KB.h" /鍵盤中斷頭文件/*主程序*/void main() asm("SEI"); /關(guān)總中斷 KB_Init(); INTKBSCR&= (1<<IntBit); /打開鍵盤中斷(IMASKk=1) asm("CLI"); /開總中斷 /無中斷時(shí)空操作 while(1); (2)鍵盤中斷編程實(shí)例的08C中斷矢量表文件vectors08.c/*-*文件名:vectors08.c *功 能:用于定義中斷矢量表 *-*/ /*頭文件*/#include "GP32C.H" #include "KB.h" #include "SCI.h" /*鍵盤中斷處理函數(shù)-*/#pragma interrupt_handler isrKBIvoid isrKBI(void) unsigned char KB_valve; asm("SEI"); /關(guān)總中斷 INTKBSCR|= (1<<IntBit); /屏蔽鍵盤中斷(IMA

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論