51單片機常用接口_第1頁
51單片機常用接口_第2頁
51單片機常用接口_第3頁
51單片機常用接口_第4頁
51單片機常用接口_第5頁
已閱讀5頁,還剩84頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第8章51單片機常用接口主要內(nèi)容:本章介紹組成51單片機應用系統(tǒng)的常見外部接口電路,主要包含存儲器擴展,I/O口擴展,數(shù)碼管接口和鍵盤接口。重點:數(shù)碼管、鍵盤和51單片機接口12章節(jié)8.151單片機的最小系統(tǒng)8.2存儲器擴展8.3輸入/輸出口擴展8.4LED顯示器與51單片機接口8.5鍵盤與51單片機的接口8.6行程開關(guān)、晶閘管、繼電器與51單片機的接口8.1MCS-51單片機的最小系統(tǒng)

所謂最小系統(tǒng),是指一個真正可用的單片機最小配置系統(tǒng)。對于單片機內(nèi)部資源已能滿足系統(tǒng)需要的,可直接采用最小系統(tǒng)。MCS-51單片機根據(jù)片內(nèi)有無程序存儲器最小系統(tǒng)分兩種情況。8.1.18051/8751的最小系統(tǒng)5該最小系統(tǒng)的特點如下:(1) 由于片外沒有擴展存儲器和外設,P0、P1、P2、P3都可以作為用戶I/O接口使用。(2) 片內(nèi)數(shù)據(jù)存儲器有128B,地址空間為00H~7FH,沒有片外數(shù)據(jù)存儲器。(3) 內(nèi)部有4KB的程序存儲器,地址空間為0000H~0FFFH,沒有片外程序存儲器,應接高電平。(4) 可以使用兩個定時/計數(shù)器T0和T1,一個全雙工的串行通信接口,5個中斷源。8.1.28031的最小系統(tǒng)7該最小系統(tǒng)的特點如下:(1) 由于P0、P2在擴展程序存儲器時作為地址線和數(shù)據(jù)線,不能作為I/O線,因此,只有P1、P3作為用戶I/O接口使用。(2) 片內(nèi)數(shù)據(jù)存儲器同樣有128B,地址空間為00H~7FH,沒有片外數(shù)據(jù)存儲器。(3) 內(nèi)部無程序存儲器,片外擴展了程序存儲器,其地址空間隨芯片容量不同而不一樣。圖8.2中使用的是2764芯片,容量為8KB,地址空間為0000H~1FFFH。由于片內(nèi)沒有程序存儲器,只能使用片外程序存儲器,

只能接低電平。(4) 同樣可以使用兩個定時/計數(shù)器T0和T1,一個全雙工的串行通信接口,5個中斷源。8.2存儲器擴展8.2.1半導體存儲器概述1.只讀存儲器〔ROM-ReadOnlyMemory〕第一類:MROM-掩膜型ROM

第二類:PROM-可編程ROM

第三類:EPROM-可擦除的PROM

第四類:E2PROM-電擦除的PROM

第五類:FlashMemory-快擦型存儲器

2.隨機讀寫存儲器〔RAM-RandomAccessMemory〕第一類:靜態(tài)RAM-SRAM〔StaticRAM〕第二類:動態(tài)RAM-DRAM〔DynamicRAM〕第三類:非易失性RAM-NVRAM〔NonVolativeRAM〕3.典型ROM芯片276410D7~D0:8根數(shù)據(jù)線A12~A0:13根地址線:片選信號:輸出允許信號:編程控制信號Vpp:編程電壓Vcc:工作電壓,接+5V電源;GND:地引腳:4.典型RAM芯片626412I/O0~I/O7:8根輸入輸出數(shù)據(jù)線A12~A0:13根地址線:片選信號:輸出允許信號,低電平有效。:寫允許信號,低電平有效。CE2:片選信號2Vcc:工作電壓,接+5V電源;GND:地引腳:8.2.2存儲器擴展的一般方法單片機三總線與存儲器芯片的三總線對應連接1.數(shù)據(jù)線的連接單片機的數(shù)據(jù)總線(P0.0~P0.7)

存儲器芯片的數(shù)據(jù)線D0~D72.控制線的連接ROM:輸出允許控制線單片機

數(shù)據(jù)存儲器RAM:單片機存儲器芯片

