《單片機(jī)原理與應(yīng)用技術(shù)》課件第5章_第1頁
《單片機(jī)原理與應(yīng)用技術(shù)》課件第5章_第2頁
《單片機(jī)原理與應(yīng)用技術(shù)》課件第5章_第3頁
《單片機(jī)原理與應(yīng)用技術(shù)》課件第5章_第4頁
《單片機(jī)原理與應(yīng)用技術(shù)》課件第5章_第5頁
已閱讀5頁,還剩116頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

5.1I/O端口的輸入/輸出特性5.2I/O端口的應(yīng)用5.3LCM1602字符型液晶顯示模塊5.4雙LED數(shù)碼管動態(tài)顯示模塊的設(shè)計(jì)第5章I/O接口及簡單應(yīng)用5.1.1P1口

圖5.1是P1口其中一位的結(jié)構(gòu)原理圖。P1口由8個這樣的電路組成。圖中的鎖存器起輸出鎖存作用。場效應(yīng)管V1與上拉電阻組成輸出驅(qū)動器,以增大負(fù)載能力。三態(tài)門1是輸入緩沖器,三態(tài)門2在端口操作時使用。5.1I/O端口的輸入/輸出特性為了便于理解,首先介紹三態(tài)門和鎖存器的功能。

(1)三態(tài)門:有三個狀態(tài),即高電平、低電平和高阻狀態(tài)(或稱為禁止?fàn)顟B(tài))。圖5.1中,鎖存器的上端有緩沖器2,要讀取D鎖存器輸出端Q的數(shù)據(jù),就得使這個緩沖器的三態(tài)控制端“讀鎖存器”有效(“1”為有效,“0”為無效,下同)。鎖存器的下端有緩沖器1,要讀取P1.x引腳上的狀態(tài),就必須使“讀引腳”的三態(tài)緩沖器的控制端有效,這樣引腳上的狀態(tài)才會傳輸?shù)絾纹瑱C(jī)的內(nèi)部數(shù)據(jù)總線上。

(2)鎖存器:由D觸發(fā)器構(gòu)成。一個D觸發(fā)器可以保存一位二進(jìn)制數(shù)(即具有保持功能),51單片機(jī)的32根I/O口線都是用一個D觸發(fā)器來構(gòu)成鎖存器的。圖5.1中的D鎖存器,D端是數(shù)據(jù)輸入端,CP是控制端(即時序控制信號輸入端),Q是輸出端,是反向輸出端。當(dāng)D輸入端有一個輸入信號時,如果控制端CP的時序脈沖沒有到來,則輸入端D的數(shù)據(jù)是無法傳輸?shù)捷敵龆薗及反向輸出端Q的。一旦控制端CP的時序脈沖到來,D端輸入的數(shù)據(jù)就會傳輸?shù)絈及Q端。此后,CP的時序脈沖將消失,但輸出端還會保持上次輸入端D的數(shù)據(jù)(即把上次的數(shù)據(jù)鎖存起來了)。當(dāng)下一個CP時序控制脈沖信號到來時,D端的數(shù)據(jù)才再次傳送到Q端,改變Q端的狀態(tài)。

P1口作為通用I/O使用,具有輸出、讀引腳和讀鎖存器三種工作方式。

(1)輸出方式。單片機(jī)執(zhí)行寫P1口的指令,如“MOVP1,#data”時,P1口工作于輸出方式。此時數(shù)據(jù)經(jīng)內(nèi)部總線送入鎖存器鎖存。如果某位的數(shù)據(jù)為1,則該位鎖存器輸出端Q=1,Q=0,使V1截止,從而在引腳P1.x上出現(xiàn)高電平;反之,如果數(shù)據(jù)為0,則Q=0,Q=1,使V1導(dǎo)通,P1.x上出現(xiàn)低電平。

(2)讀引腳方式。單片機(jī)執(zhí)行讀引腳的指令一般都是以I/O端口為源操作數(shù)的指令,如“MOVA,P1”。這時“讀引腳”端有效,控制器打開三態(tài)門1,引腳P1.x上的數(shù)據(jù)經(jīng)三態(tài)門1進(jìn)入芯片的內(nèi)部總線,并送到累加器A。因此,讀引腳輸入時無鎖存功能。當(dāng)單片機(jī)執(zhí)行讀引腳操作時,如果鎖存器原來寄存的數(shù)據(jù)Q=0,那么由于Q=?1,將使V1導(dǎo)通,引腳P1.x被始終鉗位在低電平,無法讀到引腳輸入的高電平。為此,用戶在使用讀引腳指令前,必須先用輸出指令置Q=1、Q=0,使V1截止,這時才能讀到引腳的真實(shí)狀態(tài)。這就是P1被稱為“準(zhǔn)雙向口”的含義(即輸出可直接操作,但輸入前需先置“1”再輸入)。

