版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第3章輸入口及其應(yīng)用3.18051的輸入/輸出口3.2控制轉(zhuǎn)移類指令3.3輸入電路設(shè)計(jì)3.4設(shè)計(jì)課目與演練——按鍵控制LED小結(jié)
習(xí)題
本章重點(diǎn)講述輸入/輸出(I/O)口的內(nèi)部結(jié)構(gòu),并把輸入/輸出口與特殊功能寄存器、控制信號等之間建立關(guān)聯(lián),結(jié)合跳轉(zhuǎn)指令和端口輸入電路設(shè)計(jì),給出了實(shí)例。第3章、第4章和第5章內(nèi)容的內(nèi)在聯(lián)系比較密切,都在講輸入/輸出口及其應(yīng)用,但側(cè)重點(diǎn)有所不同。本章重點(diǎn)是講I/O口的內(nèi)部結(jié)構(gòu)和輸入電路的設(shè)計(jì)與保護(hù),第4章重點(diǎn)講外部電路和驅(qū)動(dòng),第5章把輸入/輸出合起來講應(yīng)用。其中外設(shè)的擴(kuò)展方法和地址確定是對2.4節(jié)存儲(chǔ)器擴(kuò)展方法的進(jìn)一步講解和應(yīng)用。3.18051的輸入/輸出口
MCS—51單片機(jī)共有4個(gè)8位的并行I/O口,分別記做P0、P1、P2、P3,共32個(gè)端子。這4個(gè)端口為MCS—51單片機(jī)與外部器件或外部設(shè)備進(jìn)行信息(數(shù)據(jù)、地址、控制信號)交換提供了多功能的輸入/輸出通道,也為MCS—51單片機(jī)擴(kuò)展外部功能,構(gòu)成應(yīng)用系統(tǒng)提供了必要的條件;在內(nèi)部RAM中有特殊功能寄存器與其對應(yīng),并且具有位尋址功能。3.1.1輸入/輸出口的內(nèi)部結(jié)構(gòu)與操作
MCS—51單片機(jī)的4個(gè)并行I/O口中每一位的結(jié)構(gòu)如圖3-1所示。由于4個(gè)端口的功能有所不同,因此,它們在電路結(jié)構(gòu)上也有區(qū)別,但其工作原理基本相似。從圖3-1可以看出,端口的每一位都有一個(gè)鎖存器、一個(gè)輸出驅(qū)動(dòng)器(場效應(yīng)管)和一個(gè)輸入數(shù)據(jù)緩沖器。其中鎖存器為D型觸發(fā)器,在CPU的控制下,可對P0~P3口的鎖存器進(jìn)行讀—修改—寫操作和對端子進(jìn)行讀寫操作。
1.?P0口
1)?P0口作為通用I/O口使用當(dāng)MCS—51單片機(jī)的CPU對片內(nèi)存儲(chǔ)器和I/O口進(jìn)行讀寫時(shí),由硬件置控制線為0,使開關(guān)MUX處于圖3-1(a)所示位置,輸出級V2與鎖存器端相連。同時(shí)使上拉場效應(yīng)管V1處于截止?fàn)顟B(tài),此時(shí)輸出級是開漏電路,P0口作一般的I/O口使用。
P0口用作輸出。在CPU執(zhí)行輸出指令時(shí),寫脈沖加到鎖存器的CLK上,與內(nèi)部總線相連的D端數(shù)據(jù)取反后出現(xiàn)在端上,再經(jīng)V2反相,出現(xiàn)在P0口上的數(shù)據(jù)正好是內(nèi)部總線的數(shù)據(jù)。圖3-1輸入/輸出口的內(nèi)部結(jié)構(gòu)
P0口用作輸入。在CPU執(zhí)行端口輸入指令時(shí),讀端子信號打開下部的緩沖器,P0口上的數(shù)據(jù)經(jīng)緩沖器讀到內(nèi)部數(shù)據(jù)總線上。
2)?P0口作為地址/數(shù)據(jù)總線使用當(dāng)MCS—51單片機(jī)進(jìn)行外部存儲(chǔ)器擴(kuò)展,CPU對片外存儲(chǔ)器進(jìn)行讀寫時(shí),由硬件置控制線為1,開關(guān)MUX撥向上方,此時(shí)P0口作地址/數(shù)據(jù)總線使用。
P0口用作輸出地址/數(shù)據(jù)總線使用。在MCS—51單片機(jī)與外部擴(kuò)展存儲(chǔ)器或外圍器件組成的系統(tǒng)中,P0口輸出低8位地址或數(shù)據(jù)。此時(shí)MUX將CPU內(nèi)部地址/數(shù)據(jù)總線經(jīng)反相后與V2相連,這樣,由圖可以看出,V1與V2構(gòu)成推拉式輸出電路,從而增大了負(fù)載能力。
?由P0口輸入數(shù)據(jù)。當(dāng)讀端子信號有效時(shí),打開輸入緩沖器,使輸入端口的數(shù)據(jù)進(jìn)入內(nèi)部總線。綜上所述,當(dāng)P0作通用I/O口輸出時(shí),輸出級屬開漏電路,因此必須外接上拉電阻,才有高電平輸出。P0口外接上拉電阻的電路如圖3-2所示,電阻值一般在5.1~10kΩ范圍內(nèi)選擇。如果8位都需要上拉電阻,則可以使用排阻,如圖3-3所示。注意:圖中標(biāo)注的節(jié)點(diǎn)為P0.0、P0.1、…、P0.7,是強(qiáng)調(diào)把P0口作為I/O口使用。P0口作為地址/數(shù)據(jù)使用時(shí),常標(biāo)注為D0、D1、D2、…、D7,此時(shí)P0口不需要上拉電阻。因此,P0口在作普通I/O口使用時(shí),其不是一個(gè)真正的雙向I/O口,而是準(zhǔn)雙向;但是在作地址/數(shù)據(jù)總線時(shí),它是一個(gè)真正的雙向口,并且可以驅(qū)動(dòng)8個(gè)LSTTL負(fù)載。圖3-2外接上拉電阻的電路圖3-3都使用上拉電阻
2.?P1口
P1口一般用作通用I/O口,可用于位處理,各位都可以單獨(dú)輸入或輸出。
P1口同樣是準(zhǔn)雙向的I/O口,當(dāng)需要某位先輸出然后再輸入的時(shí)候,應(yīng)該在輸入操作前加一條輸出1的指令,然后再輸入信息才正確。對于復(fù)位后,由于各位鎖存器均置為1,端輸出為0,下拉場效應(yīng)管截止,因此,各位用作輸出或者輸入都是正確的。
輸出1時(shí),端為0,場效應(yīng)管截止,此時(shí),P1.x靠上拉電阻輸出1,這個(gè)時(shí)候驅(qū)動(dòng)能力比較差。所以,當(dāng)輸出1而需要帶動(dòng)較大負(fù)載時(shí),常常需要外加驅(qū)動(dòng)電路(詳細(xì)見第4章)。
輸出0時(shí),端為1,場效應(yīng)管打開,此時(shí),P1.x強(qiáng)制輸出0,這個(gè)時(shí)候驅(qū)動(dòng)能力較強(qiáng)。因此,當(dāng)輸出為0時(shí),一般不需要外加驅(qū)動(dòng)。正是基于這點(diǎn)考慮,驅(qū)動(dòng)LED時(shí)常用的接法如圖3-4所示。
對于AT89S52,P1口的某些引腳還可以有第二功能。P1.0引腳用于定時(shí)/計(jì)數(shù)器2的外部事件計(jì)數(shù)輸入端口,P1.1引腳用于定時(shí)/計(jì)數(shù)器2的外部控制端口。P1.5~P1.7還用于片內(nèi)Flash的編程。圖3-4驅(qū)動(dòng)LED的方法
3.?P2口
P2口的位結(jié)構(gòu)與P0口類似,輸出驅(qū)動(dòng)部分與P1口類似,但多了一個(gè)轉(zhuǎn)換控制部分。當(dāng)CPU對片內(nèi)存儲(chǔ)器和I/O口進(jìn)行讀寫時(shí),內(nèi)部硬件使MUX接通Q端,此時(shí),P2口作一般的I/O口使用,作用及用法與P1口相同。當(dāng)CPU對片外存儲(chǔ)器或I/O口進(jìn)行讀寫時(shí),MUX選擇地址總線,此時(shí),P2口輸出的是高8位地址,這樣就可以擴(kuò)展片外存儲(chǔ)器(ROM或者RAM)。由于CPU訪問片外存儲(chǔ)器的操作往往是連續(xù)進(jìn)行的,P2口要不斷地送出高8位地址,因此P2口此時(shí)不能用作通用I/O口。
4.?P3口
P3口與P1口相比,多了非門和輸入數(shù)據(jù)緩沖器,這使P3口除了具有P1口的準(zhǔn)雙向I/O功能外,?還可以使用該端口具有的第二功能。當(dāng)?shù)诙δ茌敵龆藶?時(shí),輸出Q端信號;當(dāng)D鎖存器輸出為1時(shí),輸出第二功能信號。
P3口作通用I/O口使用。P3口作通用I/O使用時(shí),其工作原理與P1口類似,第二功能輸出端保持高電平,D鎖存器的Q端狀態(tài)經(jīng)與非門和V2輸出。
P3口作為輸入使用時(shí),應(yīng)先用軟件向端口鎖存器寫1,使Q端為1,經(jīng)與非門輸出為0,V2截止。此時(shí),CPU給出讀端子信號,將端子上的信號經(jīng)緩沖器1和輸入三態(tài)緩沖器送到內(nèi)部總線。
P3口作第二功能使用。當(dāng)P3口的某位被用作第二功能時(shí),內(nèi)部硬件自動(dòng)設(shè)置該位端口鎖存器的Q端為1,使與非門可以輸出第二功能輸出端狀態(tài)。第二功能輸出端主要指對TXD、、的輸出。由于P3口用作第二功能時(shí)D鎖存器Q端已置1,第二功能輸出端不作輸出時(shí)也保持為1,使得輸出V2截止。由于此時(shí)端口已不作為通用I/O口,讀端子信號無效,輸入三態(tài)緩沖器不導(dǎo)通,這樣P3口端子的第二功能輸入信號(RXD、、、T0、T1)經(jīng)緩沖器1送入第二功能輸入端。P3口各位對應(yīng)的第二功能如表3-1所示。表3-1P3口的第二功能3.1.2輸入/輸出口的應(yīng)用與擴(kuò)展
1.輸入/輸出口的應(yīng)用特點(diǎn)
各輸入/輸出口的適用功能。P0口一般用作數(shù)據(jù)/低8位地址復(fù)用口,P1口一般作I/O擴(kuò)展口用,P2口作高8位地址和I/O擴(kuò)展的地址譯碼用,P3口作中斷輸入、串行通信口用。在實(shí)際應(yīng)用系統(tǒng)中,僅靠單片機(jī)自帶的資源很難達(dá)到系統(tǒng)的要求,需要外部功能的擴(kuò)展,尤其是需要外部程序存儲(chǔ)器或數(shù)據(jù)存儲(chǔ)器的擴(kuò)展。因此,在單片機(jī)的系統(tǒng)設(shè)計(jì)中,經(jīng)常要擴(kuò)展I/O口。
各輸入/輸出口的使用方法和驅(qū)動(dòng)能力。在單片機(jī)應(yīng)用中,P0口作為I/O口使用時(shí),需要外加上拉電阻,而P1、P2、P3口內(nèi)部設(shè)有上拉電阻,不用外加。這4個(gè)I/O口均為準(zhǔn)雙向I/O口,其驅(qū)動(dòng)能力不同:P0口的驅(qū)動(dòng)能力最強(qiáng),可以驅(qū)動(dòng)8個(gè)LSTTL負(fù)載;其余3個(gè)端口只能驅(qū)動(dòng)4個(gè)LSTTL負(fù)載。
各輸入/輸出口的兩種讀方式。由圖3-1可見,每個(gè)I/O均有兩種讀入方法,即讀鎖存器和讀引腳,并有相應(yīng)的指令。讀鎖存器指令也稱為讀—修改—寫指令,如表3-2所示。當(dāng)目的操作數(shù)為某一I/O口或者I/O口的某一位時(shí),這些指令均為讀—修改—寫指令。讀引腳指令一般是以I/O口為源操作數(shù)的指令。執(zhí)行讀引腳指令時(shí),打開三態(tài)門,輸入端口引腳狀態(tài)。例如,P1口在輸入狀態(tài)時(shí)的讀引腳指令為:MOVA,P1。表3-2讀—修改—寫指令
2.擴(kuò)展實(shí)例這里使用常用的鎖存器、三態(tài)門等芯片進(jìn)行并行I/O擴(kuò)展,電路如圖3-5所示。該電路中,74LS273作為端口的擴(kuò)展輸出,74LS244作為端口的擴(kuò)展輸入。如果系統(tǒng)中還有其它擴(kuò)展I/O口,則可以使用線選法或譯碼法分配其地址空間。下面分析電路的原理。
輸出控制信號由引腳P2.0和取或運(yùn)算而得。當(dāng)兩者都為低電平的時(shí)候,或門輸出為0,將P0口的數(shù)據(jù)鎖存到74LS273中。74LS273的輸出控制發(fā)光二極管,當(dāng)某位引腳輸出高電平時(shí),對應(yīng)的發(fā)光二極管點(diǎn)亮。
輸入控制信號由引腳P2.0和取或運(yùn)算而得。當(dāng)兩者都為低電平時(shí),或門輸出為0,此時(shí)選通74LS244,將外部的數(shù)據(jù)信息輸入到總線。圖3-5中的某按鍵按下時(shí),讀到的相應(yīng)位為0,否則為1。
輸入和輸出都是在P2.0引腳為0的時(shí)候有效的,分別用和區(qū)別控制輸入和輸出,因此不會(huì)產(chǎn)生輸入和輸出的沖突。在程序中訪問擴(kuò)展I/O口時(shí),用MOVX指令實(shí)現(xiàn)。例如,現(xiàn)在要把按鍵狀態(tài)讀入到A中,然后輸出到LED上顯示,完成該功能的程序段為:
MOV
DPTR,#0FEFFH ;擴(kuò)展I/O的設(shè)備地址
MOVX
A,@DPTR ;由信號識(shí)別現(xiàn)在是選通74LS244,讀按鍵
MOVX
@DPTR,A;由信號識(shí)別現(xiàn)在是寫LS273, ;控制LED發(fā)光注意:上面的指令是逐步運(yùn)行的,這樣由上至下逐條執(zhí)行指令的結(jié)構(gòu)就是所謂的順序結(jié)構(gòu)。圖3-5I/O口擴(kuò)展實(shí)例3.2控制轉(zhuǎn)移類指令程序通常是按由上至下的指令順序運(yùn)行的,程序的順序執(zhí)行是由程序計(jì)數(shù)器PC自動(dòng)加1實(shí)現(xiàn)的。為了適應(yīng)復(fù)雜的測控系統(tǒng)的需要,經(jīng)常需要改變程序的執(zhí)行順序,實(shí)現(xiàn)分支轉(zhuǎn)向,這種情況稱為“程序轉(zhuǎn)移”??刂妻D(zhuǎn)移類指令一般是通過改變PC值來實(shí)現(xiàn)的,因此該類指令的作用區(qū)域就是PC能夠訪問的程序存儲(chǔ)器空間??刂妻D(zhuǎn)移類指令共有22條,包括無條件轉(zhuǎn)移、條件轉(zhuǎn)移、子程序調(diào)用及返回指令等,具體如表3-3所示。控制轉(zhuǎn)移類指令一般不影響標(biāo)志位。表3-3控制轉(zhuǎn)移類指令續(xù)表續(xù)表3.2.1無條件轉(zhuǎn)移圖3-6所示是4條無條件跳轉(zhuǎn)指令的執(zhí)行要點(diǎn)和跳轉(zhuǎn)范圍。下面舉例進(jìn)一步說明。
1.?LJMP、AJMP、SJMP這三條指令都是跳轉(zhuǎn)指令,執(zhí)行過程分別如圖3-6(a)、(c)、(b)所示??梢钥闯?,LJMP在整個(gè)64KB的程序存儲(chǔ)器空間范圍內(nèi)直接跳轉(zhuǎn),與當(dāng)前指令位置無關(guān)。AJMP是在當(dāng)前指令的下一條指令所在的2KB范圍內(nèi)跳轉(zhuǎn),執(zhí)行時(shí)把當(dāng)前指令的PC值加2,然后把PC的低11位換成AJMP指令當(dāng)中的11位地址。SJMP則是把當(dāng)前指令的PC值加2后,再把PC值與指令中的符號數(shù)rel相加,形成一個(gè)以當(dāng)前PC+2為基點(diǎn)的-128~127范圍的跳轉(zhuǎn)空間。在實(shí)際編寫程序時(shí),程序員不需要人為去計(jì)算上面提到的偏移距離或跳轉(zhuǎn)的范圍,而是在跳轉(zhuǎn)指令中使用標(biāo)號(參考1.5.2節(jié)),編譯程序會(huì)自動(dòng)進(jìn)行計(jì)算,實(shí)現(xiàn)程序員所希望的跳轉(zhuǎn)。圖3-6幾條無條件跳轉(zhuǎn)指令的執(zhí)行過程
2.
JMP@A+DPTR這是間接轉(zhuǎn)移指令,也稱散轉(zhuǎn)指令。轉(zhuǎn)移地址由數(shù)據(jù)指針DPTR與累加器A中的8位無符號數(shù)相加而形成。其執(zhí)行結(jié)構(gòu)如圖3-6(d)所示。下面是幾個(gè)跳轉(zhuǎn)指令的綜合應(yīng)用,程序分析如圖3-7所示。
ORG0000H
LJMPJUMP1 JUMP2: MOVA,#02H JMP@A+DPTR JUMP1: MOVDPTR,#TABLE SJMPJUMP2
TABLE: AJMPPORT0
AJMPPORT1 AJMPPORT2
AJMPPORT3 SJMP$ PORT0: MOVP0,#00H PORT1: MOVP1,#01H PORT2: MOVP2,#02H PORT3: MOVP3,#03H END圖3-7幾個(gè)跳轉(zhuǎn)指令的綜合演示通過這個(gè)程序的學(xué)習(xí),需要了解到:
程序不僅僅可以由上至下順序執(zhí)行,還可以打破順序跳著執(zhí)行。后面還要學(xué)習(xí)有條件的跳轉(zhuǎn)和調(diào)用。
在實(shí)際編程中,放在SJMP、AJMP指令后面的不是需要計(jì)算的rel和addr11,而是用標(biāo)號表示的目的地址,如:SJMPJUMP2。具體指令中的地址則由編譯程序自動(dòng)完成。
SJMP$是一種常用的程序原地執(zhí)行的寫法。后面學(xué)了循環(huán)后,就知道這是一個(gè)死循環(huán),在學(xué)習(xí)階段經(jīng)常使用。特別在上機(jī)實(shí)驗(yàn)時(shí),當(dāng)執(zhí)行到這條指令后,程序不會(huì)退出,所以可以繼續(xù)觀察寄存器、MEMORY中的值。
上面的分析方法還是使用了μV3的匯編指令混合顯示方法。慢慢地適應(yīng)這種學(xué)習(xí)方法,對于學(xué)習(xí)單片機(jī)編程可以收到事半功倍的效果。進(jìn)一步:
圖3-7對于跳轉(zhuǎn)指令的跳轉(zhuǎn)地址有詳細(xì)的運(yùn)算,圖3-6對于跳轉(zhuǎn)指令的跳轉(zhuǎn)過程有詳細(xì)的圖示,對比二者,進(jìn)一步理解跳轉(zhuǎn)指令的執(zhí)行過程和原理。
思考驗(yàn)證:仔細(xì)閱讀關(guān)于SJMPrel指令中rel的解釋。?指令SJMP$的作用是執(zhí)行原地跳轉(zhuǎn)(循環(huán)),由圖3-7中的解釋可以知道,這里的$實(shí)際獲得的值為0FEH,即-2。如果在程序中實(shí)際書寫的指令為:SJMP0FEH,則程序會(huì)怎樣執(zhí)行?先分析然后到機(jī)器上去驗(yàn)證吧!3.2.2條件轉(zhuǎn)移條件轉(zhuǎn)移的原理是當(dāng)程序設(shè)定的條件滿足時(shí),進(jìn)行程序的轉(zhuǎn)移,否則程序順序執(zhí)行。這一點(diǎn)在C程序中采用“if”語句進(jìn)行描述。條件轉(zhuǎn)移結(jié)構(gòu)采用如圖3-8所示的流程圖描述。51所有的條件轉(zhuǎn)移指令都是采用相對尋址方式得到轉(zhuǎn)移目的地址,以rel作為8位偏移量。在編寫程序時(shí),正像前面轉(zhuǎn)移指令所介紹的一樣,常用目的地址的標(biāo)號來代替rel,由匯編或者其他的編譯器自動(dòng)換算成8位相對地址。后面的解釋不再使用相對地址,而是直接采用程序編寫時(shí)使用的標(biāo)號地址。圖3-8條件轉(zhuǎn)移流程圖根據(jù)判斷條件把條件轉(zhuǎn)移指令劃分為4類(如表3-3所示):
累加器判零轉(zhuǎn)移指令;
數(shù)值比較判等轉(zhuǎn)移指令;
減1判零轉(zhuǎn)移指令;
判位轉(zhuǎn)移指令。下面在程序中對相關(guān)的指令進(jìn)行解釋。
(1)程序如下(仍使用前面圖3-5所示的電路):
ORG 0000H LJMP MAIN ORG 0040H
MAIN: MOV SP,#30H MOV DPTR,#0FEFFH ;設(shè)置控制字
MOVX A,@DPTR ;讀按鍵狀態(tài)
JZ LED_OFF ;判斷A是否為0 MOV A,#01H ;如果不為0,
MOVX @DPTR,A ;則點(diǎn)亮D0 SJMP GOON ;跳轉(zhuǎn)
LED_OFF:
MOV A,#00H ;否則熄滅D0 MOVX @DPTR,A
GOON:
SJMP$
END對該程序的分析如圖3-9所示。進(jìn)一步:
這個(gè)程序完成的功能是:如果8個(gè)按鍵全部閉合,則發(fā)光二極管D0熄滅,否則D0點(diǎn)亮。
注意看上面的分析,“如果…,則…,否則…”,還有圖3-8所示的流程圖,這就是程序的基本結(jié)構(gòu)之一:選擇結(jié)構(gòu)。
分析圖中,陰影部分作為以后常用的程序結(jié)構(gòu)框架,以后再舉例時(shí),這一部分一般不再給出。讀者只要把程序段填充到這個(gè)框架中,就可以運(yùn)行了。當(dāng)然,這里面不包括中斷部分,以后還要給這個(gè)框架補(bǔ)充內(nèi)容。
就這個(gè)程序完成的功能而言,里面有不少的“廢話”。這個(gè)以后再解釋。
這個(gè)程序只對鍵盤判斷一次,并且對LED0的狀態(tài)也只是操作一次,如何動(dòng)態(tài)監(jiān)測并且及時(shí)更新輸出呢?請繼續(xù)學(xué)習(xí)。圖3-9程序分析
(2)程序如下:
DELAY: MOV R0,#00H ;延時(shí)控制
DELAY1: MOV R1,#00H ;
DJNZ R1,$ ;
DJNZ R0,DELAY1這個(gè)程序段前面已經(jīng)出現(xiàn)過,現(xiàn)在解釋如下:①
DJNZR1,$:該語句先把R1的值減1,然后判斷是否為0,若不為0,則跳轉(zhuǎn),因?yàn)槭翘D(zhuǎn)到$,所以還是跳轉(zhuǎn)到本指令繼續(xù)執(zhí)行,再把R1的值減1,然后判斷是否為0,若不為0,則跳轉(zhuǎn),如此反復(fù)執(zhí)行下去;當(dāng)判斷R1的值為0時(shí),程序不再跳轉(zhuǎn),而是向下繼續(xù)執(zhí)行。執(zhí)行結(jié)構(gòu)如圖3-10所示。圖3-10DJNZR1,$的執(zhí)行結(jié)構(gòu)
如果R1的初始值為1,則執(zhí)行一次R1?=?R1-1(注:匯編語言當(dāng)中沒有這種表達(dá)方式,但以后的C程序會(huì)有這種表達(dá)方式)后,R1的值為0,所以這個(gè)結(jié)構(gòu)只執(zhí)行一次;如果R1的初始值為2,那么執(zhí)行一次后R1的值變成1,再執(zhí)行一次后變成0,所以執(zhí)行2次;依此類推,如果R1的初始值為n(因?yàn)椴捎?位寄存器計(jì)數(shù),所以n不能大于255。如果控制的循環(huán)次數(shù)大于255怎么辦,請繼續(xù)學(xué)習(xí)),那么這個(gè)結(jié)構(gòu)的執(zhí)行次數(shù)就是n次。我們可以說,這個(gè)結(jié)構(gòu)循環(huán)執(zhí)行了n次。R1用于控制循環(huán)次數(shù),稱為循環(huán)控制變量。終于提出循環(huán)這個(gè)概念了。
循環(huán)結(jié)構(gòu)是程序的三大結(jié)構(gòu)之一,它包括循環(huán)體和循環(huán)出口控制結(jié)構(gòu)。其執(zhí)行流程如圖3-11所示。如果沒有退出循環(huán)的出口,我們稱這個(gè)循環(huán)為死循環(huán)。除非單片機(jī)重新啟動(dòng),否則程序?qū)⒂肋h(yuǎn)循環(huán)。有時(shí)候我們要利用死循環(huán),但是有時(shí)候它卻會(huì)給我們帶來麻煩。要合理使用循環(huán),要謹(jǐn)慎使用死循環(huán)。圖3-11循環(huán)結(jié)構(gòu)
如果R1的初始值為00H,那么循環(huán)次數(shù)是多少呢?第一次變成FFH,到第256次的時(shí)候變成0,因此應(yīng)當(dāng)是256次。給循環(huán)變量賦值為0,得到的卻是最大循環(huán)控制次數(shù),請讀者注意類似的表達(dá)方式。②?DJNZR0,DELAY1:這個(gè)指令格式和①是一樣的,過程可以描述為:把R0的值減1,判斷R0是否為0,如果不為0,則跳轉(zhuǎn)去DELAY1處執(zhí)行;否則繼續(xù)向下順序執(zhí)行。該程序段的執(zhí)行結(jié)構(gòu)如圖3-12所示。進(jìn)一步解釋:
DJNZR0,DELEY1構(gòu)成循環(huán)結(jié)構(gòu)。循環(huán)控制變量是R0,循環(huán)體是MOVR1,#00H和DJNZR1,$這兩條指令。而DJNZR1,$本身又是一個(gè)循環(huán),包含在DJNZ構(gòu)成的另一個(gè)循環(huán)中。這種循環(huán)體中還包含有循環(huán)的結(jié)構(gòu)稱為循環(huán)的嵌套。根據(jù)程序的需要,循環(huán)可以多重嵌套。被包含的循環(huán)稱為內(nèi)循環(huán),外圍的循環(huán)則稱為外循環(huán)。圖3-12循環(huán)的嵌套
如圖3-13所示,分析這個(gè)程序段占用的機(jī)器周期和對應(yīng)的時(shí)間。單片機(jī)使用的晶振為12MHz,則一個(gè)機(jī)器周期的時(shí)間為所以1μs×[2+256×(2+2×256+2)]=192098μs這就是為什么把這段程序稱之為延時(shí)程序。如果需要精確延時(shí),則還需要仔細(xì)計(jì)算里面的每一條指令,作出合理安排,配合得到精確延時(shí)。但是,精確的延時(shí)或者定時(shí)不會(huì)使用這樣的程序段,而是采用定時(shí)/計(jì)數(shù)器的方式,第7章會(huì)學(xué)到。圖3-13循環(huán)所占時(shí)間計(jì)算3.2.3子程序調(diào)用及返回在一個(gè)程序中經(jīng)常遇到反復(fù)多次執(zhí)行某功能程序段的情況,如果重復(fù)編寫這個(gè)程序段,會(huì)使程序冗長而且雜亂。常把這個(gè)經(jīng)常使用的具有一定功能的程序段單獨(dú)編寫,稱為子程序。在需要使用這個(gè)功能塊的程序處,設(shè)置一個(gè)子程序調(diào)用指令,就可以轉(zhuǎn)去執(zhí)行這個(gè)子程序。當(dāng)遇到子程序中的返回指令時(shí),就可以回到剛才調(diào)用子程序的斷點(diǎn)處繼續(xù)執(zhí)行。這樣不但減少了編程工作量,而且縮短了程序的長度,增加了程序的可讀性。子程序是一種重要的程序結(jié)構(gòu)。調(diào)用子程序的程序稱為“主程序”,主程序和子程序的調(diào)用關(guān)系如圖3-14所示。如果在子程序中又調(diào)用了其他子程序,則稱為子程序的嵌套,如圖3-15所示。調(diào)用和返回構(gòu)成子程序調(diào)用的完整的過程。調(diào)用出現(xiàn)在主程序中,而返回則出現(xiàn)在子程序的執(zhí)行終點(diǎn)處(但不一定是該子程序段的最后一條指令)。圖3-14子程序調(diào)用圖3-15子程序的嵌套
1.調(diào)用與返回
51單片機(jī)提供兩條子程序調(diào)用指令:LCALLaddr16和ACALLaddr11。addr16與addr11的使用方法和規(guī)則與LJMPaddr16、AJMPaddr11中的完全相同,這里不再贅述。程序調(diào)用時(shí),單片機(jī)自動(dòng)將當(dāng)前PC入棧(注意,當(dāng)前PC為當(dāng)前指令的下一指令字節(jié)所在的地址,程序調(diào)用子程序返回后從該地址繼續(xù)向下執(zhí)行,稱為斷點(diǎn)地址,即子程序的返回地址),然后將標(biāo)號所標(biāo)示的調(diào)用地址送入PC,使程序轉(zhuǎn)到子程序中執(zhí)行,即所謂發(fā)生調(diào)用。標(biāo)號即為子程序的入口地址。
51單片機(jī)提供的返回指令有子程序返回指令RET和中斷返回指令RETI。RET指令的功能是從堆棧中彈出子程序的斷點(diǎn)地址給PC,程序返回主程序斷點(diǎn)處繼續(xù)向下執(zhí)行。調(diào)用子程序時(shí)入棧的是斷點(diǎn)處的地址,現(xiàn)在執(zhí)行RET彈出斷點(diǎn)地址給PC后,程序轉(zhuǎn)移到調(diào)用時(shí)的斷點(diǎn)處繼續(xù)向下執(zhí)行,就是所謂的子程序調(diào)用的返回。RETI用于中斷返回,它除了把程序從中斷服務(wù)子程序返回到主程序的斷點(diǎn)處(即程序返回任務(wù)),還要清除中斷響應(yīng)時(shí)被置位的優(yōu)先觸發(fā)器,開放較低級的中斷,恢復(fù)中斷邏輯等硬件設(shè)置。因此,RET、RETI這兩條指令不能交換使用。把3.2.2節(jié)中講的延時(shí)程序段設(shè)計(jì)成延時(shí)子程序:
DELAY:
MOV R0,#00H ;延時(shí)控制
DELAY1:MOV R1,#00H ;
DJNZ R1,$ ;
DJNZ R0,DELAY1 ;
RET把該延時(shí)子程序放到一個(gè)程序段中進(jìn)一步解釋:
LOOP: MOV DPTR,#0FEFFH
MOV A,#01H
MOVX @DPTR,A
LCALL DELAY
MOV A,#02H
MOVX @DPTR,A
LCALL DELAY
SJMP LOOP
DELAY: MOV R0,#00H
DELAY1: MOV R1,#00H
DJNZ R1,$
DJNZ R0,DELAY1
RET子程序調(diào)用的分析如圖3-16所示。圖3-16子程序調(diào)用分析圖示進(jìn)一步分析:
該程序段兩次調(diào)用了DELAY子程序,作為延時(shí)子程序。注意有陰影的那兩條指令。
SJMPLOOP構(gòu)成了無條件控制的循環(huán),而且循環(huán)沒有出口,這就是死循環(huán)。這是利用這個(gè)循環(huán)構(gòu)成了讓LED0、LED1不停地亮滅的效果。注意:3.2.2節(jié)中已經(jīng)分析了這個(gè)延時(shí)程序段的執(zhí)行時(shí)間為192098μs,大概為0.2s,所以,兩個(gè)燈交替亮滅的頻率大概為1/(0.2?+?0.2)?=?2.5Hz。這個(gè)速度人眼是可以分辨出來的。當(dāng)然,如果想改變亮滅的速度,應(yīng)該怎么辦呢?請繼續(xù)向后學(xué)習(xí)。
程序可以在多個(gè)地方調(diào)用同一個(gè)子程序。該程序段調(diào)用子程序的框架如圖3-17所示。圖3-17在不同位置調(diào)用子程序圖示
2.現(xiàn)場保護(hù)在主程序調(diào)用子程序之前,累加器或工作寄存器中可能存放著主程序運(yùn)算的中間結(jié)果,這些中間結(jié)果在主程序中仍然有用,子程序如果也用到這些寄存器,就需要在執(zhí)行子程序自身的功能前,將累加器、工作寄存器或其他可能被影響的單元內(nèi)容保護(hù)起來,即現(xiàn)場保護(hù)。這種保護(hù)是必須的,否則子程序返回后,會(huì)影響主程序的正常執(zhí)行。當(dāng)子程序執(zhí)行完畢,要返回之前,可將保存的那些數(shù)據(jù)恢復(fù)到原來的寄存器或累加器中,這個(gè)過程稱為現(xiàn)場恢復(fù)。現(xiàn)場保護(hù)通常是由堆棧來完成的,在子程序開始時(shí)使用入棧指令,將需要保護(hù)的寄存器內(nèi)容入棧。在子程序返回前,再將堆棧中保存的內(nèi)容對應(yīng)彈出(出棧),即現(xiàn)場恢復(fù)。堆棧的操作具有后進(jìn)先出的特點(diǎn),因此入棧和出棧操作的順序相反。例如,DELEY子程序中使用到R0、R1寄存器,如果主程序中使用R0、R1,則為了不影響主程序?qū)υ摷拇嫫鞯氖褂茫谧映绦蛑芯鸵峁┍Wo(hù)。具體操作如下:
DELAY: PUSH 00H ;R0入棧
PUSH 01H ;R1入棧
MOV R0,#00H
DELAY1:MOV R1,#00H
DJNZ R1,$
DJNZ R0,DELAY1
POP 01H ;彈出時(shí)順序相反
POP 00H; RET進(jìn)一步:
保護(hù)的目的是子程序的執(zhí)行不影響主程序,所以,如果子程序沒有影響主程序的因素,就不需要提供保護(hù)。
這里提供的這個(gè)保護(hù)方案,仔細(xì)研究有沒有問題?R0、R1對應(yīng)的地址是受RS1、RS0位的影響的。當(dāng)RS1RS0為00的時(shí)候,R0的地址就是00H,R1的地址就是01H,否則就不是。所以,這個(gè)保護(hù)本身是有問題的。那么,該怎么解決呢?
還有一種整體的解決方案。如果約定,主程序使用第0組工作寄存器,子程序使用第1組工作寄存器,那么只要控制RS1RS0的值就可以了。進(jìn)入子程序的時(shí)候設(shè)置:SETBRS0;退出子程序前設(shè)置:CLRRS0。
還有其他的辦法,請讀者自己分析。
3.參數(shù)傳遞主程序調(diào)用子程序時(shí),可以給子程序傳遞一些參數(shù),增加子程序的通用性。主程序傳給子程序的這些參數(shù)稱為入口參數(shù)。在調(diào)用子程序前,主程序應(yīng)先把子程序所需要的入口參數(shù)放到某些約定的存儲(chǔ)單元中,進(jìn)入子程序后,再從約定的單元取出入口參數(shù)進(jìn)行處理。子程序完成任務(wù)后,應(yīng)把處理結(jié)果傳遞給主程序,便于程序進(jìn)一步處理。子程序傳給主程序的這些參數(shù)稱為出口參數(shù)。處理完任務(wù)后,子程序返回前,應(yīng)把出口參數(shù)送到約定單元。返回主程序后,再從這些約定單元取得出口參數(shù)作進(jìn)一步的處理。注:有些子程序不需要入口參數(shù)或出口參數(shù)。在MCS—51單片機(jī)中,進(jìn)行參數(shù)傳遞的方法有多種:
用累加器或者工作寄存器進(jìn)行傳遞;
用地址指針進(jìn)行傳遞;
用堆棧傳遞參數(shù)。前面給出的DELAY延時(shí)程序的延時(shí)時(shí)間是固定的,是因?yàn)橄嚓P(guān)參數(shù)都是在DELAY子程序中固定,用立即數(shù)的形式給出。下面做一下簡單修改:
DELAY: ;MOV R0,#00H
DELAY1:
MOV R1,#00H
DJNZ R1,$ DJNZ R0,DELAY1 RET注意,在子程序中的MOVR0,#00H這條指令前面加了“;”,該指令被屏蔽了。這時(shí)調(diào)用DELAY子程序時(shí),應(yīng)先在主程序中給出R0的初始值。給出的初始值不同,延時(shí)時(shí)間也就不同。下面是調(diào)用示范程序,因?yàn)樵撌纠绦虮容^簡單,讀者請自行分析。
LOOP: MOV DPTR,#0FEFFH
MOV A,#01H
MOVX @DPTR,A
MOV R0,#80H
LCALL DELAY MOV A,#02H
MOVX @DPTR,A
MOV R0,#30H
LCALL DELAY
SJMP LOOP
DELAY: ;MOV R0,#00H;注意,這條指令已被屏蔽
DELAY1: MOV R1,#00H
DJNZ R1,$ DJNZ R0,DELAY1 RET該示例程序中,R0成了DELAY這個(gè)子程序的入口參數(shù)。其他的傳遞形式以后會(huì)學(xué)到。3.2.4空操作NOP
NOP指令執(zhí)行一個(gè)空周期,它在程序中主要用于調(diào)整時(shí)間或者匹配時(shí)鐘。在寫程序存儲(chǔ)器時(shí),沒有編程到的區(qū)域都是默認(rèn)的00H,即為NOP。3.3輸入電路設(shè)計(jì)輸入電路是單片機(jī)與外部建立聯(lián)系的重要通道。輸入的穩(wěn)定可靠性,是單片機(jī)可以正確獲取外部信息的保證。對于計(jì)算機(jī),目前市場上有很多兼容的成品輸入設(shè)備,如鍵盤、鼠標(biāo)、掃描儀等。對于單片機(jī),由于控制要求的復(fù)雜性和單片機(jī)本身型號的多樣性,目前基本沒有統(tǒng)一的可以在各型號間兼容使用的輸入設(shè)備。因此,對單片機(jī)工程師而言,每一個(gè)產(chǎn)品都要有輸入設(shè)備的設(shè)計(jì),而且相互之間的輸入又可能不盡相同。但是,這些產(chǎn)品的輸入設(shè)備的工作原理還是基本相同的,初學(xué)者要掌握必要的基礎(chǔ)知識(shí)。這里先介紹開關(guān)信號的輸入,主要是實(shí)現(xiàn)人機(jī)接口的鍵盤輸入部分。關(guān)于模擬量的輸入在第9章介紹。鍵盤的輸入設(shè)計(jì)方案在三個(gè)章節(jié)中分階段闡述,為了讓讀者有個(gè)整體印象,簡介如下:
獨(dú)立式按鍵設(shè)計(jì):側(cè)重于理論的講述和分析,給出較為基礎(chǔ)的鍵盤設(shè)計(jì)方案。本章介紹。
矩陣式鍵盤設(shè)計(jì):系統(tǒng)介紹矩陣鍵盤的設(shè)計(jì)方法,給出鍵盤設(shè)計(jì)與實(shí)用中存在的深層次問題的探討與分析——重(chong)鍵和連擊。第5章介紹。
鍵盤設(shè)計(jì)方案的完善:介紹實(shí)用鍵盤的設(shè)計(jì)方法,應(yīng)用中斷方式進(jìn)行鍵盤設(shè)計(jì)。第6章介紹。
1.鍵盤輸入的特點(diǎn)鍵盤實(shí)質(zhì)上是一組按鍵開關(guān)的組合。通常,按鍵所用開關(guān)為機(jī)械彈性開關(guān),均利用了機(jī)械觸點(diǎn)的合、斷作用。一個(gè)電壓信號通過機(jī)械觸點(diǎn)的斷開、閉合過程,其波形如圖3-18所示。由于機(jī)械觸點(diǎn)的彈性作用,一個(gè)按鍵開關(guān)在閉合時(shí)不會(huì)馬上穩(wěn)定的接通,在斷開時(shí)也不會(huì)一下斷開,而是有一連串的抖動(dòng)。抖動(dòng)時(shí)間的長短由按鍵的機(jī)械特性決定,一般為5~10ms。這個(gè)參數(shù)在后面的設(shè)計(jì)中會(huì)用到。按鍵的穩(wěn)定閉合時(shí)間長短是由鍵盤操作人員的按鍵動(dòng)作決定的,一般為0.1~5s的時(shí)間。在設(shè)計(jì)中要參考利用這個(gè)時(shí)間參數(shù)。圖3-18按鍵抖動(dòng)信號分析
2.按鍵的確認(rèn)與消抖措施按鍵的閉合與否,反映在電壓上就是高電平或者低電平的變化,如果高電平代表斷開,那么低電平則表示閉合。所以,通過電平的高低狀態(tài)的檢測,便可確認(rèn)按鍵是否按下。為了確保CPU對一次按鍵動(dòng)作確認(rèn)一次按鍵,必須消除抖動(dòng)的影響。下面介紹軟件、硬件消抖的辦法。
1)基本RS觸發(fā)器構(gòu)成的消抖電路如圖3-19(a)所示,當(dāng)開關(guān)由觸點(diǎn)1推向2時(shí),在2點(diǎn)上會(huì)產(chǎn)生抖動(dòng),因?yàn)殚_關(guān)已經(jīng)離開1,所以這個(gè)時(shí)候觸點(diǎn)在2點(diǎn)上的抖動(dòng)僅僅導(dǎo)致端在0和1之間的短暫跳變。但是端已經(jīng)為1,由基本RS觸發(fā)器的性質(zhì)知道,當(dāng)端為0時(shí),Q端輸出1;當(dāng)端為1時(shí),Q端保持原來的狀態(tài)不變。所以,Q端保持穩(wěn)定的輸出,沒有跳變。另一個(gè)過程同理。在圖3-19(b)中給出了相應(yīng)的波形。圖3-19基本RS觸發(fā)器構(gòu)成的硬件消抖電路
2)濾波消抖電路濾波消抖原理圖如圖3-20所示??梢钥闯?,在開關(guān)開、關(guān)的開始階段,存在一個(gè)不穩(wěn)定的電壓,消抖的關(guān)鍵是讓這個(gè)抖動(dòng)的時(shí)間小于門電壓達(dá)到轉(zhuǎn)換電平所需要的時(shí)間。VH是非門轉(zhuǎn)換所需要的門開啟電壓,VL是門關(guān)閉電壓。在閉合時(shí),抖動(dòng)階段要在電壓達(dá)到VH之前結(jié)束;在斷開時(shí),抖動(dòng)階段要在電壓降到VL之前結(jié)束。這個(gè)時(shí)間可以通過改變R1、R2、C的值來調(diào)整充放電時(shí)間常數(shù),一般要保證C由穩(wěn)態(tài)電壓充電到開啟電壓或者放電到門關(guān)閉電壓的延遲時(shí)間大于等于10ms。這個(gè)延時(shí)時(shí)間可以根據(jù)電路進(jìn)行計(jì)算,也可以通過實(shí)驗(yàn)的方式獲得。圖中的參數(shù)僅供參考。圖3-20濾波消抖
3)軟件消抖當(dāng)按鍵較多時(shí),使用硬件消抖的方案便失去可行性,這時(shí)軟件消抖就是優(yōu)先選擇的方案。而且,軟件消抖也可以做得比較出色,其方法簡單,成本較低,因而得到了廣泛應(yīng)用。軟件資料的基本原理是:當(dāng)程序檢測到有按鍵按下時(shí),執(zhí)行一個(gè)10ms的延時(shí),然后再檢測一次,對比是否還是剛才的按鍵狀態(tài)。如果是,則確認(rèn)按鍵并處理,否則可以認(rèn)為是干擾,放棄處理,或作異常處理,從而消除抖動(dòng)的影響。
3.獨(dú)立式按鍵接口設(shè)計(jì)所謂獨(dú)立式按鍵接口,是與目前常用的矩陣式鍵盤(第5章介紹)相比較而言的,具體指I/O口的獨(dú)立性,每一根口線作為一個(gè)獨(dú)立的按鍵輸入檢測。當(dāng)按下或釋放按鍵時(shí),輸入到I/O口的電平發(fā)生高低變化,程序依此來判斷是否有按鍵按下,并且可以識(shí)別具體的按鍵。獨(dú)立式按鍵電路配置靈活,軟件結(jié)構(gòu)簡單,如圖3-21所示。但其每個(gè)按鍵需占用一根輸入口線,在按鍵數(shù)量較多時(shí),輸入口浪費(fèi)大,電路結(jié)構(gòu)顯得很繁雜,故此種鍵盤使用于按鍵較少或操作速度要求較高的場合。下面介紹幾種獨(dú)立式按鍵的接口。
(1)圖3-21(a)為典型的獨(dú)立式按鍵工作電路。當(dāng)某個(gè)按鍵按下時(shí),相對應(yīng)的輸入口線被拉低,讀入的這個(gè)端口對應(yīng)的位為0,依此判斷是哪個(gè)按鍵被按下。至于圖中的上拉電阻,則是為了通用性。實(shí)際連接電路時(shí),需要查詢所選用單片機(jī)的接口內(nèi)部是否有上拉電阻,如果有,則把外接的上拉電阻去掉,以免加重系統(tǒng)負(fù)擔(dān)。以后的電路都遵循這個(gè)規(guī)律。圖3-21獨(dú)立式按鍵接口設(shè)計(jì)獨(dú)立式按鍵的軟件結(jié)構(gòu)比較簡單,一般采用查詢方式。程序如下:
START: MOVP1,#0FFH ;為P1口讀入做準(zhǔn)備
MOVA,P1 ;實(shí)質(zhì)上是暫存到R0,為了增加通用性
MOV00H,A ;使用00H LCALLDELAY10 ;調(diào)用延時(shí)10ms子程序
MOVA,P1 ;再次讀入按鍵狀態(tài)
CJNEA,00H,START ;如果還相同,則按鍵有效,并進(jìn)行處理,否則返回到START
CJNEA,#0FEH,KEY_1 ;是否是第1個(gè)按鍵(P1.0)?不是就繼續(xù)判斷下一個(gè)
LJMPFUNC0 ;是就轉(zhuǎn)去執(zhí)行功能
KEY_1: CJNEA,#0FDH,KEY_2 ;是否是第2個(gè)按鍵(P1.1)?不是就繼續(xù)判斷下一個(gè)
LJMPFUNC1 ;是就轉(zhuǎn)去執(zhí)行功能
KEY_2: CJNEA,#0FBH,KEY_3 ;是否是第3個(gè)按鍵(P1.2)?不是就繼續(xù)判斷下一個(gè)
LJMPFUNC2 ;是就轉(zhuǎn)去執(zhí)行功能
KEY_3: CJNEA,#0F7H,KEY_4 ;是否是第4個(gè)按鍵(P1.3)?不是就繼續(xù)判斷下一個(gè)
LJMPFUNC3 ;是就轉(zhuǎn)去執(zhí)行功能
KEY_4: JBACC.4,KEY_5 ;是否是第5個(gè)按鍵(P1.4)?不是就繼續(xù)判斷下一個(gè)
LJMPFUNC4 ;注意,這里更換了判斷方式,其實(shí)質(zhì)沒變
KEY_5: JBACC.5,KEY_6 ;是否是第6個(gè)按鍵(P1.5)?不是就繼續(xù)判斷下一個(gè)
LJMPFUNC5 ;更換判斷方式的目的是給讀者提供更多的選擇
KEY_6: JBACC.6,KEY_7 ;是否是第7個(gè)按鍵(P1.6)?不是就繼續(xù)判斷下一個(gè)
LJMPFUNC6
KEY_7: LJMPFUNC7 ;如果能夠執(zhí)行到這里,就是第8個(gè)按鍵了
FUNC0: ;功能自己補(bǔ)充
LJMPSTART
FUNC1: ;功能自己補(bǔ)充
LJMPSTART
FUNC2: ;功能自己補(bǔ)充
LJMPSTART
FUNC3: ;功能自己補(bǔ)充
LJMPSTART…………
FUNC4: ;功能自己補(bǔ)充
LJMPSTART
FUNC5: ;功能自己補(bǔ)充
LJMPSTART
FUNC6: ;功能自己補(bǔ)充
LJMPSTART
FUNC7: ;功能自己補(bǔ)充
LJMPSTART
DELAY10: ;延時(shí)部分請讀者自己增加進(jìn)一步解釋:
這個(gè)鍵盤程序是以程序段的形式出現(xiàn)的,其功能就是循環(huán)判斷是否有按鍵按下,如果有,則對應(yīng)執(zhí)行該按鍵的功能?!?/p>
按鍵功能部分省略,讀者可以根據(jù)自己的需要進(jìn)行補(bǔ)充,替換掉省略號部分即可,比如:
FUNC0:MOV A,#01H
MOV DPTR,#0FEFFH
MOVX @DPTR,A
LJMP START如果和前面電路3-5對應(yīng),則可以控制LED。
判斷是否有按鍵的思路是:先讀入按鍵,延時(shí)10ms后再次讀入按鍵,如果兩次讀入的按鍵狀態(tài)相等,則說明是一個(gè)穩(wěn)定的按鍵,可以處理,否則放棄。這個(gè)判斷部分使用的指令是:
CJNE A, 00H, START實(shí)質(zhì)上執(zhí)行的是:
CJNE A,R0, START但是在μV3中不支持這個(gè)格式,所以采用了上面的形式,請讀者注意。讀者可以根據(jù)自己程序設(shè)置的情況來合理分配這個(gè)臨時(shí)比對單元。比如:
Key_TempEQU 40H
CJNE A, Key_Temp, START
判斷哪一個(gè)按鍵的思路是:把讀入的按鍵狀態(tài)從P1.0到P1.7逐位判定,哪一位為0,則對應(yīng)該位上有按鍵按下。這里提供了兩種判斷思路:
CJNE A,#0FEH,KEY_1
LJMP FUNC0…這種判斷是基于這樣一種設(shè)定:同時(shí)只有一個(gè)按鍵按下,當(dāng)一個(gè)按鍵按下時(shí),相應(yīng)的口線輸入為0,而其他的都為1。如果同時(shí)有兩個(gè)或兩個(gè)以上的按鍵按下,可以看出,上面的判斷將無效。在這種方式下,按鍵相互之間有影響。所
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度廣西壯族自治區(qū)國家保安員資格考試題庫檢測試卷B卷附答案
- 滌綸纖維的環(huán)保型染料應(yīng)用考核試卷
- 2025版工程施工安全免責(zé)及安全教育培訓(xùn)協(xié)議3篇
- DB5133T 9-2019 牦牛屠宰檢疫操作技術(shù)規(guī)程
- 2024年裝修施工協(xié)議專業(yè)范本版B版
- 審查基礎(chǔ)知識(shí)練習(xí)測試題附答案
- 生態(tài)擋墻施工方案與災(zāi)害防治結(jié)合
- 《XA餐飲公司稅收籌劃方案研究》
- 《日語學(xué)習(xí)者日語聽力能力自我評價(jià)研究》
- 《基于模糊聚類的模糊查詢及查詢松弛方法的研究》
- 遠(yuǎn)大住工-裝配式建筑發(fā)展現(xiàn)狀和技術(shù)標(biāo)準(zhǔn)
- 人教版2023-2024學(xué)年四年級數(shù)學(xué)上冊典型例題系列 第四單元:促銷問題與“買幾送幾”專項(xiàng)練習(xí)(解析版)
- 淺析國產(chǎn)手機(jī)小米品牌形象塑造與維護(hù)
- 美甲店衛(wèi)生制度規(guī)章范本
- 湘少版三年級下冊英語單詞默寫1(附單元標(biāo)題句)
- 2023年昆明市重點(diǎn)中學(xué)物理高二上期末經(jīng)典模擬試題含解析
- 試制過程記錄表
- 2024屆浙江省寧波市鎮(zhèn)海區(qū)鎮(zhèn)海中學(xué)高一物理第一學(xué)期期末質(zhì)量檢測試題含解析
- 耶魯博弈論24講全筆記
- 道路運(yùn)輸安全生產(chǎn)目標(biāo)責(zé)任書
- 高中音樂-《錦雞出山》教學(xué)課件設(shè)計(jì)
評論
0/150
提交評論