3.地址線的連接存儲器芯片單片機地址總線(A0~A13)地址(A0~A13)

剩余地址總線譯碼片選信號線

譯碼有兩種方法:局部譯碼法和全譯碼法。那么:A15=0時,該芯片的地址是~,即1000H~17FFH。A15=1時,該芯片的地址是~,即9000H~97FFH。164.擴展存儲器所需芯片數(shù)目確實定假設所選存儲器芯片的字長與單片機的字長一致,那么只需擴展容量。所需芯片數(shù)目按下式確定:假設所選存儲器芯片字長與單片機字長不一致,那么不僅需要擴展容量,還需要字擴展。所需芯片數(shù)目按下式確定:8.2.3程序存儲器擴展1.單片程序存儲器的擴展其8個重疊的地址范圍為:(1)0000000000000000~,即0000H~1FFFH;~,即2000H~3FFFH;~,即4000H~5FFFH;~,即6000H~7FFFH;~,即8000H~9FFFH;~,即A000H~BFFFH;~,即C000H~DFFFH;~,即E000H~FFFFH。2.多片程序存儲器的擴展其兩片的地址空間分別為:第一片:00000000000000000~,即0000H~1FFFH; ~,即2000H~3FFFH; ~,即4000H~5FFFH; ~,即6000H~7FFFH。第二片~,即8000H~9FFFH; ~,即A000H~BFFFH; ~,即C000H~DFFFH; ~,即E000H~FFFFH。其地址空間分別是:00000000000000000~,即0000H~1FFFH;~,即2000H~3FFFH;~,即4000H~5FFFH;~,即6000H~7FFFH。8.2.4數(shù)據(jù)存儲器擴展假設P2.7為低電平0,那么兩片6264芯片的地址空間為:第一片:~,即4000H~5FFFH;第二片:~,即2000H~3FFFH。假設P2.7為高電平1,那么兩片6264芯片的地址空間為:第一片:~,即C000H~DFFFH;第二片:~,即A000H~BFFFH。8.3輸入/輸出口擴展8.3.1簡單I/O接口擴展通常通過數(shù)據(jù)緩沖器、鎖存器來擴展簡單I/O接口。例如,74LS373、74LS244、74LS273、74LS245等芯片都可以作簡單I/O擴展。74LS373引腳與內(nèi)部結(jié)構(gòu)圖74LS244引腳與內(nèi)部結(jié)構(gòu)圖用74LS373和74LS244擴展的并行I/O接口如果要通過L0~L7發(fā)光二極管顯示K0~K7開關(guān)的狀態(tài),那么相應的匯編程序為:匯編語言程序

ORG0000H LJMPSTART ORG0030HSTART: MOVDPTR,#7FFFH MOVXA,@DPTR ;讀74LS244擴展的輸入口

MOVX@DPTR,A ;輸出到74LS373擴展的輸出口

SJMPSTART END27C語言程序:#include<reg51.h>#include<absacc.h>//定義絕對地址訪問#defineucharunsignedcharvoidmain(void){uchar