(3)讀鎖存器方式。MCS-51系列單片機(jī)有不少指令可以直接進(jìn)行端口操作,如ANL、ORL、XRL、JBC、CPL、INC、DEC、DJNZ、MOVPX.x,C、CLRPX.x、SETBPX.x。這些指令的執(zhí)行過程分成“讀—修改—寫”三步,即先將端口的數(shù)據(jù)讀入CPU,在ALU中進(jìn)行運(yùn)算,運(yùn)算結(jié)果再送回端口。執(zhí)行“讀—修改—寫”類指令時,CPU實(shí)際上是通過三態(tài)門2讀回鎖存器Q端的數(shù)據(jù)。這種讀鎖存器的方式是為了避免可能出現(xiàn)的一種錯誤。例如,用一根口線直接去驅(qū)動端口外的一個NPN晶體管基極,當(dāng)向口線寫“1”時,該晶體管導(dǎo)通,導(dǎo)通的三極管集極與發(fā)射極間電壓接近0V,會把端口引腳的高電平拉低,這樣直接讀引腳就會把本來的“1”誤讀為“0”。但若從鎖存器Q端讀,就能避免這樣的錯誤,得到正確的數(shù)據(jù)。也就是說,當(dāng)某位輸出為1時,若有外接器件拉低電平,就有區(qū)別了,讀鎖存器狀態(tài)是1,讀引腳狀態(tài)是0,鎖存器狀態(tài)取決于單片機(jī)試圖輸出什么電平,引腳狀態(tài)則是引腳的實(shí)際電平。因此,當(dāng)作為讀引腳方式使用時,應(yīng)先對該口寫“1”,使場效應(yīng)管截止,再進(jìn)行讀操作,以防止場效應(yīng)管處于導(dǎo)通狀態(tài),使引腳為“0”,而引起誤讀。

P1口能驅(qū)動四個LSTTL負(fù)載。P1每位口最大灌入電流為10?mA,8位總共不能超過15?mA。P1口有內(nèi)部上拉電阻,因此在輸入時,由集電極開路或漏極開路電路驅(qū)動,也無需外接上拉電阻。輸出方式

單片機(jī)執(zhí)行寫P1口的指令,如MOVP1,#data時,P1口工作于輸出方式。此時數(shù)據(jù)data經(jīng)內(nèi)部總線送入鎖存器存儲。如果某位的數(shù)據(jù)為1,則該位鎖存器輸出端

Q=1,=0,使V1截止,從而在引腳P1.x上出現(xiàn)高電平;反之,如果數(shù)據(jù)為0,則Q=0,?=1,在P1.x上出現(xiàn)低電平。

讀引腳方式單片機(jī)有些指令用于讀引腳,它們一般都是以I/O端口為源操作數(shù)的指令,如MOVA,P1。這時控制器打開三態(tài)門1,引腳P1.x上數(shù)據(jù)經(jīng)三態(tài)門1進(jìn)入芯片的內(nèi)部總線,并送到累加器A。因此輸入時無鎖存功能。圖5.1P1口結(jié)構(gòu)5.1.2P3口

圖5.2是P3口其中一位的結(jié)構(gòu)原理圖。P3口為多功能口。圖5.2P3口結(jié)構(gòu)當(dāng)P3口作為第一功能即通用I/O口使用時,第二功能輸出端應(yīng)保持“1”。這時通過與非門3使得P3口的結(jié)構(gòu)完全與P1相同,而且是一個準(zhǔn)雙向I/O口,其功能與P1相同。當(dāng)P3口作為第二功能(見表5.1)使用時,相應(yīng)的口鎖存器Q端必須為“1”,這時與非門3的輸出狀態(tài)完全由第二功能輸出端決定,從而反映第二功能的輸出狀態(tài)。當(dāng)P3口作為第二功能輸入端使用時,相應(yīng)的口鎖存器Q端必須為“0”,從而使場效應(yīng)管截止,第二功能輸入取自緩沖器4得到引腳的輸入信號。表5.1P3口第二功能定義

在應(yīng)用中,P3口的各位如不設(shè)定為第二功能,則自動處于第一功能。在更多情況下,根據(jù)需要可將幾條口線設(shè)置為第二功能,其余口線作為第一功能使用,此時宜采用位操作形式。

圖5.2下方的輸入通道中有兩個緩沖器1和4。第二功能輸入信號取自緩沖器4;而通用輸入信號取自“讀引腳”緩沖器1的輸出端。

P3口的負(fù)載能力和P1口相同,能驅(qū)動四個LSTTL負(fù)載。每位口最大灌入電流為10mA,8位總共不能超過15mA。5.1.3P0口

圖5.3是P0口其中一位的結(jié)構(gòu)原理圖。

P0口的輸出驅(qū)動電路由上拉場效應(yīng)管V2和驅(qū)動場效應(yīng)管V1組成,控制電路包括一個與門、一個非門和多路開關(guān)MUX。

P0口既可以作為通用的I/O口進(jìn)行數(shù)據(jù)的輸入/輸出,也可以作為單片機(jī)系統(tǒng)的地址/數(shù)據(jù)線使用,為此在P0口的電路中有一個多路轉(zhuǎn)接電路MUX。在控制信號的作用下,多路轉(zhuǎn)接電路可以分別接通鎖存器輸出或地址/數(shù)據(jù)線輸出。圖5.3P0口結(jié)構(gòu)

P0口的輸出驅(qū)動電路由上拉場效應(yīng)管V2和驅(qū)動場效應(yīng)管V1組成,控制電路包括一個與門、一個非門和多路控制開關(guān)MUX。

P0口既可以作為通用I/O口進(jìn)行數(shù)據(jù)的輸入/輸出,也可以作為單片機(jī)系統(tǒng)的地址/數(shù)據(jù)線使用,為此在P0口的電路中有一個多路控制開關(guān)MUX。在控制信號的作用下,多路控制電路可以分別接通鎖存器輸出或地址/數(shù)據(jù)線。

P0作為通用I/O口使用時,CPU內(nèi)部發(fā)出控制電平0封鎖與門,即與門的輸出為0(不會受另一條輸入端狀態(tài)的限制),多路控制開關(guān)與接通,上拉場效應(yīng)管V2處于截止?fàn)顟B(tài),此時,輸出級是漏極開路電路,這時,P0口與P1口一樣,有三種工作方式:

