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