i;while(1) {

i=XBYTE[0x7fff]; //讀74LS244擴展的輸入口

XBYTE[0x7fff]=i; //輸出到74LS373擴展的輸出口

}}8.3.2可編程I/O接口擴展(8255A)1.8255A的結(jié)構(gòu)與功能3個可編程的并行I/O端口:PA口、PB口和PC口。A口有3種工作方式:無條件I/O方式、選通I/O方式和雙向選通I/O方式。B口有兩種工作方式:無條件I/O方式和選通I/O方式。A1A0I/O操作00001讀A口寄存器內(nèi)容到數(shù)據(jù)總線00101讀B口寄存器內(nèi)容到數(shù)據(jù)總線01001讀C口寄存器內(nèi)容到數(shù)據(jù)總線00010數(shù)據(jù)總線上內(nèi)容寫到A口寄存器00110數(shù)據(jù)總線上內(nèi)容寫到B口寄存器01010數(shù)據(jù)總線上內(nèi)容寫到C口寄存器01110數(shù)據(jù)總線上內(nèi)容寫到控制口寄存器2.8255A的引腳信號31引腳信號線。D7~D0:三態(tài)雙向數(shù)據(jù)線,與單片機的數(shù)據(jù)總線相連,用來傳送數(shù)據(jù)信息。:片選信號線,低電平有效,用于選中8255A芯片。:讀信號線,低電平有效,用于控制從8255A端口存放器讀出信息。:寫信號線,低電平有效,用于控制向8255A端口存放器寫入信息。A1,A0:地址線,用來選擇8255A的內(nèi)部端口。PA7~PA0:A口的8根I/O信號線,用于與外部設備連接。PB7~PB0:B口的8根I/O信號線,用于與外部設備連接。PC7~PC0:C口的8根I/O信號線,用于與外部設備連接。RESET:復位信號線。VCC:+5V電源線。GND:地信號線。3.8255A的控制字1) 工作方式控制字2) C口按位置位/復位控制字4.8255A的工作方式1) 方式0(1) 具有兩個8位端口(A、B)和兩個4位端口(C口的高4位和C口的低4位)。(2) 任何一個端口都可以設定為輸入或者輸出。(3) 每一個端口輸出時鎖存,而輸入時不鎖存。特點:方式0輸入/輸出時沒有專門的應答信號,通常用于無條件傳送。2) 方式1A口和B口作為數(shù)據(jù)I/O口,C口用作I/O的應答信號。(1) 方式1輸入。:外設送給8255A的“輸入選通〞信號IBF:8255A送給外設的“輸入緩沖器滿〞信號INTR:8255A發(fā)送給CPU的“中斷請求〞信號INTE:8255A內(nèi)部為控制中斷而設置的“中斷允許〞信號(2) 方式1輸出。:8255A送給外設的“輸出緩沖器滿〞信號:外設送給8255A的“應答〞信號INTR:8255A送給CPU的“中斷請求〞信號INTE:8255A內(nèi)部為控制中斷而設置的“中斷允許〞信號3) 方式25.8255A與MCS-51單片機的接口1) 硬件接口8255A的A口、B口、C口和控制口的地址分別是7F00H、7F01H、7F02H和7F03H〔高8位地址線未用的取1,低8位地址線未用的取0〕。2) 軟件編程A口接開關(guān)K0~K7,B口接發(fā)光二極管L0~L7,要求從A口讀入開關(guān)狀態(tài)通過B口顯示出來。8255A的工作方式控制字為10000010B〔82H〕

40匯編程序段:

ORG0000H LJMPSTART ORG0030HSTART:MOVA,#82H ;8255A初始化,B口方式0輸入,A口方式0輸出

MOVDPTR,#7F03H ;8255A控制口地址

MOVX@DPTR,A L1: MOVDPTR,#7F01H ;8255A的B口地址

MOVXA,@DPTR ;從B口輸入

MOVDPTR,#7F00H ;8255A的A口地址

MOVX@DPTR,A ;從A口輸出

SJMPL1 END41C語言程序:#include<reg51.h>#include<absacc.h>//定義絕對地址訪問#defineuchar unsignedcharvoidmain(void){

uchar

i;XBYTE[0x7f03]=0x82; //8255A初始化,B口方式0輸入,A口方式0輸出