(1)輸出方式。當(dāng)寫脈沖加在鎖存器時鐘端CP端上時,與內(nèi)部總線相連的D端數(shù)據(jù)取反后出現(xiàn)在Q端,又經(jīng)輸出V1反相,在P0引腳上出現(xiàn)的數(shù)據(jù)正好是內(nèi)部總線的數(shù)據(jù)。當(dāng)從P0口輸入數(shù)據(jù)時,引腳信息仍經(jīng)輸入緩沖器1進(jìn)入內(nèi)部總線。在輸出數(shù)據(jù)時,由于V2截止,輸出級是漏極開路電路,要使“1”信號能正常輸出,必須外接上拉電阻,上拉電阻的阻值一般為4.7?kΩ~10?kΩ。

(2)讀引腳方式。P0口作為通用I/O口使用時,是準(zhǔn)雙向口。其特點(diǎn)是在輸入數(shù)據(jù)時,應(yīng)先把端口置1,此時鎖存器的Q端為0,使得輸出級的兩個場效應(yīng)管V1、V2均截止,引腳處于懸浮狀態(tài),這時才可作高阻輸入。原因是,從P0口引腳輸入數(shù)據(jù)時,V2一直處于截止?fàn)顟B(tài),引腳上的外部信號既加在三態(tài)緩沖器1的輸入端,又加在V1的漏極。若在此前曾給鎖存器輸出過數(shù)據(jù)0,則V1是導(dǎo)通的,這樣引腳上的電位就始終被鉗位在低電平,使輸入高電平無法讀入。因此,在輸入數(shù)據(jù)時,應(yīng)先向端口引腳寫“1”,使得V1、V2均截止,方可得到正確的引腳信息。

(3)讀鎖存器方式。此時V2截止,與P1口在讀鎖存器方式時“讀—修改—寫”工作過程一樣。當(dāng)P0作為地址/數(shù)據(jù)總線分時復(fù)用功能連接外部存儲器時,由于訪問外部存儲器期間,CPU會自動向P0口的鎖存器寫入FFH,對用戶而言,P0口此時才是真正的三態(tài)雙向口。當(dāng)訪問片外存儲器而需從P0口輸出地址或數(shù)據(jù)信號時,控制信號應(yīng)為高電平“1”,使多路控制開關(guān)MUX把反相器的輸出端與V2連通,為打開與門做好準(zhǔn)備。當(dāng)?shù)刂坊驍?shù)據(jù)為“1”時,經(jīng)反相器使V1截止,而經(jīng)與門又使V2導(dǎo)通,P0.x引腳上出現(xiàn)相應(yīng)的高電平“1”;當(dāng)?shù)刂坊驍?shù)據(jù)為“0”時,經(jīng)反相器使V1導(dǎo)通而V2截止,引腳上出現(xiàn)相應(yīng)的低電平“0”,將地址/數(shù)據(jù)的信號輸出。綜上所述,P0口在有外部擴(kuò)展存儲器時被作為地址/數(shù)據(jù)總線口,此時是一個真正的雙向口;在沒有外部擴(kuò)展存儲器時,P0口也可作為通用I/O接口,但必須接上拉電阻,此時是一個準(zhǔn)雙向口。另外,P0口能驅(qū)動八個LSTTL負(fù)載。P0每位口最大灌入電流為10mA,8位總共不能超過26mA。5.1.4P2口

圖5.4是P2口其中一位的結(jié)構(gòu)原理圖。P2口既可以作為通用I/O口使用也可作為地址總線使用,所以它的位結(jié)構(gòu)比P1口多了一個多路控制開關(guān)MUX。

當(dāng)P2口作為通用I/O口使用時,多路開關(guān)MUX倒向鎖存器的輸出端Q,構(gòu)成一個準(zhǔn)雙向口。其功能與P1口相同,有輸出、讀引腳、讀鎖存器三種工作方式。圖5.4P2口結(jié)構(gòu)

P2口的另一功能是作系統(tǒng)擴(kuò)展的地址總線口。當(dāng)單片機(jī)從片外ROM中取指令,或者執(zhí)行訪問片外RAM、片外ROM的指令時,多路開關(guān)MUX接通“地址”,P2口出現(xiàn)程序指針PC的高8位地址或數(shù)據(jù)指針DPTR的高8位地址。以上操作對鎖存器的內(nèi)容不受影響,所以,取指令或訪問外部存儲器結(jié)束后,由于多路開關(guān)MUX又與鎖存器Q端接通,引腳上將恢復(fù)原來的數(shù)據(jù)。

P2口的負(fù)載能力和P1口相同,能驅(qū)動四個LSTTL負(fù)載。5.2.1I/O的簡單控制

下面舉兩個例子說明I/O的簡單控制。

例1:編制一個燈光循環(huán)閃爍程序。通過P3口連接八個發(fā)光二極管,其中一個發(fā)光二極管閃爍三次后,轉(zhuǎn)移到下一個發(fā)光二極管閃爍三次,如此循環(huán)不止。電路原理圖如圖5.5

所示。5.2I/O端口的應(yīng)用圖5.5燈光循環(huán)閃爍電路分析:八個發(fā)光二極管LED連接在P3口上。要讓發(fā)光二極管閃爍,只需隔一段時間,P3口輸出的高低電平轉(zhuǎn)換一次。為避免發(fā)光二極管燒壞,需加430Ω左右的限流電阻。

程序如下:此例中,用到一個430Ω左右的限流電阻R,其計(jì)算公式如下:R

=

