微機實驗:顯示和鍵盤
實驗目的
2、掌握顯示和鍵盤子程序的程序設計和調試方法。
(一)動態(tài)顯示
圖4-1 LED動態(tài)顯示接口
圖4-1示實驗板中顯示部分線路。6位共陰極LED動態(tài)顯示;8155 PB口提供字形碼,決定了顯示的字形;PA口提供位選碼(掃描字),決定了哪一位發(fā)亮。動態(tài)顯示就是一位一位地輪流點亮LED,當某位LED點亮時輸入相應于該位的被顯示字形。雖然實際上是各位輪顯示,但速度很快,所以感覺上是6位LED同時顯示。
在設計顯示程序時,通常在片內RAM開辟一組顯示緩沖區(qū),專用于存放待顯示的數據。本實驗中,顯示緩沖區(qū)選用2A~2FH六個單元,依次存放數據的高位到低位。
顯示子程序的程序框圖如圖4-2示,程序如下:
? |
ORG ?0300H |
||
??? DISP: |
MOV ?R0, #2AH |
;R0指向顯示緩沖首址 | |
MOV ?R1, #0FEH |
;R1指向位選初值,點亮最高位 | ||
MOV ?DPTR, #0B001A |
;DPTR指向PA口 | ||
???? DLP: |
INC ?DPTR |
;指向PB口 | |
MOV ?A, @R0 |
;取顯示數據 | ||
ADD? A, #10H |
;加偏移量 | ||
MOVC ?A, @A+PC |
;取字型碼 | ||
MOVX ?@DPTR, A |
;B口輸出字型 | ||
MOV ?DPTR, #0B001A |
;指向PA口 | ||
MOV ?A, R1 |
|||
MOVX? @DPTR, A |
;A口輸出字位 | ||
ACALL ?DIMS |
;延時 | ||
?? |
RL ?A |
;字位左移一位 | |
MOV ?R1, A |
|||
INC ?R0 |
;指向下一位顯示緩沖 | ||
CJNE ?R0, #30H, DLP |
;6位是否結束? | ||
RET |
|||
???? DB: |
3FH,06H,5BH,4FH |
字形碼0,1,2,3 | |
66H,6DH,7DH,07H |
4,5,6,7,8 | ||
7FH,6FH,77H,7CH |
8,9,A,B, | ||
39H,5EH,79H,71H |
C,D,E,F | ||
73H,40H,58H,00H |
P,-,L,“滅” | ||
BFH,86H,DBH,CFH |
|||
E6H,EDH,FDH,87H |
|||
FFH,EFH,77H??? |
|||
ORG? 0350H |
|||
??? DIMS: |
MOV? R7,#02H |
;延時2ms | |
??? ??DL: |
MOV? R6,#0FFH |
||
?? ??DL1: |
DJNZ? R6,DL1 |
||
DJNZ? R7,DL |
|||
RET |
子程序調試:
1、仿真器的仿真頭插入實驗板CPU(注意方向不能插錯)。仿真器和實驗板接5V電流(電流極性絕對不能接反)。
2、輸入程序。
3、利用仿真器在顯示緩沖2A~2FH內設置某一個顯示內容(例如,01H、02H、03H、10H、11H、14H)。
4、設置8155命令字,口地址0B000H,命令字03H,A、B、口輸出,C口輸入。
5、單步執(zhí)行顯示子程序,可清楚地看到顯示的執(zhí)行過程。
6、在RET指令處設置斷點后,繼續(xù)執(zhí)行子程序。
(二)鍵盤接口
圖 4-3 行列式鍵盤
圖4-3示實驗板中鍵盤接口電路。采用行列式結構,共2行6列,對應于12個鍵盤,每個分配一個鍵號,依次為0~B。由圖顯見,任一個鍵的鍵號=該行的首鍵號+列號。
例如;鍵號A=行首鍵號6+列號4。所以,只要確定被按下鍵的行、列位置,就能確定該鍵的鍵號。
鍵盤掃描程序的框圖如圖4-4示。它具有以下功能:
1、判別有無鍵按下:從PA口輸出掃描字00H,讀PC口。若無鍵按下,則PCO、PC1均為1;若有鍵按下,則PC0或PC1為1。
2、消除鍵抖動;在某鍵按下后延時5~10ms,再判別鍵狀態(tài)。如果鍵已放開,認為屬于抖動,是誤動作;如果鍵仍閉合,則表示有一個穩(wěn)定的鍵輸入。
3、判別鍵號:由PA0~PA5對列線發(fā)出掃描字,先后次序是FEH、FDH、FBH、F7H、EFH、DFH(0位右移)。每次列掃描時,檢查行線輸入,先查PC0,再查PC1。若行線輸入0,表示該行上有鍵按下。根據此時的行、列號,就能計算出按下鍵的鍵號。
1、 按鍵一次,僅響應一次。為此,必須等待到鍵釋放以后,再取鍵號,存于A中。
參考程序:
? |
ORG ?03A0H |
||
?KEY: |
LCALL ?KS1 |
;判斷有無鍵閉合 | |
JNZ ?KEYA |
|||
SJMP ?KND |
;無鍵閉合,則退出 | ||
KEYA: |
LCALL ?T12MS |
;延時12ms | |
LCALL ?KS1 |
|||
JNZ ?LK1 |
;鍵仍閉合,轉 | ||
SJMP ?KND |
;鍵已放開,是抖動 | ||
LK1: |
MOV ?R4, #00H |
;列號寄存器R4置0 | |
MOV ?R2, #FEH |
;0列掃描字 | ||
LK2: |
MOV ?DPTR, #0B001H |
;指向PA口 | |
MOV? A, R2 |
|||
MOVX ?@DPTR, A |
;PA口輸出掃描字 | ||
INC ?DPTR |
|||
INC ?DPTR |
;指向PC口 | ||
MOVX ?A, @DPTR |
;讀PC | ||
JB ?ACC.0, LONE |
;PC0=1,0行無鍵按下,轉判下一行 | ||
MOV ?A, #00H |
;0行有鍵按下,行首鍵號00H送A | ||
SJMP ?LKP |
|||
LONE: |
JB ?ACC.1, NEXT |
;PC1=1,1行無鍵按下,轉判下一列 | |
MOV ?A, #06H |
;1行有鍵按下,行首鍵號06H | ||
?LKP: |
ADD ?A ,R4 |
;計算鍵號 | |
PUSH ?ACC |
;鍵號暫存 | ||
?LK3: |
LCALL ?KS1 |
;等待鍵釋放 | |
JNZ?? LK3 |
|||
POP ?ACC |
;鍵已釋放,鍵號送A | ||
?KND: |
RET |
||
NEXT: |
INC ?R4 |
;列號+1 | |
?? |
MOV ?A, R2 |
;掃描到最后一列? | |
JNB ?ACC.5, KND |
;是,轉KND | ||
RL ?A |
;掃描字0位左移一位 | ||
MOV ?R2, A |
|||
SJMP ?LK2 |
;掃描下一列 | ||
? KS1: |
MOV ?DPTR, #0B001H |
;判斷有無鍵閉合 | |
MOV ?A, #00H |
|||
MOVX ?@DPTR, A |
;PA口輸出掃描字00H | ||
INC ?DPTR |
|||
INC ?DPTR |
|||
MOVX ?A,? @DPTR |
;讀PC口 | ||
CPL ?A |
|||
?? |
ANL ?A, #03H |
;A=0,無鍵閉合 | |
RET |
|||
T12MS: |
MOV ?R7, #18H |
;延時12ms | |
?? TM: |
MOV ?R6, #FFH |
||
? TM6: |
DJNZ ?R6, TM6 |
||
DJNZ ?R7, TM |
|||
RET |
子程序調試:
1、輸入鍵盤子程序。
2、設置8255命令字(03H)。
3、在標號KND處設置斷點,在按下某一鍵的同時,連續(xù)執(zhí)行子程序。然后檢查A中鍵號是否正確。
(三)顯示和鍵盤演示實驗
在8031應用系統的總體設計中,為了保證顯示和鍵掃描程序的正常工作,必須對8155進行初始化設置。下面的演示程序可作為一個簡單的實例。該程序的功能是:上電后數碼管全部顯示“0”。按下任一鍵后,數碼管顯示其鍵號,而且,顯示位置跟蹤按鍵的先后順序。該程序固化到實驗板的EPROM中后,實驗板能夠脫離仿真器而獨立運行。
? |
ORG? 0000H |
||
LJMP ?MAIN |
|||
ORG ?0A00H |
|||
MAIN: |
MOV ?SP, #60H |
;設置堆棧 | |
MOV ?DPTR, #B000H |
;8155初始化 | ||
MOV ?A, #03H |
;A、B口輸出,C口輸入 | ||
MOVX ?@DPTR, A |
|||
MOV ?2AH, #00H |
;顯示緩沖區(qū)置初始00 | ||
MOV ?2BH, #00H |
|||
MOV ?2CH, #00H |
|||
MOV ?2DH, #00H |
|||
MOV ?2EH, #00H |
|||
MOV ?2FH, #00H |
|||
?MP0: |
MOV ?40H, #2AH |
;40H顯示緩沖指針 | |
?MP1: |
LCALL ?DISP |
;調用顯示 | |
0A21 |
LCALL ?KS1 |
;判有鍵閉合? | |
0A24 |
JZ ?MP1 |
;無鍵閉合,轉MP1 | |
0A26 |
LCALL ?KEYA |
;有鍵閉合,求鍵號,存A | |
MOV ?R1, 40H |
;鍵號送顯示緩沖區(qū) | ||
MOV ?@R1, A |
|||
?? |
INC ?40H |
;修改顯示指針 | |
MOV ?A, 40H |
|||
CJNE ?A, #30H, MP1 |
;按鍵不到6次,轉MP1 | ||
SJMP ?MP0 |
;按鍵次(6位顯示滿)后從最 ? 左位開始重新顯示 | ||
END |
實驗步驟:
1、輸入程序(包括主程序MAIN和子程序DISP、KEY等)。
2、全速運行程序。按下任一鍵,監(jiān)視顯示,檢查是否符合設計。
3、如發(fā)現不正常,可利用單步法或斷點法,進行測試。
思考題:
1、動態(tài)顯示器的亮度和哪些因素有關?
2、動態(tài)顯示器有什么優(yōu)缺點?
3、動態(tài)顯示線路圖4-1中,如將PA0接至數碼管最低位,PA5接至數碼管最高位,程序將如何修改?
4、動態(tài)顯示線路中,如將數碼管改為共陽極,其余不變,程序將如何修改?
5、8031應用系統設計中,地址0000H這一句為什么一定要用?
6、主程序MAIN最后一句SJMP MP0,如改為SJMP $,將產生什么后果?
7、將主程序MAIN中地址為0A21H~0A26H的三句刪掉,改為LCALL KEY,將產生什么后果?
評論
查看更多