while(1) {

i=XBYTE[0x7f01]; //從B口輸入

XBYTE[0x7f00]=i; //從A口輸出

}}外觀共陰連接共陽連接顯示的根本原理:1.公共端有效〔選通LED顯示器〕 2.另一端送相應的編碼〔字段碼〕8.4MCS-51單片機與LED顯示器接口8.4.1LED顯示器的根本結(jié)構(gòu)與原理8段發(fā)光管控制端與字節(jié)的關(guān)系。3FH06H5BH顯示字符共陰極字段碼共陽極字段碼顯示字符共陰極字段碼共陽極字段碼03FHC0HC39HC6H106HF9HD5EHA1H25BHA4HE79H86H34FHB0HF71H8EH466H99HP73H8CH56DH92HU3EHC1H67DH82HT31HCEH707HF8HY6EH91H87FH80HL38HC7H96FH90H8.FFH00HA77H88H“滅”00FFHB7CH83H………………8.4.2LED數(shù)碼管顯示器使用的主要問題1.譯碼方式譯碼方式是指由顯示字符轉(zhuǎn)換得到對應的字段碼的方式。對于LED數(shù)碼管顯示器,通常的譯碼方式有硬件譯碼方式和軟件譯碼方式兩種。共陰極一位十六進制數(shù)——7字段碼轉(zhuǎn)換芯片MC144951〕硬件譯碼方式472〕軟件譯碼方式用MOVCA,@A+DPTR構(gòu)造的查表程序:ORG0200HCONVERT:MOVDPTR,#TAB;DPTR指向表首地址MOVA,R2 ;轉(zhuǎn)換的數(shù)放于AMOVCA,@A+DPTR;查表指令轉(zhuǎn)換MOVR2,ARETTAB:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB7FH,67H,77H,7CH,39H,5EH,79H,71H;顯示碼表軟件譯碼方式就是編寫軟件譯碼程序,通過譯碼程序來得到要顯示的字符的字段碼。譯碼程序通常為查表程序,軟件開銷較大,但硬件線路簡單。2.LED數(shù)碼管的顯示方式----靜態(tài)顯示和動態(tài)顯示1〕靜態(tài)顯示方式公共端直接接地(共陰極)或接電源(共陽極)每個數(shù)碼管的段選線與一組I/O接口線相連。特點:每個數(shù)碼管一直顯示。2〕動態(tài)顯示方式每個數(shù)碼管的公共端由一根I/O線控制。所有數(shù)碼管的段選線與一組I/O接口線并連在一起。特點:顯示為逐個顯示。段碼線位碼線8.4.3LED顯示器與單片機的接口1.硬件譯碼靜態(tài)顯示相應的匯編指令如下:MOVP1,#00100001B ;在第一個數(shù)碼管顯示“1〞MOVP1,#00010010B ;在第二個數(shù)碼管顯示“2〞2.軟件譯碼動態(tài)顯示A口、B口、C口和控制口的地址分別為7F00H、7F01H、7F02H和7F03H〔高8位地址線未用的取1,低8位地址線未用的取0〕圖8.27軟件譯碼動態(tài)顯示電路的程序如下(設8個數(shù)碼管的從左到右顯示緩沖區(qū)為片內(nèi)RAM的50H~57H單元)。匯編語言程序:ORG0000HLJMPMAINORG0100HMAIN:MOVA,#0 ;顯示緩沖區(qū)50H~57H單元初始化為0~7 MOVR2,#8 MOVR0,#50HLOOP:MOV@R0,A INCR0 INCA DJNZR2,LOOPLOOP1:LCALLDISPLAY ;調(diào)用顯示子程序

SJMPLOOP1 SJMP$;顯示子程序DISPLAY:MOVA,#10000000B;8255初始化 MOVDPTR,#7F03H ;使DPTR指向8255控制存放器端口 MOVX@DPTR,A MOVR0,#57H ;動態(tài)顯示初始化,使R0指向緩沖區(qū)首地址 MOVR3,#7FH ;首位位選字送R3 MOVA,R3LD0:MOVDPTR,#7F01H ;使DPTR指向PB口 MOVX@DPTR,A ;從PB口送出位選字 MOVDPTR,#7F00H ;使DPTR指向PA口 MOVA,@R0 ;讀要顯示數(shù) ADDA,#0DH ;調(diào)整距離段選碼表首的偏移量 MOVCA,@A+PC ;查表取得段選碼 MOVX@DPTR,A ;段選碼從PA口輸出 ACALLDL1 ;調(diào)用1ms延時子程序 DECR0 ;指向緩沖區(qū)下一單元 MOVA,R3 ;位選碼送累加器A JNBACC.0,LD1 ;判斷8位是否顯示完畢,顯示完返回 RRA ;未顯示完,把位選字變?yōu)橄乱晃贿x字 MOVR3,A ;修改后的位選字送R3 AJMPLD0 ;循環(huán)實現(xiàn)按位序依次顯示LD1:RETTAB: DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H;字段碼表 DB7FH,6FH,77H,7CH,39H,5EH,79H,71HDL1: MOVR7,#02H ;延時子程序DL: MOVR6,#0FFHDL0: DJNZR6,DL0 DJNZR7,DL RET END軟件譯碼動態(tài)顯示C語言程序如下:#include<reg51.h>#include<absacc.h> //定義絕對地址訪問#defineucharunsignedchar#defineuintunsignedintvoiddelay(uint); //聲明延時函數(shù)voiddisplay(void); //聲明顯示函數(shù)uchar