式中:UCC為電源電壓;ULED為發(fā)光二極管壓降(取1.2~1.8V);UDRI為驅(qū)動器壓降(取0.3~0.5V);ILED為發(fā)光二極管工作電流(取8~20mA)。本例中取UCC=5V,ULED=1.3V,UDRI未使用,ILED=8mA,因此≈430Ω

ILED為發(fā)光二極管工作電流,其值越大,二極管越亮。為了提高亮度,可減少限流電阻,常用限流電阻的阻值為200~500Ω。也可以選用驅(qū)動器件以提供更大的電流,常用的驅(qū)動器件有74LS06、74LS07、小功率三極管等。5.2.2LED數(shù)碼管顯示

1.LED顯示器及其工作原理

LED有著顯示亮度高、響應(yīng)快的特點(diǎn)。最常用的是七段LED顯示器,又稱數(shù)碼管。七段LED顯示器內(nèi)部由七個條形發(fā)光二極管和一個小圓點(diǎn)發(fā)光二極管組成。這種顯示器分共陽極和共陰極兩種:共陽極LED顯示器的發(fā)光二極管的所有陽極連接在一起,為公共端,如圖5.6(a)所示;共陰極LED顯示器發(fā)光二極管的所有陰極連接在一起,為公共端,如圖5.6(b)所示。單個數(shù)碼管的引腳配置如圖5.6(c)所示。其中com為公共端。圖5.6LED顯示器

(a)共陽極;(b)共陰極;(c)數(shù)碼管引腳表5.2LED數(shù)碼管段碼表續(xù)表

2.應(yīng)用單片機(jī)I/O口的LED數(shù)碼管顯示接口及程序設(shè)計(jì)

數(shù)碼管的接口有靜態(tài)顯示接口和動態(tài)顯示接口之分。

靜態(tài)顯示接口為固定顯示方式,無閃爍,其電路可采用一個并行口接一個數(shù)碼管。采用這種接法,n個數(shù)碼管就需要n個8位的接口,占用資源多。將MCS-51單片機(jī)的四個口全部利用也只能接四個LED數(shù)碼管。這里只舉一個用P1口和P3口顯示2位數(shù)的例子,圖5.7為電路原理圖,程序初始顯示為00,每秒鐘加1,至99,如此循環(huán)。圖5.7兩位LED數(shù)碼管靜態(tài)顯示程序清單:動態(tài)顯示采用各數(shù)碼管循環(huán)顯示的方法。當(dāng)循環(huán)顯示的時間間隔較小時(如10ms),利用人眼的暫留特性,看不出閃爍的現(xiàn)象。這種顯示方式是將各個段碼管的各段腳分別并接在一個端口上,輸出段碼;各個數(shù)碼管的公共端分別由其它端口控制,完成數(shù)位的選擇,控制各數(shù)碼管輪流點(diǎn)亮。圖5.8是2位數(shù)碼管動態(tài)顯示的簡單例子。因公共端的電流較大(最大為點(diǎn)亮8個發(fā)光二極管所需要的電流),加了一個三極管作為驅(qū)動。因動態(tài)顯示,限流電阻選200Ω。程序?qū)@示“86”。圖5.8兩位LED數(shù)碼管動態(tài)顯示圖5.9兩位數(shù)碼管動態(tài)顯示程序框圖

以上程序Proteus仿真運(yùn)行結(jié)果如圖5.10所示,其中Proteus所使用的元件見表5.3。圖5.10兩位LED數(shù)碼管動態(tài)仿真圖表5.3元件列表元件編號元件名Proteus中元件名值U151單片機(jī)AT89C51LED共陽極兩位數(shù)碼管7SEG-MPX-CAR?×?8排阻R?×?8200ΩR1~R4電阻RES2kΩ~5kΩV1、V2小功率三極管NPN5.2.3鍵盤

鍵盤是由若干個按鍵組成的,它是單片機(jī)最簡單的輸入設(shè)備。操作員通過鍵盤輸入數(shù)據(jù)命令,實(shí)現(xiàn)簡單的人機(jī)對話。按鍵就是一個簡單的開關(guān),當(dāng)按鍵按下時,相當(dāng)于開關(guān)閉合;當(dāng)按鍵松開時,相當(dāng)于開關(guān)斷開。按鍵在閉合和斷開時,會存在抖動現(xiàn)象。按鍵的抖動時間一般為5~10ms,抖動可能造成一次按鍵的多次處理問題。應(yīng)采用措施消除抖動的影響。單片機(jī)應(yīng)用常采用軟件延時10ms的辦法來消除抖動的影響。如圖5.11所示,當(dāng)單片機(jī)檢測到有鍵按下時,先延時10ms,然后再檢測按鍵的狀態(tài),若仍是閉合狀態(tài),則認(rèn)為真正有鍵按下。當(dāng)需要檢測到按鍵釋放時,也需做同樣的處理。圖5.11按鍵抖動的波形

1.獨(dú)立式鍵盤

獨(dú)立式鍵盤中,每個按鍵占用一根I/O口線,每個按鍵電路相對獨(dú)立,如圖5.12所示,I/O口通過按鍵與地連接,鍵閉合時,I/O口與地接通。在讀取I/O口狀態(tài)時,需先向I/O口送“1”。如I/O口無內(nèi)部上拉電阻需外部加上拉電阻。

下面是一個處理圖5.12的獨(dú)立式鍵盤的程序,在檢測按鍵是否按下時,采用了軟件延時消抖的處理,但未加鍵釋放時的消抖處理。圖5.12

獨(dú)立式鍵盤電路原理圖程序如下:

2.行列式鍵盤

