《單片機(jī)應(yīng)用實(shí)例開發(fā)》課件第6章_第1頁(yè)
《單片機(jī)應(yīng)用實(shí)例開發(fā)》課件第6章_第2頁(yè)
《單片機(jī)應(yīng)用實(shí)例開發(fā)》課件第6章_第3頁(yè)
《單片機(jī)應(yīng)用實(shí)例開發(fā)》課件第6章_第4頁(yè)
《單片機(jī)應(yīng)用實(shí)例開發(fā)》課件第6章_第5頁(yè)
已閱讀5頁(yè),還剩93頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論