版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
6.1顯示器及其接口的設(shè)計(jì)
6.2鍵盤及其接口
6.3簡(jiǎn)單計(jì)算器的設(shè)計(jì)
6.4習(xí)題實(shí)例六人機(jī)接口的設(shè)計(jì)
學(xué)習(xí)目標(biāo)
◆理解簡(jiǎn)單計(jì)算器的電路構(gòu)成、工作原理和電路中各元器件的作用。
◆正確設(shè)計(jì)單片機(jī)應(yīng)用系統(tǒng)的顯示接口和鍵盤接口。
◆正確理解和使用子程序設(shè)計(jì)方法。
工作任務(wù)
◆設(shè)計(jì)與制作簡(jiǎn)單計(jì)算器。6.1顯示器及其接口的設(shè)計(jì)
學(xué)習(xí)目標(biāo)◆正確理解靜態(tài)數(shù)碼管顯示電路的構(gòu)成、工作原理和電路中各元器件的作用,并對(duì)電路進(jìn)行分析。◆正確理解動(dòng)態(tài)數(shù)碼管顯示電路的構(gòu)成、工作原理和電路中各元器件的作用,并對(duì)電路進(jìn)行分析。
工作任務(wù)
◆數(shù)碼管靜態(tài)顯示“2008”四個(gè)數(shù)字。
◆數(shù)碼管動(dòng)態(tài)顯示“1234”四個(gè)數(shù)字。
在實(shí)際的單片機(jī)應(yīng)用系統(tǒng)中,都需要有一定的人機(jī)接口,即與控制者(人)進(jìn)行人機(jī)交流的輸入/輸出設(shè)備,以便控制者對(duì)單片機(jī)進(jìn)行操作控制或單片機(jī)向控制者顯示某些必要的數(shù)據(jù)。常用的輸入/輸出設(shè)備有鍵盤、LED(LightEmittingDiode)顯示器、LCD顯示器等。
6.1.1LED顯示器
在3.4節(jié)我們已經(jīng)學(xué)習(xí)了單個(gè)數(shù)碼管顯示接口設(shè)計(jì),但在實(shí)際應(yīng)用中往往需要多個(gè)數(shù)碼管用于顯示,例如普通電子鐘的顯示就需要6個(gè)數(shù)碼管分別顯示時(shí)、分、秒。多位數(shù)碼管顯示的方式有兩種:靜態(tài)顯示和動(dòng)態(tài)顯示。
數(shù)碼管顯示的段碼如表6-1所示,各發(fā)光段a、b、c、d、e、f、g、dp與數(shù)據(jù)線D0~D7對(duì)應(yīng),即a對(duì)應(yīng)D0,b對(duì)應(yīng)D1,…,dp對(duì)應(yīng)D7。6.1.2LED靜態(tài)顯示方式
LED顯示器工作于靜態(tài)顯示方式時(shí),各LED的位選線(共陰極或共陽(yáng)極)連接到一起并接地或接?+5?V;每個(gè)LED的段碼線(a~dp)分別與一個(gè)8位的鎖存器輸出相連。各LED的顯示字符一經(jīng)確定,則相應(yīng)鎖存器應(yīng)鎖存段碼輸出維持不變,直到送入新字形的段碼為止。正因?yàn)槿绱?,所以靜態(tài)顯示器的亮度較高。這種方法的優(yōu)點(diǎn)是編程容易,管理較簡(jiǎn)單;缺點(diǎn)是占用較多的I/O口資源,硬件比較復(fù)雜。若要顯示較多的位數(shù),則需要增加較多的鎖存器。因此在顯示位數(shù)較多的情況下,一般采用動(dòng)態(tài)顯示方式。
【練習(xí)】
項(xiàng)目:數(shù)碼管靜態(tài)顯示。
項(xiàng)目編號(hào):EX6_1。
任務(wù)要求:設(shè)計(jì)一個(gè)數(shù)碼管靜態(tài)顯示電路,實(shí)現(xiàn)4個(gè)LED數(shù)碼管分別顯示“2008”四個(gè)數(shù)字,數(shù)碼管為共陰極數(shù)碼管。在MedWin集成開發(fā)環(huán)境中編輯/編譯控制程序,并產(chǎn)生代碼,在Proteus平臺(tái)里仿真系統(tǒng),撰寫練習(xí)報(bào)告(格式要求見附錄A)。
設(shè)計(jì)設(shè)備與軟件:計(jì)算機(jī)1臺(tái),MedWin或其他同類軟件1套,Proteus軟件1套。設(shè)計(jì)步驟:
(1)打開MedWin軟件。
(2)新建源程序文件,編輯源代碼。
(3)編譯源程序,若沒有錯(cuò),則產(chǎn)生代碼;若有錯(cuò),則修改錯(cuò)誤。
(4)仿真調(diào)試程序代碼。
(5)在Proteus中打開4位數(shù)碼管靜態(tài)顯示電路圖。
(6)加載程序代碼,調(diào)試。
1.設(shè)計(jì)思路
根據(jù)上面介紹的數(shù)碼管靜態(tài)顯示方法,在電路設(shè)計(jì)上,可以考慮采用74LS273或74LS373等鎖存器來(lái)鎖存每個(gè)數(shù)碼管的段碼,鎖存器的選通信號(hào)由單片機(jī)的I/O口進(jìn)行控制。位選位采用直接接地的方式。設(shè)計(jì)仿真圖如圖6-1所示。軟件設(shè)計(jì)比較簡(jiǎn)單,主要考慮各個(gè)鎖存器的選通信號(hào)何時(shí)有效,最終實(shí)現(xiàn)4個(gè)LED數(shù)碼管分別顯示“2008”四個(gè)數(shù)字。數(shù)碼管靜態(tài)顯示流程圖如圖6-2所示。圖6-14位數(shù)碼管靜態(tài)顯示仿真圖圖6-24位數(shù)碼管靜態(tài)顯示流程圖
2.程序設(shè)計(jì)所需指令表
程序設(shè)計(jì)所需指令表如表6-2所示。
3.參考程序代碼
參考程序代碼如下:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV SP,#5FH ;程序初始化
MOV DPTR,#TAB ;段碼表地址給 DPTR
MOV R0,#00H
MOV R1,#01H
MOV P2,#00H
LOOP: MOV A,R1
MOV P2,A ;送位選位
RL A
MOV R1,A
MOV A,R0
MOVCA,@A+DPTR ;得到當(dāng)前要顯示數(shù)據(jù)的段碼
MOV P0,A
INC R0
MOV P2,#00H
ACALL DELAY10MS
CJNE R0,#03H,LOOP;四位數(shù)據(jù)是否都已顯示完成? 若沒有則再次顯示下一位數(shù)據(jù);若完成了,則順序往下
AJMP $ DELAY10MS:
MOV R7,#50
DEL1: MOV R6,#100
DJNZ R6,$
DJNZ R7,DEL1
RET
TAB: DB 5BH,3FH,3FH,7FH
END
6.1.3LED動(dòng)態(tài)顯示方式
在有多位LED顯示時(shí),為了簡(jiǎn)化電路,降低成本,通常將各LED的段碼線并聯(lián)在一起,由一個(gè)8位I/O口控制,形成段碼線的多路復(fù)用;各LED的位選線(共陰極或共陽(yáng)極公共端)分別由相應(yīng)的I/O口控制,實(shí)現(xiàn)各LED的分時(shí)選通,如圖6-3所示。顯示時(shí)輪流向各位數(shù)碼管送出各字型的段碼和相應(yīng)的位選,位選選中的LED則顯示段碼對(duì)應(yīng)的字符,沒選中的LED則不顯示新的內(nèi)容,利用發(fā)光二極管的余輝和人眼視覺的暫留作用,使人感覺各個(gè)LED數(shù)碼管好像同時(shí)都在顯示。動(dòng)態(tài)掃描顯示的優(yōu)點(diǎn)是電路簡(jiǎn)單,占用I/O資源少,成本低;缺點(diǎn)是占用CPU,軟件稍復(fù)雜。圖6-34位數(shù)碼管動(dòng)態(tài)顯示圖圖6-3是由4個(gè)LED顯示器組成的動(dòng)態(tài)顯示電路。由于每個(gè)LED的段碼線都并聯(lián)在一起,所以在某一瞬間,如果各LED位選都選通,則4個(gè)LED顯示相同的字符。但是如果要顯示不同字符,則必須采用動(dòng)態(tài)掃描法輪流選通各個(gè)LED的位選,即在某一瞬間,段碼線輸出想要顯示字符的段碼,而位選線控制某個(gè)想要其點(diǎn)亮的LED(此處應(yīng)選第一個(gè)),使其COM端為低電平。這樣第一個(gè)數(shù)碼管就顯示了當(dāng)前送入的段碼對(duì)應(yīng)的字符。同樣在下一個(gè)時(shí)刻,讓第二個(gè)LED被選中,其他不被選中,則第二個(gè)LED顯示新的字符。如此輪流,使每位LED數(shù)碼管分時(shí)顯示不同的字符。若要顯示“1234”,則應(yīng)分時(shí)在P0口、P2口輪流輸入段碼、位選碼,如表6-3所示。段碼、位選碼每送入一次要延時(shí)一段時(shí)間,以便讓LED可以達(dá)到一定的亮度,一般這個(gè)時(shí)間我們?cè)O(shè)定為10ms。同時(shí)不要超過(guò)100ms,因?yàn)槿搜鄣囊曈X暫留時(shí)間為100?ms,這樣就可以造成視覺暫留效果,讓人看上去每個(gè)數(shù)碼管都是亮著的。
【練習(xí)】
項(xiàng)目:數(shù)碼管動(dòng)態(tài)顯示。
項(xiàng)目編號(hào):EX6_2。
任務(wù)要求:在Proteus中設(shè)計(jì)如圖6-4所示的數(shù)碼管動(dòng)態(tài)顯示電路,實(shí)現(xiàn)4個(gè)LED數(shù)碼管分別顯示“1234”四個(gè)數(shù)字,P0口輸出段選碼,P2口輸出位選碼,數(shù)碼管為共陽(yáng)極數(shù)碼管。在MedWin集成開發(fā)環(huán)境中編輯/編譯控制程序,并產(chǎn)生代碼,在Proteus平臺(tái)里仿真系統(tǒng),撰寫練習(xí)報(bào)告(格式要求見附錄A)。
設(shè)計(jì)設(shè)備與軟件:計(jì)算機(jī)1臺(tái),MedWin或其他同類軟件1套,Proteus軟件1套。設(shè)計(jì)步驟:
(1)打開MedWin軟件。
(2)新建源程序文件,編輯源代碼。
(3)編譯源程序,若沒有錯(cuò),則產(chǎn)生代碼;若有錯(cuò),則修改錯(cuò)誤。
(4)仿真調(diào)試程序代碼。
(5)在Proteus中打開4位數(shù)碼管動(dòng)態(tài)顯示電路圖。
(6)加載程序代碼,調(diào)試。
1.設(shè)計(jì)思路
根據(jù)前面講述的動(dòng)態(tài)顯示方法以及數(shù)碼管靜態(tài)顯示時(shí)所采用的查表法顯示方法,在電路設(shè)計(jì)上,可以參考圖6-3所示的原理圖進(jìn)行設(shè)計(jì),設(shè)計(jì)仿真圖如圖6-4所示。此處采用4個(gè)相連的共陽(yáng)極LED,位選位高電平有效。要讓不同的數(shù)碼管顯示不同的數(shù)值,需將顯示數(shù)值的段碼送給數(shù)碼管的各段,位選位用來(lái)選擇具體哪個(gè)數(shù)碼管被點(diǎn)亮,以實(shí)現(xiàn)4個(gè)LED數(shù)碼管分別顯示“1234”四個(gè)數(shù)字。數(shù)碼管動(dòng)態(tài)顯示流程圖如圖6-5所示。圖6-4數(shù)碼管動(dòng)態(tài)顯示仿真圖圖6-5數(shù)碼管動(dòng)態(tài)顯示流程圖
2.程序設(shè)計(jì)所需指令表
程序設(shè)計(jì)所需指令表如表6-4所示。
3.參考程序代碼
參考程序代碼如下:
ORG 0000H
LJMPMAIN
ORG 0030H
MAIN: MOV R0, #00H ;置顯示初值
MOVR1, #80H ;置選中第一個(gè)LED的位選
MOVR2, #03H ;置要顯示的位的個(gè)數(shù)
MOVDPTR, #TAB ;送段碼表頭地址至DPT
LOOP:MOV A, R1 ;取位選
MOVP2, A ;送位選至P2口
RR A ;指向下一位LED
MOVR1, A ;保存位選
MOVA, R0 ;取顯示數(shù)據(jù)
MOVCA, @A+DPTR ;取顯示數(shù)據(jù)的段碼
MOVP0, A ;送段碼至P0口
LCALLDELAY10MS ;延時(shí)10ms
INC R0 ;顯示數(shù)據(jù)加1
DJNZR2, LOOP
;要顯示的4位數(shù)據(jù)顯示未完,則繼續(xù)
SJMPMAIN
;顯示完4位數(shù)據(jù),從頭重新開始顯示
DELAY10MS:
MOVR7,#10
DEL1: MOV R6,#50
DJNZ R6,$
DJNZ R7,DEL1
RET
TAB: DB 0F9H,0A4H,0B0H,99H ;字型段碼表
END
思考:數(shù)碼管靜態(tài)顯示與動(dòng)態(tài)顯示在這兩個(gè)例程中的主要區(qū)別是什么?6.2鍵盤及其接口
學(xué)習(xí)目標(biāo)◆正確理解非編碼式獨(dú)立鍵盤電路的構(gòu)成、鍵值的識(shí)別,并對(duì)電路進(jìn)行分析。◆正確理解非編碼式矩陣鍵盤電路的設(shè)計(jì)原理、逐行掃描法、反轉(zhuǎn)法等鍵值識(shí)別的方法,并對(duì)電路進(jìn)行分析。
工作任務(wù)◆識(shí)別鍵盤按鍵并進(jìn)行鍵值顯示。
在單片機(jī)應(yīng)用系統(tǒng)中,操作人員可以通過(guò)鍵盤向單片機(jī)輸入數(shù)據(jù)、傳送命令,實(shí)現(xiàn)人機(jī)交互。鍵盤是一組按鍵開關(guān)的集合,鍵盤分為編碼式鍵盤和非編碼式鍵盤。鍵盤上閉合鍵的識(shí)別由專用的譯碼器進(jìn)行識(shí)別。產(chǎn)生鍵的編碼或鍵值的鍵盤稱為編碼鍵盤,如我們經(jīng)常使用的PC機(jī)的鍵盤就是編碼式鍵盤;由軟件來(lái)識(shí)別閉合鍵的鍵盤稱為非編碼式鍵盤。
單片機(jī)系統(tǒng)中應(yīng)用較多的是非編碼式鍵盤,它具有結(jié)構(gòu)簡(jiǎn)單、應(yīng)用靈活等特點(diǎn)。6.2.1鍵盤結(jié)構(gòu)
常用的鍵盤可以分為獨(dú)立式按鍵和矩陣式按鍵兩種。
1.獨(dú)立式鍵盤接口
獨(dú)立式鍵盤就是各鍵相互獨(dú)立,每個(gè)按鍵的一端單獨(dú)接到單片機(jī)的一個(gè)I/O口上,另一端接地,如圖6-6所示。這是最簡(jiǎn)單的一種鍵盤電路。采用查詢方式加去抖動(dòng)方式確認(rèn)按鍵,即通過(guò)讀I/O口來(lái)判斷各I/O口的電平。如果有按鍵按下,則該I/O口為低電平;如果沒有按鍵按下,則該I/O口為高電平。
下例對(duì)圖6-6所示的鍵盤電路進(jìn)行識(shí)別,當(dāng)KS0按下時(shí),執(zhí)行KEY0子程序,當(dāng)KS1按下時(shí),執(zhí)行KEY1子程序,以此類推,直到KS7為止。圖6-6獨(dú)立式鍵盤原理圖程序清單如下:
ORG0000H
LJMPSTART
ORG0030H
START:MOVA,#0FFH ;輸入時(shí)先將P1口全置1
MOVP1,A
MOVA,P1 ;讀鍵盤狀態(tài)
CJNEA,#0FFH,KEY
;有鍵按下,則轉(zhuǎn)到KEY
AJMPSTART
;無(wú)鍵按下,則重新讀鍵盤狀態(tài)
KEY:LCALLDELAY;有鍵按下時(shí),要先延時(shí)去抖動(dòng)
JNBACC.0,KEY0;0號(hào)按鍵按下,轉(zhuǎn)到KEY0
JNBACC.1,KEY1 ;1號(hào)按鍵按下,轉(zhuǎn)到KEY1
JNBACC.2,KEY2 ;2號(hào)按鍵按下,轉(zhuǎn)到KEY2
JNBACC.3,KEY3 ;3號(hào)按鍵按下,轉(zhuǎn)到KEY3
JNBACC.4,KEY4 ;4號(hào)按鍵按下,轉(zhuǎn)到KEY4
JNBACC.5,KEY5 ;5號(hào)按鍵按下,轉(zhuǎn)到KEY5
JNBACC.6,KEY6 ;6號(hào)按鍵按下,轉(zhuǎn)到KEY6
JNBACC.7,KEY7 ;7號(hào)按鍵按下,轉(zhuǎn)到KEY7
LJMPSTART
KEY0:LJMP KEY0_SERVICE
;此處由于JNB指令,只能跳轉(zhuǎn)128字節(jié)
KEY1: LJMP KEY1_SERVICE
;因此,將該8個(gè)入口地址集中放在一起
……
KEY7: LJMP KEY7_SERVICE
KEY0_SERVICE:……
LJMP START
KEY1_SERVICE:……
LJMP START
……
KEY7_SERVICE: ……
LJMPSTART
DELAY: MOV R0,#100
DL1: MOV R1,#50
DJNZ R1,$
DJNZ R0,DL1
RET
END由上面的例子我們可以看出獨(dú)立式鍵盤查詢方式的程序處理方法,也可以看出各按鍵有了一定的優(yōu)先級(jí),按鍵0優(yōu)先級(jí)最高,按鍵7優(yōu)先級(jí)最低。同時(shí)我們也看到了CPU要不停地查詢I/O口電平的變化,而在實(shí)際中,我們也可以采用中斷的方式來(lái)進(jìn)行按鍵識(shí)別。如圖6-7所示,各個(gè)按鍵都接到一個(gè)與非門上,與非門的輸出接到單片機(jī)的外部中斷,當(dāng)任何一個(gè)按鍵按下時(shí),都會(huì)使與非門的輸出變低,從而引起單片機(jī)中斷。我們可以在中斷服務(wù)程序中確認(rèn)到底是哪個(gè)按鍵按下,這樣CPU就不需要不停地去查詢I/O口了,從而可以去干其他必要的事情。圖6-7中斷獨(dú)立式鍵盤原理圖
2.矩陣式鍵盤接口
1)矩陣式鍵盤的工作原理
在單片機(jī)的應(yīng)用系統(tǒng)中,如果要使用的按鍵比較多,那么我們不會(huì)采用獨(dú)立式鍵盤,因?yàn)槟菢诱加玫腎/O口較多。在實(shí)際中我們常采用矩陣式鍵盤,如圖6-8所示,這種矩陣式鍵盤由行線和列線組成,按鍵位于行、列的交叉點(diǎn)上。按下按鍵時(shí)行線和列線就交叉到一起,沒按下時(shí)行線和列線是不相通的。這樣一個(gè)P1口就可以構(gòu)成4×4=16個(gè)按鍵,比直接將鍵盤接到端口的獨(dú)立式鍵盤多了一倍的按鍵。圖6-8矩陣式鍵盤接口的原理圖圖6-8中,行線(P1.7~P1.4)通過(guò)上拉電阻接到?+5V,同時(shí)行線所接的I/O口作為輸入口,列線所接的I/O口作為輸出口輸出低電平。這樣當(dāng)無(wú)按鍵按下時(shí),行線處于高電平狀態(tài);當(dāng)有按鍵按下時(shí),行線的電平將被和它交叉的列線電平拉低。這樣只要有一個(gè)按鍵按下,對(duì)應(yīng)的4根行線中就必定有一個(gè)變?yōu)榈碗娖?,通過(guò)讀輸入口就可以知道現(xiàn)在是否有按鍵按下。
2)按鍵的識(shí)別
(1)逐行掃描法。逐行掃描法是鍵盤識(shí)別中最常用的識(shí)別方法。下面以圖6-8所示的鍵盤為例來(lái)說(shuō)明該掃描法。此方法分為兩步進(jìn)行:第一步,判斷是否有鍵按下;第二步,如有按鍵按下,則判別具體哪個(gè)鍵被按下。
判斷鍵盤中是否有鍵按下的方法:由單片機(jī)在列線上送出全0,即把全部的列線置為低電平,然后讀輸入(行線)狀態(tài)。如果有鍵按下,則讀進(jìn)來(lái)的數(shù)據(jù)肯定不全為1;如果沒有鍵按下,則讀進(jìn)來(lái)的數(shù)據(jù)肯定全為1。判別具體哪個(gè)鍵被按下的方法如下:
①將第1列線置0,其余列線置1,輸出0111,然后讀取行線的電平,判別第1列是否有鍵按下。如果在第1列上有鍵按下,則對(duì)應(yīng)的行線會(huì)被拉低,即讀入的該行電平為低電平,其余行電平為高電平,這表明第1列和此行線交叉位置上的按鍵被按下。若所有行線都為高電平,則表明該列上無(wú)鍵按下。
②將第2列線置0,其余列線置1,輸出1011,然后讀取行線的電平。判別哪個(gè)按鍵被按下,具體判別方法同上。③將第3列線置0,其余列線置1,輸出1101,然后讀取行線的電平。判別哪個(gè)按鍵被按下,具體判別方法同上。
④將第4列線置0,其余列線置1,輸出1110,然后讀取行線的電平。判別哪個(gè)按鍵被按下,具體判別方法同上。
通過(guò)以上的鍵盤掃描方法,我們可以確定是否有鍵按下和具體哪個(gè)鍵被按下這兩件事情。這種掃描方法稱為行(列)掃描法。
(2)反轉(zhuǎn)法。采用行掃描法判斷具體哪個(gè)按鍵被按下,往往需要多次的掃描,如某個(gè)按鍵在最后一行,那就需要掃描4次,才能得到此按鍵所處的行列值。那么有沒有不需要多次掃描即可完成鍵值判斷的方法呢?答案是肯定的。采用反轉(zhuǎn)法只需要2次掃描就可以獲得按鍵所處的行列值,其具體原理如下:
第一次,讓所有的行線為輸出線,列線為輸入線,并使輸出線全部為低電平0000輸出,則列線中電平變低的列就是按鍵所在的列。
第二次,讓所有的列線為輸出線,行線為輸入線,并使輸出線全部為低電平0000輸出,則行線中電平變低的行就是按鍵所在的行。
通過(guò)以上兩次掃描就可以確定按鍵所在的行列值,從而可以識(shí)別出所按的按鍵。6.2.2矩陣式鍵盤識(shí)別
【練習(xí)】
項(xiàng)目:矩陣式鍵盤識(shí)別項(xiàng)目訓(xùn)練。
項(xiàng)目編號(hào):EX6_3。
任務(wù)要求:在Proteus中設(shè)計(jì)一個(gè)4×4矩陣式鍵盤電路,通過(guò)軟件編程實(shí)現(xiàn)對(duì)鍵盤電路的鍵值識(shí)別,并用一個(gè)LED數(shù)碼管顯示其鍵值。在MedWin集成開發(fā)環(huán)境中編輯/編譯控制程序,并產(chǎn)生代碼;在Proteus平臺(tái)里仿真系統(tǒng);撰寫練習(xí)報(bào)告(格式要求見附錄A)。
設(shè)計(jì)設(shè)備與軟件:計(jì)算機(jī)1臺(tái),MedWin或其他同類軟件1套,Proteus軟件1套。設(shè)計(jì)步驟:
(1)打開MedWin軟件。
(2)新建源程序文件,編輯源代碼。
(3)編譯源程序,若沒有錯(cuò),則產(chǎn)生代碼;若有錯(cuò),則修改錯(cuò)誤。
(4)仿真調(diào)試程序代碼。
(5)在Proteus中繪制4?×?4矩陣式鍵盤電路圖。
(6)加載程序代碼,調(diào)試。
1.設(shè)計(jì)思路
在前面介紹的兩種識(shí)別方法中任選一種,此處我們選用第一種方法進(jìn)行識(shí)別。在硬件電路設(shè)計(jì)上,用P1口接一個(gè)4×4的鍵盤,P0口接一個(gè)靜態(tài)顯示的LED數(shù)碼管。把P1口得到的行列值轉(zhuǎn)換為L(zhǎng)ED可以顯示的數(shù)值,并通過(guò)查表法顯示出來(lái)。具體仿真電路如圖6-9所示。在軟件設(shè)計(jì)上,分兩個(gè)子程序,即顯示子程序和鍵盤識(shí)別子程序。具體流程圖如圖6-10所示。圖6-9矩陣式鍵盤識(shí)別顯示仿真圖圖6-10矩陣式鍵盤識(shí)別顯示流程圖
2.程序設(shè)計(jì)所需指令表
程序設(shè)計(jì)所需指令表如表6-5所示。
3.參考程序代碼
參考程序代碼如下:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV SP,#05FH ;初始化
MOV P1,#0F0H
MOV P0,#00H ;清除LED顯示
CLR F0
;鍵盤按下標(biāo)志位,初始化為無(wú)鍵按下
MOV DPTR,#TAB ;設(shè)置顯示表首地址
LOOP: ACALL KEY_SCAN
JNB TF0,LOOP
ACALL LED_DISPLAY
AJMP LOOP
KEY_SCAN:
MOV P1,#0F0H ;使所有列線全部為低電平
MOV A,P1 ;讀取P1口的行線值
ANL A,#0F0H ;判斷是否有鍵按下
CJNE A,#0F0H,KEY1
;如行線不全為1,則有鍵按下
AJMP KEY_EXIT ;否則,退出鍵盤掃描
KEY1: ACALLDELAY10MS;去抖動(dòng),開始掃描鍵盤
MOV A,#0F7H;第一列掃描,列線輸出0111
KEY2: MOV R7,A ;保存列掃描值到R7
MOV P1,A
MOV A,P1 ;讀取P1行線值
ANL A,#0F0H
CJNE A,#0F0H,KEY_CODE
;若有鍵按下,則進(jìn)行鍵處理
MOV A,R7 ;否則繼續(xù)下一列掃描
RR A
CJNE A,#7FH,KEY2
KEY3: RET
KEY_CODE: ;鍵處理,得到鍵值
MOV B,#00H
KEY4: RLC A ;計(jì)算行×列的值
JNC KEY5
INC B
INC B
INC B
INC B
AJMP KEY4
KEY5: MOV A,R7
SWAP A
KEY6: RLC A ;計(jì)算列值
JNC KEY7
INC B
AJMP KEY6 ;保存鍵值到B中
KEY7: MOV A,P1 ;判斷鍵是否釋放
ANL A,#0F0H
CJNE A,#0F0H,KEY7
SETB F0 ;建立按鍵有效標(biāo)志位
RET
LED_DISPLAY:
MOV A,B ;取要顯示的數(shù)據(jù)
MOVC A,@A+DPTR ;取字段碼
MOV P0,A ;送顯示
CLR F0 ;清除按鍵有效標(biāo)志位
RET
DELAY10MS:
……
……
RET
TAB: DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H, 7FH,6FH,77H,7CH,39H,5EH,79H,
DB71H,00H
END
思考:如果采用反轉(zhuǎn)法進(jìn)行按鍵的識(shí)別,那么應(yīng)該如何修改程序以實(shí)現(xiàn)相同的功能呢?6.3簡(jiǎn)單計(jì)算器的設(shè)計(jì)學(xué)習(xí)目標(biāo)◆理解數(shù)碼管動(dòng)態(tài)顯示的工作原理,并設(shè)計(jì)相應(yīng)的接口電路?!粽莆站仃囀芥I盤設(shè)計(jì)和鍵值識(shí)別的方法,并設(shè)計(jì)相應(yīng)的接口電路?!暨M(jìn)一步掌握單片機(jī)I/O口作為輸入/輸出口應(yīng)用的基本編程方法?!暨M(jìn)一步掌握單片機(jī)子程序調(diào)用的程序設(shè)計(jì)方法。工作任務(wù)◆設(shè)計(jì)簡(jiǎn)單計(jì)算器仿真電路并對(duì)結(jié)果進(jìn)行描述?!粼O(shè)計(jì)與調(diào)試簡(jiǎn)單計(jì)算器程序?!糇珜懺O(shè)計(jì)文檔與測(cè)試報(bào)告。
【練習(xí)】
項(xiàng)目:簡(jiǎn)單計(jì)算器設(shè)計(jì)項(xiàng)目訓(xùn)練。
項(xiàng)目編號(hào):EX6_4。
任務(wù)要求:設(shè)計(jì)一個(gè)簡(jiǎn)單的加、減法計(jì)算器,以實(shí)現(xiàn)100以內(nèi)數(shù)據(jù)的加、減法運(yùn)算。同時(shí)如果操作錯(cuò)誤,則進(jìn)行清零操作。在MedWin集成開發(fā)環(huán)境中編輯/編譯控制程序,并產(chǎn)生代碼,在Proteus平臺(tái)里仿真系統(tǒng),撰寫練習(xí)報(bào)告(格式要求見附錄A)。
設(shè)計(jì)設(shè)備與軟件:計(jì)算機(jī)1臺(tái),MedWin或其他同類軟件1套,Proteus軟件1套。設(shè)計(jì)步驟:
(1)打開MedWin軟件。
(2)新建源程序文件,編輯源代碼。
(3)編譯源程序,若沒有錯(cuò),則產(chǎn)生代碼;若有錯(cuò),則修改錯(cuò)誤。
(4)仿真調(diào)試程序代碼。
(5)在Proteus中繪制計(jì)算器設(shè)計(jì)電路圖。
(6)加載程序代碼,調(diào)試。
1.思路分析
根據(jù)6.1節(jié)和6.2節(jié)介紹的內(nèi)容,具體設(shè)計(jì)鍵盤和LED數(shù)碼管的實(shí)現(xiàn)方法。因?yàn)殒I盤需要0~9、+、-、=、清零共14個(gè)按鍵,所以考慮采用矩陣式鍵盤。數(shù)碼顯示需要3位數(shù),同時(shí)為了節(jié)約硬件成本,也可以考慮采用動(dòng)態(tài)顯示方式進(jìn)行顯示。
2.硬件電路設(shè)計(jì)
(1)思路。根據(jù)思路分析和6.1.3節(jié)、6.2.3節(jié)所介紹的鍵盤及顯示的內(nèi)容,可以將4×4矩陣式鍵盤接到P1口,采用和前面所介紹的內(nèi)容相同的硬件連接電路,只是把鍵值進(jìn)行重新分配。數(shù)碼管也采用前面所介紹的動(dòng)態(tài)顯示硬件電路,采用共陰極數(shù)碼管,通過(guò)P0口8位接74LS241進(jìn)行段碼控制,位選采用P2口進(jìn)行控制。單片機(jī)其他電路接成最小系統(tǒng)即可。
(2)在Proteus中畫好電路圖。仿真圖如圖6-11所示。圖6-11簡(jiǎn)單計(jì)算器設(shè)計(jì)仿真圖
3.軟件設(shè)計(jì)
(1)繪制程序流程圖。流程圖如圖6-12所示。圖6-12簡(jiǎn)單計(jì)算器設(shè)計(jì)流程圖
(2)編寫程序代碼。參考程序代碼如下:
NUM1_ONE EQU 30H ;加數(shù)顯示空間
NUM1_TEN EQU 31H
NUM1 EQU 33H
NUM2_ONE EQU 34H ;被加數(shù)顯示空間
NUM2_TEN EQU 35H
NUM2 EQU 37H
NUM3_ONE EQU 38H ;計(jì)算結(jié)果顯示空間
NUM3_TEN EQU 39H
NUM3_HUD EQU 3AH
NUM3 EQU 3BH
NOW_DISPLAY_NUM EQU 3DH ;當(dāng)前要顯示的數(shù)
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV SP,#5FH
MOV P0,#00H ;清顯示
MOV P2,#0FH
SETB F0
;運(yùn)算符號(hào)標(biāo)志位,初始為加法運(yùn)算
MOV R4,#00H ;清當(dāng)前的位數(shù)標(biāo)志
MOV NOW_DISPLAY_NUM,#00H
;把當(dāng)前要顯示的數(shù)置為加
MOV DPTR,#TAB
LOOP: ACALLKEY_SCAN
MOV A,B ;分析鍵值
CLR C
SUBB A,#0AH
JNC IS_SYMBOL
MOV A,NOW_DISPLAY_NUM
;此處按下了數(shù)字鍵
CJNE A,#02H,LOOP1
;此處為一次計(jì)算完成后再次按下數(shù)字鍵
MOV NOW_DISPLAY_NUM,#00H
;把當(dāng)前要顯示的數(shù)置為加數(shù)
MOV R4,#00H ;清數(shù)值的位數(shù)為0
LOOP1:
INC R4 ;當(dāng)前的位數(shù)標(biāo)志+1
ACALL NUM_STORAGE ;存儲(chǔ)當(dāng)前的數(shù)字
ACALL DISPLAY ;顯示當(dāng)前的數(shù)字
AJMP LOOP
IS_SYMBOL: ;此處按下的是符號(hào)鍵
MOV A,B
CJNE A,#0AH,NO_ADD
SETB F0 ;為加法運(yùn)算,置F0標(biāo)志位
INC NOW_DISPLAY_NUM
;當(dāng)前要顯示的數(shù)的標(biāo)志+1
MOV R4,#00H
AJMP LOOP
NO_ADD:
CJNE A,#0BH,NO_SUB
CLR F0
;為減法運(yùn)算,清F0標(biāo)志位
INC NOW_DISPLAY_NUM
;當(dāng)前要顯示的數(shù)的標(biāo)志+1
MOV R4,#00H
AJMP LOOP
NO_SUB:
CJNE A,#0CH,CLEAR
ACALL OPERATIONAL
;此處按下了“=”鍵
INC NOW_DISPLAY_NUM
;當(dāng)前要顯示的數(shù)的標(biāo)志+1
ACALL DISPLAY
AJMP LOOP
CLEAR:AJMP MAIN
;************************************************
; KEY_SCAN
;************************************************
KEY_SCAN:
MOV P1,#0F0H ;使所有列線全部為低電平
MOV A,P1
ANL A,#0F0H ;判斷是否有鍵按下
CJNE A,#0F0H,KEY1
AJMP KEY_EXIT
;若無(wú)鍵按下,則退出鍵掃描
KEY1: ACALL
DELAY10MS
MOV A,#0F7H
KEY2: MOV R7,A
MOV P1,A
MOV A,P1
ANL A,#0F0H
CJNE A,#0F0H,KEY_CODE
;若有鍵按下,則進(jìn)行鍵處理
MOV A,R7 ;否則繼續(xù)下一列掃描
RR A
CJNE A,#7FH,KEY2
KEY_EXIT:
ACALL DISPLAY
AJMP KEY_SCAN
KEY_CODE: ;鍵處理,得到鍵值
MOV B,#00H
KEY4: RLC A ;計(jì)算行×列的值
JNC KEY5
INC B
INC B
INC B
INC B
AJMP KEY4
KEY5: MOV A,R7
SWAP A
KEY6: RLC A ;計(jì)算列值
JNC KEY7
INC B
AJMP KEY6 ;保存鍵值到B中
KEY7: MOV A,P1 ;判斷鍵是否釋放
ANL A,#0F0H
CJNE A,#0F0H,KEY7
;
SETB F0 ;建立按鍵有效標(biāo)志位
RET
;*************************************************
; NUM_STORAGE
;*************************************************
NUM_STORAGE:
MOVA,NOW_DISPLAY_NUM;當(dāng)前要存儲(chǔ)哪個(gè)數(shù)
JNZ
STORAGE_NUM2
MOV
R0,#NUM1_ONE
;存第一個(gè)數(shù),即存被加數(shù)
AJMP
STORAGE2
STORAGE_NUM2:
MOV
R0,#NUM2_ONE
;存第二個(gè)數(shù),即存加數(shù)
STORAGE2:
MOV
A,R4
DEC
A
JZ STORAGE_ONE
MOV
A,B
XCH
A,@R0 ;存十位數(shù)
INC R0
MOV
@R0,A ;存?zhèn)€位數(shù)
RET
STORAGE_ONE:
MOV
@R0,B
;該數(shù)為個(gè)位數(shù),所以只要存一個(gè)數(shù)即可
RET
;************************************************
; DISPLAY
;************************************************
DISPLAY:
MOV A,R4
JNZ DISPLAY_NUM
MOV P2,#0FH
MOV P0,#00H
RET
DISPLAY_NUM:
MOV A,NOW_DISPLAY_NUM ;當(dāng)前要顯示哪個(gè)數(shù)
CJNE A,#00H,DISP_NUM2
MOV A,NUM1_ONE ;顯示NUM1(即要顯示加數(shù))
MOV P2,#0E0H ;顯示個(gè)位,即P2.4有效
ACALL NUM_DISPLAY
MOV A,R4
DEC A
JNZ DISP_NUM1_TEN
;如果有十位數(shù),則再去顯示十位數(shù)
RET
DISP_NUM1_TEN:
MOV A,NUM1_TEN
MOV P2,#0D0H ;顯示個(gè)位,即P2.5有效
ACALL NUM_DISPLAY
RET
DISP_NUM2:
CJNE A,#01H,DISP_NUM3
MOV A,NUM2_ONE
;顯示NUM2(即要顯示被加數(shù))
MOV P2,#0E0H ;顯示個(gè)位,即P2.4有效
ACALL NUM_DISPLAY
MOV A,R4
DEC A
JNZ DISP_NUM2_TEN
;如果有十位數(shù),則再去顯示十位數(shù)
RET
DISP_NUM2_TEN:
MOV
A,NUM2_TEN
MOV
P2,#0D0H ;顯示十位,即P2.5有效
ACALL NUM_DISPLAY
RET
DISP_NUM3:
CJNE
A,#02H,DISP_ERROR
JB F0,DISP_NUM3_ONE
;如果為加法,則不需要判斷正負(fù)數(shù)
MOV
A,NUM1
;如果NUM1<NUM2,那么結(jié)果為負(fù)數(shù)顯示負(fù)號(hào)
CLR C
CJNE
A,NUM2,DISP_NAG
AJMP
DISP_NUM3_ONE
DISP_NAG:
JC DISP_NAGATIVE
AJMP DISP_NUM3_ONE
DISP_NAGATIVE:
MOV P2,#7FH
MOV P0,#40H
ACALL DELAY10MS
DISP_NUM3_ONE:
MOV A,NUM3_ONE ;顯示NUM3(即要顯示結(jié)果)
MOV P2,#0E0H ;顯示個(gè)位,即P2.4有效
ACALL
NUM_DISPLAY
MOV A,R4
DEC A
MOV R1,A
JNZ DISP_NUM3_TEN
;如果有十位數(shù),則再去顯示十位數(shù)
RET
DISP_NUM3_TEN:
MOV A,NUM3_TEN
MOV P2,#0D0H
;顯示十位,即P2.5有效
ACALL NUM_DISPLAY
MOV A,R1
DEC A
JNZ DISP_NUM3_HUD
RET
DISP_NUM3_HUD: ;顯示百位,即P2.6有效
MOV A,NUM3_HUD
MOV P2,#0B0H
ACALL NUM_DISPLAY
RET
DISP_ERROR:
MOV P0,#3FH ;錯(cuò)誤,則顯示----
MOV P2,#0FH
RET
NUM_DISPLAY:
MOVC A,@A+DPTR
MOV P0,A
ACALL DELAY10MS
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單位保潔衛(wèi)生制度
- 健康單位衛(wèi)生保潔制度
- 創(chuàng)建衛(wèi)生工作制度
- 農(nóng)村村級(jí)衛(wèi)生制度
- 職業(yè)衛(wèi)生新管理制度
- 衛(wèi)生院護(hù)理常規(guī)制度
- 學(xué)校定期清潔衛(wèi)生間制度
- 衛(wèi)生室設(shè)施設(shè)備管理制度
- 衛(wèi)生室死亡報(bào)告制度
- 衛(wèi)生院電鍋爐房管理制度
- 安徽省六校2026年元月高三素質(zhì)檢測(cè)考試物理試題(含答案)
- 口腔科院感預(yù)防與控制考核試題附答案
- 心肌梗死護(hù)理教學(xué)課件
- 2025年市場(chǎng)監(jiān)督管理局招聘面試題及答案
- DB42T 1279-2017 機(jī)動(dòng)車檢驗(yàn)檢測(cè)機(jī)構(gòu)資質(zhì)認(rèn)定評(píng)審?fù)?用指南
- 應(yīng)急測(cè)繪服務(wù)方案(3篇)
- 2025至2030年中國(guó)移動(dòng)充電車行業(yè)市場(chǎng)全景評(píng)估及發(fā)展策略分析報(bào)告
- 2025年湖南省長(zhǎng)沙市長(zhǎng)郡教育集團(tuán)中考三模道德與法治試題
- 南京市五校聯(lián)盟2024-2025學(xué)年高二上學(xué)期期末考試英語(yǔ)試卷(含答案詳解)
- 云南省昆明市五華區(qū)2024-2025學(xué)年高一上學(xué)期1月期末考試地理試題(解析版)
- 人教部編版五年級(jí)語(yǔ)文上冊(cè)1-8單元習(xí)作作文范文 寫作指導(dǎo)
評(píng)論
0/150
提交評(píng)論