獨(dú)立式鍵盤只適合按鍵較少的場合,否則占用的端口太多。當(dāng)按鍵較多時,可采用行列式鍵盤電路。但行列式鍵盤的管理程序較復(fù)雜,需要采用鍵盤掃描技術(shù)。常用的鍵盤掃描方式有掃描法、線反轉(zhuǎn)法、狀態(tài)矩陣法等。

本節(jié)只介紹線反轉(zhuǎn)法(Line-Reverse),圖5.13描述了其編程原理。圖5.13線反轉(zhuǎn)法接線與鍵號圖線反轉(zhuǎn)法掃描的步驟如下:

(1)從P2口的高4位輸出低電平(列),低4位輸出高電平(行),即MOVP2,#0FH,再從P2口讀取鍵盤狀態(tài)。這時,如低4位中有一位出現(xiàn)“0”,說明此行中有鍵按下。各行有鍵按下時,從P2口讀取的數(shù)值依次為0EH、0DH、0BH、07H。

(2)從P2口的低4位輸出低電平(行),高4位輸出高電平(列),即MOVP2,#0F0H,再從P2口讀取鍵盤狀態(tài)。這時,如高4位中有一位出現(xiàn)“0”,說明此列中有鍵按下。各列有鍵按下時,從P2口讀取的數(shù)值依次為E0H、D0H、B0H、70H。

(3)將兩次讀取的特征值根據(jù)圖5.13進(jìn)行組合,即采用將兩次讀取的特征值“或”的方法,獲得當(dāng)前“按鍵的特征碼”。以下是按此過程編寫的程序:

ORG0000H

MOV30H,#0FFH ;最終獲得的鍵號0~15存放在30H,如 ;(30H)=0FFH,表示無按鍵按下

MAIN:MOVP2,#0FH ;線反轉(zhuǎn)法掃描中的第(1)步

MOVA,P2

MOVP2,#0F0H ;線反轉(zhuǎn)法掃描中的第(2)步

MOVB,P2

ORLA,B ;線反轉(zhuǎn)法掃描中的第(3)步

KEY0:CJNEA,#0EEH,KEY1 ;特征碼如為“0EEH”,鍵號為0

MOV30H,#00H

KEY1:CJNEA,#0DEH,KEY2 ;特征碼如為“0DEH”,鍵號為1

MOV30H,#01H

KEY2:CJNEA,#0BEH,KEY3 ;特征碼如為“0BEH”,鍵號為2

MOV30H,#02H

KEY3:CJNEA,#7EH,KEY4 ;特征碼如為“07EH”,鍵號為3

MOV30H,#03H

KEY4:CJNEA,#0EDH,KEY5 ;特征碼如為“0EDH”,鍵號為4

MOV30H,#04H

KEY5:CJNEA,#0DDH,KEY6 ;特征碼如為“0DDH”,鍵號為5

MOV30H,#05H

KEY6:CJNEA,#0BDH,KEY7 ;特征碼如為“0BDH”,鍵號為6

MOV30H,#06H

KEY7:CJNEA,#7DH,KEY8 ;特征碼如為“07DH”,鍵號為7

MOV30H,#07H

KEY8:CJNEA,#0EBH,KEY9 ;特征碼如為“0EBH”,鍵號為8

MOV30H,#08H

KEY9:CJNEA,#0DBH,KEY10 ;特征碼如為“0DBH”,鍵號為9

MOV30H,#09H

KEY10:CJNEA,#0BBH,KEY11 ;特征碼如為“0BBH”,鍵號為0AH=10

MOV30H,#0AH

KEY11:CJNEA,#7BH,KEY12 ;特征碼如為“07BH”,鍵號為0BH=11

MOV30H,#0BH

KEY12:CJNEA,#0E7H,KEY13 ;特征碼如為“0E7H”,鍵號為0CH=12

MOV30H,#0CH

KEY13:CJNEA,#0D7H,KEY14 ;特征碼如為“0D7H”,鍵號為0DH=13

MOV30H,#0DH

KEY14:CJNEA,#0B7H,KEY15 ;特征碼如為“0B7H”,鍵號為0EH=14

MOV30H,#0EH

KEY15:CJNEA,#77H,KEYEND ;特征碼如為“077H”,鍵號為0FH=15

MOV30H,#0FH

KEYEND:MOVP3,30H;將鍵號送P2口,由BCD碼LED數(shù)碼管顯示

AJMPMAIN

END圖5.144×4鍵盤的仿真效果圖接在P3口的BCD碼LED數(shù)碼管顯示按鍵的鍵號,其中BCD碼LED數(shù)碼管(在Proteus中的元件名為7SEG-BCD)有四根數(shù)據(jù)線,對應(yīng)二進(jìn)制的4位,可以不經(jīng)譯碼顯示0~F。如它的四只引腳為0111,則顯示“7”;若為1010,則顯示“A”。在Proteus中可方便地用兩個BCD數(shù)碼管顯示一個字節(jié)的數(shù)據(jù)而不需譯碼,調(diào)試程序非常方便,但在實(shí)際電路中很少使用。 5.3LCM1602字符型液晶顯示模塊

LCM是將LCD(LiquidCrystalDisplay,液晶顯示器)、驅(qū)動和控制電路組合成的模塊(LCM,LiquidCrystaldisplayMould)。LCM的種類繁多,最常用的有段式LCM、字符型LCM和點(diǎn)陣型LCM。段式LCM與LED數(shù)碼管類似,只是每一段由液晶段組成。字符型的每個字符一般由5?×?7點(diǎn)陣組成(所以又稱為“點(diǎn)陣字符型”),可以顯示數(shù)字和英文字母、標(biāo)點(diǎn)符號等,一般自帶顯示符號庫。點(diǎn)陣型LCM全部由點(diǎn)陣的液晶組成(如64?×?64、128?×?64、256?×?128、320?×?240等),可以顯示漢字和圖形。本節(jié)介紹最常用的字符型LCM1602模塊(有時也稱為LCD1602),如圖5.15所示,其中圖(a)為引腳圖,圖(b)為LCM實(shí)物照片的正面,圖(c)為其背面。圖5.15LCM1602液晶顯示器及實(shí)物圖5.3.1字符型LCM1602介紹