disbuffer[8]={0,1,2,3,4,5,6,7};

//定義顯示緩沖區(qū)voidmain(void){XBYTE[0x7f03]=0x80;//8255A初始化while(1){display(); //設顯示函數(shù)}}//***********顯示函數(shù)***********voiddisplay(void) //定義顯示函數(shù){uchar

codevalue[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0~F的字段碼表uchar

chocode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

//位選碼表uchar

i,p,temp;for(i=0;i<8;i++){temp=chocode[i];//取當前的位選碼XBYTE[0x7f01]=temp;//送出位選碼p=disbuffer[i];//取當前顯示的字符temp=codevalue[p];//查得顯示字符的字段碼XBYTE[0x7f00]=temp;//送出字段碼delay(20);//延時1ms}}//************延時函數(shù)************voiddelay(uinti) //延時函數(shù){uintj;for(j=0;j<i;j++){}}8.5MCS-51單片機與鍵盤的接口8.5.1鍵盤概述1.鍵盤的根本原理2.抖動的消除硬件消抖軟件消抖59硬件消抖軟件消抖利用延時程序消除抖動。3.鍵盤的分類分兩類:獨立式鍵盤和行列鍵盤。處理簡單,直接判并口線。每個鍵占用一根并口線,鍵位多時占用并口線多。用于鍵位較少的情況。特點:獨立式鍵盤行列鍵盤—矩陣鍵盤。矩陣鍵盤的結(jié)構(gòu)圖鍵位分布在行列交叉點上。占用并口線少,鍵位越多越明顯。特點:1〕鍵位的編碼矩陣鍵盤的處理:鍵位的編碼和鍵位的識別。(a)二進制組合編碼(b)順序排列編碼編碼=行首碼+列號。行線編碼和列線編碼組合2〕鍵位的識別兩步:第一步是首先檢測鍵盤上是否有鍵按下;第二步是識別哪一個鍵按下。(1) 檢測鍵盤上是否有鍵按下的處理方法(2) 識別鍵盤中哪一個鍵按下的處理方法逐列掃描全掃描8.4.2獨立式鍵盤與單片機的接口65匯編語言程序:ORG 0000H LJMP KEYORG 0100HKEY: MOV P1,#0FFHKEY0: JB P1.0,KEY1 ;如果K0沒有按下檢測K1 LCALL DEL10MS ;延時消抖 JB P1.0,KEY1 ;再檢測,判斷是否為干擾 CLR P2.0 ;K0按下,實現(xiàn)K0的相應程序KEY1: JB P1.1,KEY2 ;如果K1沒有按下檢測K2 LCALL DEL10MS ;延時消抖 JB P1.1,KEY2 ;再檢測,判斷是否為干擾 CLR P2.1 ;K1按下,實現(xiàn)K1的相應程序KEY2: JB P1.2,KEY3 ;如果K2沒有按下檢測K3 LCALL DEL10MS ;延時消抖 JB P1.2,KEY3 ;再檢測,判斷是否為干擾 CLR P2.2 ;K2按下,實現(xiàn)K2的相應程序66KEY3: JB P1.3,KEYEND ;如果K3沒有按下結(jié)束,返回主程序 LCALL DEL10MS ;延時消抖 JB P1.3,KEYEND ;再檢測,判斷是否為干擾 CLR P2.3 ;K3按下,實現(xiàn)K3的相應程序KEYEND:LJMP KEYDEL10MS:MOV R7,#20 ;延時10ms程序DEL500U:MOV R6,#250 DJNZ R6,$ DJNZ R7,DEL500U RET END67C語言程序:#include<reg51.h>#defineucharunsignedcharsbitK0=P1^0; //定義位變量sbitK1=P1^1;sbitK2=P1^2;sbitK3=P1^3;sbitD0=P2^0;sbitD1=P2^1;sbitD2=P2^2;sbitD3=P2^3;68voiddelay(uchark) //定義延時函數(shù){uchari,j;for(i=0;i<k;i++) for(j=0;j<250;j++);}voidmain(void){if(K0==0){delay(10);if(K0==0)D0=0;}//K0按下,進行的相應處理if(K1==0){delay(10);if(K1==0)D1=0;}//K1按下,進行的相應處理if(K2==0){delay(10);if(K2==0)D2=0;}//K2按下,進行的相應處理if(K3==0){delay(10);if(K3==0)D3=0;}//K3按下,進行的相應處理}8.4.3矩陣式鍵盤與單片機的接口圖8.34是PROTEUS中通過8255A芯片擴展并行口連接2

8的矩陣式鍵盤的電路圖。8255A的PA口接8根列線,PC口低2位接行線,PA口為輸出,PC口低2位為輸入。70處理過程如下:首先,通8255A的PA口送全掃描字00H,使所有的列為低電平,讀入PC口低2位,判斷是否有鍵按下。其次,如果有鍵按下,再通過PA口依次送列掃描字,將列線逐列置成低電平,讀入PC口行線狀態(tài),判斷按下的鍵是在哪一列的哪一行上面,然后通過行首碼加列號得到前按鍵的編碼。該矩陣式鍵盤的掃描子程序流程圖如右圖。

該矩陣式鍵盤的掃描子程序流程圖為了便于測試鍵盤是否正確,還添加了8個LED數(shù)碼管,通過數(shù)碼管顯示按下的鍵,按下的鍵在8個數(shù)碼管的最右邊顯示,而原來的內(nèi)容依次左移。8255A的A口、B口、C口和控制口的地址可分別取為7F00H、7F01H、7F02H和7F03H〔高8位地址線未用的取1,低8位地址線未用的取0〕。8255A在主程序中初始化。設定為A口方式0輸出,B口方式0輸出,C口的低4位方式0輸入。72匯編語言程序: ORG0000H LJMPMAIN ORG0100HMAIN:MOVA,#0 ;顯示緩沖區(qū)57H~50H單元初始化為7~0 MOVR2,#8 MOVR0,#50HLOOP:MOV@R0,A INCR0 INCA DJNZR2,LOOP MOVA,#10000001B ;8255初始化,A口方式0輸出,B口方式0輸出,C口低4位輸入 MOVDPTR,#7F03H ;使DPTR指向8255控制存放器端口 MOVX@DPTR,ALOOP1:ACALLKEYSUB ;調(diào)用鍵盤子程序 CJNER2,#0FFH,NEXT SJMP NEXT173NEXT:MOV50H,51H ;顯示緩沖區(qū)左移 MOV 51H,52H MOV 52H,53H MOV53H,54H MOV54H,55H MOV55H,56H MOV56H,57H MOV 57H,R2 NEXT1:ACALLDISPLAY ;調(diào)用顯示子程序 SJMPLOOP1 SJMP$74;無鍵按下,R2返回FFH,有鍵按下,R2返回鍵碼KEYSUB:ACALLKS1 ;調(diào)用判斷有無鍵按下子程序 JNZLK1;有鍵按下時,(A)≠0轉(zhuǎn)消抖延時 AJMPNOKEY ;無鍵按下返回LK1:ACALLTM6 ;調(diào)用10ms延時子程序 ACALLKS1 ;查有無鍵按下,假設真有鍵按下 JNZLK2;鍵(A)≠0逐列掃描NOKEY:MOVR2,#0FFH;不是真有鍵按下,R2中放無鍵代碼FFH AJMPKEYOUT ;返回LK2:MOVR3,#0FEH ;初始列掃描字(0列)送入R3 MOVR4,#00H ;初始列(0列)號送入R4LK3:MOVDPTR,#7F00H ;DPTR指向8255PA口 MOVA,R3 ;列掃描字送至8255PA口 MOVX@DPTR,A INCDPTR ;DPTR指向8255PC口 INCDPTR MOVXA,@DPTR ;從8255PC口讀入行狀態(tài) JBACC.0,LONE ;查第0行無鍵按下,轉(zhuǎn)查第1行 MOVA,#00H ;第0行有鍵按下,行首鍵碼#00H→A AJMPLKP ;轉(zhuǎn)求鍵碼75LONE:JBACC.1,KNEXT ;查第1行無鍵按下,轉(zhuǎn)查第2行 MOVA,#08H ;第1行有鍵按下,行首鍵碼#08H→ALKP:ADDA,R4 ;求鍵碼,鍵碼=行首鍵碼+列號 MOVR2,A ;鍵碼放入R2中LK4:ACALLKS1 ;等待鍵釋放 JNZLK4 ;鍵未釋放,等待KEYOUT:RET ;鍵掃描結(jié)束,出口狀態(tài)R2:無鍵按下為FFH,有鍵按下為鍵碼KNEXT:INCR4 ;準備掃描下一列,列號加1 MOVA,R3 ;取列掃描字送累加器A JNBACC.7,NOKEY ;判斷8列掃描完否?

RLA ;掃描字左移一位,變?yōu)橄乱涣袙呙枳?MOVR3,A;掃描字送入R3中保存 AJMPLK3;轉(zhuǎn)下一列掃描76KS1:MOVDPTR,#7F00H ;DPTR指向8255PA口 MOVA,#00H ;全掃描字→A MOVX@DPTR,A;全掃描字送往8255PA口 INCDPTR;DPTR指向8255PC口 INCDPTR MOVXA,@DPTR ;讀入PC口行狀態(tài) CPLA;變正邏輯,以高電平表示有鍵按下 ANLA,#03H;屏蔽高4位,只保存低4位行線值 RET;出口狀態(tài):(A)≠0時有鍵按下TM12ms: MOVR7,#20 ;延時10ms子程序TM: MOVR6,#250TM6:DJNZR6,TM6 DJNZR7,TM RET77;顯示子程序,顯示緩沖區(qū)57H~50H的內(nèi)容在8個數(shù)碼管上顯示一次DISPLAY:MOVR0,#57H ;動態(tài)顯示初始化,使R0指向緩沖區(qū)首地址

MOVR3,#7FH ;首位位選字送R3 MOVA,R3DP0:MOVDPTR,#7F01H ;使DPTR指向PB口

MOVX@DPTR,A ;從PB口送出位選字

MOVDPTR,#7F00H ;使DPTR指向PA口

MOVA,@R0 ;讀要顯示數(shù)

ADDA,#0DH ;調(diào)整距離段選碼表首的偏移量

MOVCA,@A+PC ;查表取得段選碼

MOVX@DPTR,A ;段選碼從PA口輸出

ACALLDL1 ;調(diào)用1ms延時子程序

DECR0 ;指向緩沖區(qū)下一單元

MOVA,R3 ;位選碼送累加器A JNBACC.0,DP1 ;判斷8位是否顯示完畢,顯示完返回

RRA ;未顯示完,把位選字變?yōu)橄乱晃贿x字