1.LCM1602的內(nèi)部寄存器

LCM1602帶有以下內(nèi)部寄存器。

(1)具有字符發(fā)生器ROM(CharacterGeneratorROM,CGROM),用來寄存固定的字符圖形,可顯示192個5?×?7點(diǎn)陣字符,如表5.4所示(絕大多數(shù)與ASCII碼相同)??梢钥闯?,1602顯示的數(shù)字和字母的碼值,與ASCII碼表中的數(shù)字和字母的碼值相同。

(2)具有64B的自定義字符RAM(CharacterGeneratorRAM,CGRAM),用來寄存用戶自定義的字符圖形,可自行定義8個5?×?7點(diǎn)陣字符。

(3)具有80B的數(shù)據(jù)顯示存儲器RAM(DisplayDataRAM,DDRAM),用來寄存待顯示的字符代碼。表5.4LCM1602顯示字符表2.LCM1602引腳功能LCM1602引腳功能見表5.5。3.LCM1602顯示器地址

LCM1602能顯示兩行,每行16個字符。需要顯示的字符需存入DDRAM,每個顯示字符與DDRAM地址的映射關(guān)系如下(用十六進(jìn)制表示):

也就是說,若想在LCD1602屏幕的第一行第一列顯示一個“A”字,則只需向DDRAM的80H地址寫入“A”字的代碼“01000001?=?41H”(如表5.4所示,與ASCII碼相同)即可。但寫入時要按LCD模塊的指令格式來進(jìn)行。

4.LCM1602的指令集對LCM1602的操作,就是對它內(nèi)部寄存器的操作。其寄存器的選擇控制如下:LCM1602的指令共11條。(1)清屏指令。指令字描述如下:功能:①清屏,即將DDRAM的內(nèi)容全部填入“空白”的ASCII碼20H;②光標(biāo)歸位,即將光標(biāo)撤回液晶顯示屏的左上方;③將地址計(jì)數(shù)器(AC)的值設(shè)為0。

(2)光標(biāo)歸位指令。指令字描述如下:功能:①把光標(biāo)撤回到顯示器的左上方;

?②把地址計(jì)數(shù)器(AC)的值設(shè)置為0;

?③保持DDRAM的內(nèi)容不變。

(3)模式設(shè)置指令。指令字描述如下:

功能:設(shè)定每次寫入1位數(shù)據(jù)后光標(biāo)的移位方向,并且設(shè)定每次寫入的一個字符是否移動。參數(shù)設(shè)定的情況如下:功能:①讀取忙信號BF(BusyFlag)的內(nèi)容,BF?=?1表示液晶顯示器忙,暫時無法接收單片機(jī)送來的數(shù)據(jù)或指令;BF=0表示液晶顯示器可以接收單片機(jī)送來的數(shù)據(jù)或指令。②讀取地址計(jì)數(shù)器(AC)的內(nèi)容。

(10)數(shù)據(jù)寫入DDRAM或CGRAM指令。指令字描述如下:功能:①將字符碼寫入DDRAM,以使液晶顯示屏顯示相對應(yīng)的字符。

②將使用者自己設(shè)計(jì)的圖形存入CGRAM。

(11)從CGRAM或DDRAM讀出數(shù)據(jù)的指令。指令字描述如下:功能:讀取DDRAM或CGRAM中的內(nèi)容?;静僮鲿r序如下:5.LCM1602的時序

LCM1602的時序如圖5.16、圖5.17和表5.6所示。不同廠家的LCM1602的時序可能略有差異。圖5.16LCM1602讀操作時序圖5.17LCM1602寫操作時序表5.6LCM1602時序參數(shù)5.3.2LCM1602與單片機(jī)的接口

LCM1602與51單片機(jī)的接口原理圖如圖5.18所示,其中10kΩ可調(diào)電阻的作用是調(diào)節(jié)LCD的背光亮度。P0口接了一個10kΩ的排阻,此排阻的內(nèi)部結(jié)構(gòu)和實(shí)物照片如圖5.19所示,它是作為P0口的上拉電阻使用的。圖5.18LCM1602與51單片機(jī)的接口原理圖圖5.1910kΩ排阻的內(nèi)部結(jié)構(gòu)和實(shí)物5.3.3LCM1602顯示模塊的應(yīng)用

1.模塊化編程模塊化編程是一種軟件設(shè)計(jì)方法。各模塊程序分別編寫、編譯和調(diào)試,最后模塊一起連接/定位,可以把一個復(fù)雜的程序分解成若干個簡單的、功能單一的程序模塊,每個模塊完成一個明確的任務(wù),實(shí)現(xiàn)某個具體功能,如對數(shù)據(jù)的處理、鍵盤管理、顯示、A/D轉(zhuǎn)換、D/A轉(zhuǎn)換等。模塊化編程有以下優(yōu)點(diǎn):

(1)程序共享,即一個模塊中的程序可以被其他模塊引用。

(2)模塊化編程使得要解決的問題與特定的模塊分離,很容易發(fā)現(xiàn)程序的錯誤,大大方便了程序的調(diào)試。模塊化編程將一個大的程序按功能分割成一些小模塊。各模塊相對獨(dú)立、功能單一、結(jié)構(gòu)清晰、接口簡單,大大降低了程序設(shè)計(jì)的復(fù)雜性。模塊化編程縮短了程序開發(fā)周期,避免了程序開發(fā)的重復(fù)勞動,易于維護(hù)和功能擴(kuò)充。

2.LCD1602.a51程序模塊的框架匯編語言的模塊化程序設(shè)計(jì)采用可重定位的匯編器(ASM51),要牽涉到許多宏匯編的偽指令。本節(jié)只介紹能完成匯編語言模塊設(shè)計(jì)的基本偽指令的兩種框架模式。

1)聲明公用子程序框架下面先給出一個LCD1602.a51程序模塊的聲明公用子程序框架,并給出詳細(xì)的解釋。

1NAMELCD1602

2;LCM1602與89C51接口的定義:

3...

4PUBLICLCD_INITIAL ;聲明LCD_INITIAL為公用子程序

5?PR?LCD_INITIALSEGMENTCODE

6RSEG?PR?LCD_INITIAL

7LCD_INITIAL:

8...

9PUBLICLCD_PRINT_CHAR;聲明LCD_PRINT_CHAR為公用子程序

10?PR?LCD_PRINT_CHAR SEGMENTCODE

11RSEG?PR?LCD_PRINT_CHAR

12LCD_PRINT_CHAR:

13...

14PUBLICLCD_PRINT_S ;聲明LCD_PRINT_S為公用子程序

15?PR?LCD_PRINT_SSEGMENTCODE

16RSEG?PR?LCD_PRINT_S

17LCD_PRINT_S:

18...

19CHECK_BUSY: ;查詢忙標(biāo)志信號子程序

20...

21WRITE_COM: ;寫指令到LCM1602子程序

22...

23WRITE_DATA: ;寫數(shù)據(jù)到LCM1602子程序

24...

25LCD_CLS: ;清除顯示屏子程序

26...

27DELAY: ;延時子程序

28...

29END解釋如下:第1行:通常會把一個程序分成多個模塊,每個模塊的源代碼放在一個文件中,該文件的文件名就是模塊名。本模塊的文件名為LCD1602.a51,其后綴可以是a51或asm,但為了與主程序區(qū)別常用a51,主程序的后綴用asm。NAME描述了模塊名。不過NAME不是必需的偽指令,可以省略。第2、3行,描述本模塊中LCM1602與89C51接口管腳的定義。第4行,聲明LCD_INITIAL為公用子程序。

PUBLIC偽指令說明本模塊中的某些符號(包括子程序的名)是公共的,即這些符號可以提供給將被連接在一起的其他模塊使用。第5行,聲明LCD_INITIAL的段名。

SEGMENT

用于聲明一個段名,其前面的符號表示段名,后面的符號為段的類型,如CODE為程序代碼段,DATA代表內(nèi)部RAM段。?PR?為程序段名的前綴,后面緊跟著程序名。第6行,用RSEG說明后面的段?PR?LCD_INITIAL是可重定位的。

RSEGxxx聲明以下的語句應(yīng)位于可重定位的xxx段,在編譯時不進(jìn)行定位,只有在鏈接時才確定其固定地址。如果xxx是程序名,也要用??PR??作為程序段名的前綴。第7、8行,子程序LCD_INITIAL的匯編代碼。第9~13行,關(guān)于公用子程序LCD_PRINT_CHAR的聲明和匯編代碼。第14~18行,關(guān)于公用子程序LCD_PRINT_S的聲明和匯編代碼。第19~28行,模塊中其他子程序的匯編代碼。由于沒有用PUBLIC進(jìn)行聲明,所以只能在本模塊的文件中引用,不能被其他模塊(包括主程序)引用。第29行,用END標(biāo)志一個模塊文件的結(jié)束。

2)包含模塊程序框架按4.1.1節(jié)所提供的格式編寫所需要的子程序模塊,但不要用偽指令“ORG”指定地址。然后主程序的最后用宏指令

$INCLUDE(xxxx.a51)把xxxx.a51包含進(jìn)去,就可以在主程序中引用xxxx.a51中的所有子程序。本書第12章12.2.6節(jié)就采用了這種包含模塊程序的方法,讀者可以參考。包含模塊程序的框架形式把模塊中所有的子程序都包含了,而聲明公用子程序框架僅就需要使用的子程序進(jìn)行聲明,使程序更為清晰,本書大多采用這種框架。

3.LCD1602.a51模塊程序清單

LCD1602.a51的程序清單如下,清單中對所有公用子程序都給出了詳細(xì)的注釋,包括如何使用的舉例。這是一個模塊程序的范例,希望讀者學(xué)習(xí)這種風(fēng)格。模塊中對LCM1602所進(jìn)行的指令、數(shù)據(jù)的操作,是按LCM1602的時序(見圖5.16、圖5.17和表5.6)完成的。

NAMELCD1602;--------------------------------------------------------------;模塊名:LCD1602.a51;功能:LCM1602的驅(qū)動模塊;初始化LCM1602、在指定的位置顯示字符或字符串;--------------------------------------------------------------;LCM1602與89C51接口的定義:

RSEQUP2.0

R_WEQUP2.1

EEQUP2.2

DB0_DB7EQUP0;--------------------------------------------------------------;子程序名:LCD_INITIAL;功能:初始化LCM1602;--------------------------------------------------------------

PUBLICLCD_INITIAL ;聲明LCD_INITIAL為公用子程序