MOVR3,A ;修改后的位選字送R3 AJMPDP0 ;循環(huán)實現(xiàn)按位序依次顯示DP1:RET78TAB:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H;字段碼表

DB7FH,6FH,77H,7CH,39H,5EH,79H,71HDL1:MOVR7,#2 ;延時子程序DL: MOVR6,#250DL0:DJNZR6,DL0 DJNZR7,DL RET END79C語言鍵盤掃描子程序:#include<reg51.h>#include<absacc.h> //定義絕對地址訪問#defineucharunsignedchar#defineuintunsignedintvoiddelay(uint);//聲明延時函數(shù)voiddisplay(void);//聲明顯示函數(shù)uchar

checkkey();uchar

keyscan(void);uchar

disbuffer[8]={0,1,2,3,4,5,6,7};//定義顯示緩沖區(qū)80voidmain(void){ucharkey;XBYTE[0x7f03]=0x81;//8255A初始化while(1){key=keyscan();if(key!=0xff) {disbuffer[0]=disbuffer[1]; disbuffer[1]=disbuffer[2]; disbuffer[2]=disbuffer[3]; disbuffer[3]=disbuffer[4]; disbuffer[4]=disbuffer[5]; disbuffer[5]=disbuffer[6]; disbuffer[6]=disbuffer[7]; disbuffer[7]=key; }display();//設顯示函數(shù)}}81//************延時函數(shù)************voiddelay(uinti)//延時函數(shù){uintj;for(j=0;j<i;j++){}}//***********顯示函數(shù)voiddisplay(void)//定義顯示函數(shù){ucharcodevalue[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0~F的字段碼表ucharchocode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位選碼表uchari,p,temp;for(i=0;i<8;i++) { XBYTE[0x7f01]=0xff; p=disbuffer[i];//取當前顯示的字符 temp=codevalue[p];//查得顯示字符的字段碼 XBYTE[0x7f00]=temp;//送出字段碼 te

溫馨提示

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

最新文檔

評論

0/150

提交評論