?PR?LCD_INITIALSEGMENTCODE;注意:LCD_INITIAL前加了一個“?PR?”

RSEG?PR?LCD_INITIAL

LCD_INITIAL:

MOVA,#38H ;顯示功能

ACALLWRITE_COM

MOVA,#0CH ;顯示開關(guān)控制

CALLWRITE_COM

ACALLLCD_CLS ;清顯示屏

RET;--------------------------------------------------------------;子程序名:LCD_PRINT_CHAR;功能:在指定的位置顯示字符;參數(shù):A—顯示的位置,第1行為80H~8FH,第2行為C0H~CFH;R5—顯示數(shù)據(jù)的個數(shù);R1—顯示數(shù)據(jù)的首地址;注意:顯示的數(shù)據(jù)必須用ASCII碼表示;占用寄存器:A、DPTR、R1、R5;Examp:在第2行第5~7列顯示“156”;MOVA,#0C5H ;在第2行第6列開始顯示;MOVR5,#3 ;要顯示3個字符;MOVR1,#20H ;第1個字符存放的首地址為20H;MOV20H,#31H ;“1”的ASCII碼為31H;MOV21H,#35H ;“5”的ASCII碼為35H;MOV22H,#36H ;“6”的ASCII碼為36H;ACALLLCD_PRINT_CHAR ;調(diào)用顯示字符子程序;--------------------------------------------------------------

PUBLICLCD_PRINT_CHAR;聲明LCD_PRINT_CHAR為公用子程序

?PR?LCD_PRINT_CHAR SEGMENTCODE

RSEG?PR?LCD_PRINT_CHAR

LCD_PRINT_CHAR:

ACALLWRITE_COM

LOOP:MOVA,@R1

ACALLWRITE_DATA

INCR1

MOVA,R1

DJNZR5,LOOP

RET

;--------------------------------------------------------------;功能:在指定的位置顯示字符串;參數(shù):A—顯示的位置,第1行為80H~8FH,第2行為C0H~CFH;DPTR—顯示固定字符串表格首地址;占用寄存器:A、DPTR;Examp:在第2行第0~15列顯示“WelcomeToStuelab”;MOVA,#0C0H;MOVDPTR,#TABLE;LCALLLCD_PRINT_S;TABLE:DB"WelcomeToStuelab",00H;;注意:定義的字符串后要加“00H”。;--------------------------------------------------------------

PUBLICLCD_PRINT_S ;聲明LCD_PRINT_S為公用子程序

?PR?LCD_PRINT_SSEGMENTCODE

RSEG?PR?LCD_PRINT_S

LCD_PRINT_S:

ACALLWRITE_COM

MOVR1,#00H

LOOPS: CLRA

MOVCA,@A+DPTR

ACALLWRITE_DATA

INCDPTR

CLRA

MOVCA,@A+DPTR

CJNEA,#00H,LOOPS

RET

CHECK_BUSY: ;查詢忙標(biāo)志信號子程序

PUSHACC

BUSY_LOOP:

CLRE

SETBR_W

CLRRS

SETBE

ACALLDELAY;

MOVA,DB0_DB7

CLRE

JBACC.7,BUSY_LOOP

POPACC

ACALLDELAY

RET

WRITE_COM: ;寫指令到LCM1602子程序

ACALLCHECK_BUSY

CLRE

CLRRS

CLRR_W

SETBE

ACALLDELAY

MOVDB0_DB7,A

CLRE

RET

WRITE_DATA: ;寫數(shù)據(jù)到LCM1602子程序

ACALLCHECK_BUSY

CLRE

SETBRS

CLRR_W

SETBE

ACALLDELAY

MOVDB0_DB7,A

CLRE

RET

LCD_CLS:MOVA,#01H ;清除顯示屏子程序

ACALLWRITE_COM

RET

DELAY: MOVR6,#5 ;延時子程序

DELAY1: MOVR7,#0FFH

DJNZR7,$

DJNZR6,DELAY1

RET

END

4.LCM1602驅(qū)動程序的應(yīng)用下面是LCM1602在指定的位置顯示數(shù)據(jù)“156”的演示程序的主程序清單。程序中對所引用的公共子程序用“EXTRN”進(jìn)行了聲明。

EXTRN是宏匯編的偽指令,它說明本程序中所用的符號(包括子程序的名)是外部的,但這些符號要在將被連接在一起的其他模塊中定義并用PUBLIC聲明過。;------------------------------------------------;文件名:LCD1602demo.asm;功能:LCM1602在指定的位置顯示數(shù)據(jù)的演示程序的主程序;------------------------------------------------

EXTRN CODE(LCD_INITIAL) ;對需調(diào)用的LCD1602模塊中公用子程序的聲明

EXTRN CODE(LCD_PRINT_S)

EXTRN CODE(LCD_PRINT_CHAR)

ORG0000H

AJMPMAIN

ORG0030H

MAIN: ACALLLCD_INITIAL;LCM1602初始化

MOVA,#81H ;在第1行第1列顯示字符串

MOVDPTR,#TABLE ;字符串首址放DPTR

ACALLLCD_PRINT_S;調(diào)用顯示字符串子程序

MOVA,#0C6H ;在第2行第6列顯示

MOVR5,#3 ;顯示3個字符

MOVR1,#20H ;第1個字符存放的首地址為20H

MOV20H,#31H ;顯示“1”的ASCII碼

MOV21H,#35H ;顯示“5”的ASCII碼

MOV22H,#36H ;顯示“6”的ASCII碼

ACALLLCD_PRINT_CHAR ;調(diào)用顯示字符子程序

SJMP$

TABLE: DB“THENU

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論