




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
7.4MCS-51與鍵盤的接口7.4.1MCS-51單片機(jī)與鍵盤接口7.4.2MCS-51單片機(jī)與LED顯示器接口7.4.3MCS-51單片機(jī)與行程開(kāi)關(guān)、晶閘管、繼電器的接口單片機(jī)7.4MCS-51與鍵盤的接口7.4.1MCS-57.4.1MCS-51單片機(jī)與鍵盤接口7.4.1鍵盤的工作原理
鍵盤實(shí)際上是一組按鍵開(kāi)關(guān)的集合,平時(shí)按鍵開(kāi)關(guān)總是處于斷開(kāi)狀態(tài),當(dāng)按下鍵時(shí)它才閉合。它的結(jié)構(gòu)和產(chǎn)生的波形如圖所示。P1.1VCCGND(a)KP1.1(b)抖動(dòng)時(shí)間<10ms開(kāi)關(guān)動(dòng)作時(shí)間>100ms“斷開(kāi)”“閉合”<10ms“斷開(kāi)”7.4.1MCS-51單片機(jī)與鍵盤接口7.4.1鍵/S為=0,R=l,可得出A=l,A=0。當(dāng)按壓按鍵時(shí),/S=l,/R=0,可得出A=0,A=1,改變了輸出信號(hào)A的狀態(tài)。若由于機(jī)械開(kāi)關(guān)的接觸抖動(dòng),則/R的狀態(tài)會(huì)在0和1之間變化多次,若/R=l,由于A=0,因此G2門仍然是“有低出高”,不會(huì)影響輸出的狀態(tài)。同理,當(dāng)松開(kāi)按鍵時(shí),/S端出現(xiàn)的接觸抖動(dòng)亦不會(huì)影響輸出的狀態(tài)。因此,圖1所示的電路,開(kāi)關(guān)每按壓一次,A點(diǎn)的輸出信號(hào)僅發(fā)生一次變化。/S為=0,R=l,可得出A=l,A=0。鍵盤的處理主要涉及三個(gè)方面:1.按鍵的識(shí)別通過(guò)檢測(cè)輸出線電平的高低判斷鍵位有無(wú)按下:鍵位未按下,輸出為高鍵位按下,輸出為低
鍵盤的處理主要涉及三個(gè)方面:1.按鍵的識(shí)別通過(guò)檢測(cè)輸出線電2.抖動(dòng)的消除消除按鍵盤抖動(dòng)通常有兩種方法:硬件消抖和軟件消抖。
硬件消抖是通過(guò)在按鍵輸出電路上加一定的硬件線路來(lái)消除抖動(dòng),一般采用R-S觸發(fā)器或單穩(wěn)態(tài)電路。軟件消抖是利用延時(shí)來(lái)跳過(guò)抖動(dòng)過(guò)程。&I/O接口&+5v+5v消除抖動(dòng)電路開(kāi)關(guān)單片機(jī)2.抖動(dòng)的消除消除按鍵盤抖動(dòng)通常有兩種方法:硬件消抖和軟件消3.鍵位的編碼(也叫掃描碼)
當(dāng)軟件實(shí)現(xiàn)查找到一個(gè)鍵被按下后,為了要確定該鍵,一般事先用該鍵對(duì)應(yīng)的行、列的值(行值和列值)或者利用該鍵對(duì)應(yīng)的IO線先組裝一個(gè)關(guān)鍵字-----編碼。
然后通過(guò)按鍵編碼進(jìn)入該鍵對(duì)應(yīng)的按鍵處理程序;3.鍵位的編碼(也叫掃描碼)矩陣式鍵盤通常有兩種方法編碼。(1)用連接鍵盤的I/O線的二進(jìn)制組合進(jìn)行編碼。如(a)圖。(2)順序排列編碼。如(b)圖。處理方法如下:編碼值=行首編碼值X+列號(hào)Y。P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0FEDCBA9876543210(b)第0列第1列第0行第1行P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.088848281484442412824222118141211(a)+5V逐列輸出0以檢查行線行線0,1,2,3分別編碼:80,40,20,10列線0,1,2,3分別編碼:08,04,02,01行線0,1,2,3分別編碼:0,1,2,3列線0,1,2,3分別編碼:0,1,2,3第0行第0列4×行號(hào)+列號(hào)組裝掃描碼行號(hào)+列號(hào)組裝掃描碼矩陣式鍵盤通常有兩種方法編碼。(1)用連接鍵盤的I/O線的二7.4.2獨(dú)立式鍵盤與單片機(jī)的接口鍵盤的結(jié)構(gòu)形式一般有兩種:獨(dú)立式鍵盤與矩陣式鍵盤。
獨(dú)立式鍵盤就是各按鍵相互獨(dú)立,每個(gè)按鍵各接一根I/O口線,每根I/O口線上的按鍵都不會(huì)影響其它的I/O口線。GNDVCCGNDVCC與(b)查詢方式工作的獨(dú)立式鍵盤的結(jié)構(gòu)形式8051(a)中斷方式工作的獨(dú)立式鍵盤的結(jié)構(gòu)形式INT08051P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7按鍵編碼可為:FEH或01H7.4.2獨(dú)立式鍵盤與單片機(jī)的接口鍵盤的結(jié)構(gòu)形式一般有
下面是針對(duì)圖7.4(b)圖查詢方式的匯編語(yǔ)言形式的鍵盤程序??偣灿?個(gè)鍵位,KEY0~KEY7為8個(gè)鍵的功能程序。START:MOVA,#0FFH;
MOVP1,A;置P1口為輸入狀態(tài)
MOVA,P1;鍵狀態(tài)輸入
CPLA JZSTART;沒(méi)有鍵按下,則轉(zhuǎn)開(kāi)始
JBACC.0,K0;檢測(cè)0號(hào)鍵是否按下,按下轉(zhuǎn)
JBACC.1,K1;檢測(cè)1號(hào)鍵是否按下,按下轉(zhuǎn)
JBACC.2,K2;檢測(cè)2號(hào)鍵是否按下,按下轉(zhuǎn)
JBACC.3,K3;檢測(cè)3號(hào)鍵是否按下,按下轉(zhuǎn)
JBACC.4,K4;檢測(cè)4號(hào)鍵是否按下,按下轉(zhuǎn)
JBACC.5,K5;檢測(cè)5號(hào)鍵是否按下,按下轉(zhuǎn)
JBACC.6,K6;檢測(cè)6號(hào)鍵是否按下,按下轉(zhuǎn)
JBACC.7,K7;檢測(cè)7號(hào)鍵是否按下,按下轉(zhuǎn)
JMPSTART;無(wú)鍵按下返回,再順次檢測(cè)下面是針對(duì)圖7.4(b)圖查詢方式的匯編語(yǔ)言形式的鍵K0:AJMPKEY0K1:AJMPKEY1……K7:AJMPKEY7KEY0:…… ;0號(hào)鍵功能程序
JMPSTART;0號(hào)鍵功能程序執(zhí)行完返回KEY1:…… ;1號(hào)鍵功能程序
JMPSTART;1號(hào)鍵功能程序執(zhí)行完返回
……KEY7:…… ;7號(hào)鍵功能程序
JMPSTART;7號(hào)鍵功能程序執(zhí)行完返回K0:AJMPKEY07.4.3矩陣鍵盤與單片機(jī)的接口
矩陣式鍵盤又叫行列式鍵盤。用I/O口線組成行、列結(jié)構(gòu),鍵位設(shè)置在行列的交點(diǎn)上。例如4×4的行、列結(jié)構(gòu)可組成16個(gè)鍵的鍵盤,比一個(gè)鍵位用一根I/O口線的獨(dú)立式鍵盤少了一半的I/O口線。7.4.3矩陣鍵盤與單片機(jī)的接口矩陣式鍵
矩陣鍵盤的連接方法有多種:1可直接連接于單片機(jī)的I/O口線;2可利用擴(kuò)展的并行I/O口(8255、8155等)連接;3也可利用可編程的鍵盤、顯示專用接口芯片
(8279等)進(jìn)行連接等等。其中,利用擴(kuò)展的并行I/O口連接方便靈活,在單片機(jī)應(yīng)用系統(tǒng)中比較常用。矩陣鍵盤的連接方法有多種:下圖就是通過(guò)8255A芯片擴(kuò)展的并行I/O口連接48的矩陣鍵盤。P2.7=0:A口地址為:7F00H;C口地址為:7F02H。掃描法:列線輸出,行線輸入。列線逐列輸出0,某行有按鍵,行線輸入就為0;若無(wú)按鍵,行線輸入全部為1。PA7PA6PA5PA4PA3PA2PA1PA0PC0PC1PC2PC3012345678910111213141516171819202122232425262728293031CS74LS373WRRDA1A0P2.7WRRDALEP0.0~P0.7D0~D7RESET1K20F+5V+5V82555.1K48051編碼值=行首編碼值X+列號(hào)Y=8×行號(hào)+列號(hào)鍵碼=行首鍵號(hào)+列號(hào)(鍵號(hào)必須依次是從左至右書(shū)寫(xiě))
或鍵碼=列首鍵號(hào)+行號(hào)(鍵號(hào)必須依次是從上至下書(shū)寫(xiě))下圖就是通過(guò)8255A芯片擴(kuò)展的并行I/O口連接48的矩陣一.矩陣鍵盤的工作過(guò)程對(duì)矩陣鍵盤的工作過(guò)程可分兩步:第一步是CPU首先檢測(cè)鍵盤上是否有鍵按下;第二步是再識(shí)別是哪一個(gè)鍵按下(通過(guò)掃描碼)。1.檢測(cè)鍵盤上是否有鍵按下處理方法是:將列線送入全掃描字,讀入行線的狀態(tài)來(lái)判別。其具體過(guò)程如下:PA口輸出00H,即所有列線置成低電平,然后將行線電平狀態(tài)讀入累加器A中。如果有鍵按下,總會(huì)有一根行線電平被拉至低電平,從而使行輸入狀態(tài)不全為"1"。一.矩陣鍵盤的工作過(guò)程對(duì)矩陣鍵盤的工作過(guò)程可分兩步:2.識(shí)別鍵盤中哪一個(gè)鍵按下處理方法是:
將列線逐列置低電平,檢查行輸入狀態(tài),稱為逐列掃描。從PA0開(kāi)始,依次輸出“0”,置對(duì)應(yīng)的列線為低電平,然后從PC口讀入行線狀態(tài),如果全為“1”,則按下的鍵不在此列;如果不全為“1”,則按下的鍵必在此列,而且是該列與“0”電平的行線相交的交點(diǎn)上的那個(gè)鍵。為求取編碼,用計(jì)數(shù)器記錄下當(dāng)前掃描列的列號(hào),檢測(cè)到第幾行有鍵按下,就用該行的首鍵碼加列號(hào)得到當(dāng)前按鍵的編碼。2.識(shí)別鍵盤中哪一個(gè)鍵按下處理方法是:1.查詢工作方式
主程序循環(huán)中插入鍵盤檢測(cè)子程序,主程序每循環(huán)一次則鍵盤檢測(cè)子程序被執(zhí)行一次,對(duì)鍵盤進(jìn)行檢測(cè)一次,如果沒(méi)有鍵按下,則跳過(guò)鍵識(shí)別,直接執(zhí)行主程序;如果有鍵按下,則通過(guò)鍵盤掃描子程序識(shí)別按鍵,得到按鍵的編碼值,然后根據(jù)編碼值進(jìn)行相應(yīng)的處理,處理完后再回到主程序執(zhí)行。二.矩陣鍵盤的工作方式開(kāi)始有鍵按下否?調(diào)用12ms延時(shí)子程序有鍵按下否?判閉合鍵,編碼入棧保護(hù)閉合鍵釋放否?編碼A返回否否否是是是
鍵盤掃描子程序1.查詢工作方式主程序循環(huán)中插入鍵盤檢測(cè)子程
鍵盤掃描子程序如下:(硬件線路如圖7.4,8255A的A口、B口、C口和控制口地址分別為7F00H、7F01H、7F02H、7F03H,設(shè)8255A已在主程序中初始化。已設(shè)定為A口方式0輸出,C口的低4位方式0輸入。)KEY1:ACALLKS1
;調(diào)用判斷有無(wú)鍵按下子程序
JNZLK1;有鍵按下時(shí),(A)≠0轉(zhuǎn)消抖延時(shí)KEY2:ACALLTM6ms AJMPexit: ;無(wú)鍵按下返回LK1:ACALLTM12ms;調(diào)12ms延時(shí)子程序
ACALLKS1;查有無(wú)鍵按下,若有則真有鍵按下
JNZLK2 ;鍵(A)≠0逐列掃描
AJMPexit ;不是真有鍵按下,返回LK2:MOVR2,#0FEH;初始列掃描字(0列)送入R2 MOVR4,#00H;初始列(0列)號(hào)送入R4LK4:MOVDPTR,#7F00H;DPTR指向8255PA口
MOVA,R2 ;列掃描字送至8255PA口
MOVX@DPTR,A INCDPTR ;DPTR指向8255PC口
INCDPTR鍵盤掃描子程序如下:(硬件線路如圖7.4,8 MOVXA,@DPTR ;從8255PC口讀入行狀態(tài)
JBACC.0,LONE;查第0行無(wú)鍵按下,轉(zhuǎn)查第1行
MOVA,#00H ;第0行有鍵按下,行首鍵碼#00H→A AJMPLKP ;轉(zhuǎn)求鍵碼LONE:JBACC.1,LTWO;查第1行無(wú)鍵按下,轉(zhuǎn)查第2行
MOVA,#08H ;第1行有鍵按下,行首鍵碼#08H→A AJMPLKP ;轉(zhuǎn)求鍵碼LTWO:JBACC.2,LTHR ;查第2行無(wú)鍵按下,轉(zhuǎn)查第3行
MOVA,#10H ;第2行有鍵按下,行首鍵碼#10H→A AJMPLKP ;轉(zhuǎn)求鍵碼LTHR:JBACC.3,NEXT ;查第3行無(wú)鍵按下,轉(zhuǎn)該查下一列
MOVA,#18H ;第3行有鍵按下,行首鍵碼#18H→ALKP:ADDA,R4 ;求鍵碼,鍵碼=行首鍵碼+列號(hào)
PUSHACC ;鍵碼進(jìn)棧保護(hù)LK3:ACALLKS1 ;等待鍵釋放
JNZLK3 ;鍵未釋放,等待
POPACC ;鍵釋放,鍵碼→AEXIT: RET ;鍵掃描結(jié)束,出口狀態(tài)(A)=鍵碼 MOVXA,@DPTR ;從8255PC口NEXT:INCR4 ;準(zhǔn)備掃描下一列,列號(hào)加1 MOVA,R2 ;取列掃描字送累加器A JNBACC.7,KEND;判斷8列掃描否?掃描完返回
RLA ;掃描字左移一位,變?yōu)橄乱涣袙呙枳?/p>
MOVR2,A ;掃描字送入R2保存
AJMPLK4 ;轉(zhuǎn)下一列掃描KEND:AJMPKEY1
KS1:
MOVDPTR,#7F00H;DPTR指向8255的PA口
MOVA,#00H ;全掃描字→A MOVX@DPTR,A;全掃描字送往8255的PA口
INCDPTR ;DPTR指向8255的PC口
INCDPTR MOVXA,@DPTR ;讀入PC口行狀態(tài)
CPLA
;變正邏輯,以高電平表示有鍵按下
ANLA,#0FH ;屏蔽高4位,只保留低4位行線值
RET ;出口狀態(tài):(A)≠0時(shí)有鍵按下執(zhí)行KS1子程序的結(jié)果是:有閉合鍵則(A)≠0;無(wú)閉合鍵則(A)=0。CPLA;負(fù)邏輯不直觀,常采取行列線加反相器或軟件求反的方法把鍵盤改成正邏輯。NEXT:INCR4TM12ms:MOVR7,#18H;延時(shí)12ms子程序TM: MOVR6,#0FFHTM6: DJNZR6,TM6 DJNZR7,TM RETTM6ms:MOVR7,#0CH;延時(shí)6ms子程序TM2: MOVR6,#0FFHTM62:DJNZR6,TM6 DJNZR7,TM RETC語(yǔ)言鍵盤掃描子程序:略2.定時(shí)掃描工作方式3.中斷處理方式TM12ms:MOVR7,#18H;延時(shí)1C子程序:#include<reg51.h>#include<absacc.h>#defineucharunsignedchar#defineuintunsignedintVoiddelay(uint);Uchar
checkkey(void);Uchar
keyscan(void);Voidmain(void{ucharkey;While(1){key=keyscan();delay(2000);}}Voiddelay(uinti){uintj;For(j=0;j<I;j++){}}Ucharcheckkey(){UcharI;XBYTE[0x7f00]=0;i=XBYTE[7f02];i=i&0x0f;If(i==0x0f)return(0);Elsereturn(0xff);}C子程序:Ucharcheckkey()Ucharkeysan(){ucharscancode;//列掃描碼變量
Ucharcodevalue;//鍵值Ucharm;//行首編碼變量Uchark;//行檢測(cè)碼UcharI,j;If(checkkey()==0)return(0xff);//無(wú),返回ffElse{ delay(200);//延時(shí)
If(checkkey()==0)return(0xff);else{scancode=0xfe;m=0;//for(i=0;i<8;i++){
k=0x01;//行檢測(cè)碼
XBYTE[0x7f00]=scancode;
for(j=0;j<4;j++){
if((XBYTE[0x7f02]&k])==0){codevalue=m+i;注意書(shū)錯(cuò)
while(checkkey()!=0);//等待按鍵釋放
return(codevalue);//返回編碼
}else
{m=m+8;//下一行首編碼
k=k<<1;}
}
scancode=~((~scancode)<<1);注意書(shū)錯(cuò)
}}}Ucharkeysan()fo7.5MCS-51單片機(jī)與LED顯示器接口7.5.1LED顯示器的結(jié)構(gòu)與原理
在單片機(jī)應(yīng)用系統(tǒng)中通常使用的是8段式LED數(shù)碼管顯示器,它有共陰極和共陽(yáng)極兩種,如圖所示。abcdefgdpcomabcdefgdpcomabcdefgdp10987612345gfcomabedcomcdp(a)共陰極結(jié)構(gòu)(c)管腳圖(b)共陽(yáng)極結(jié)構(gòu)代碼位D7D6D5D4D3D2D1D0顯示段hgfedcbaLED(LightEmitingDiode)7.5MCS-51單片機(jī)與LED顯示器接口7.5.1
其中:(a)為共陰極結(jié)構(gòu)。(b)為共陽(yáng)極結(jié)構(gòu)。(c)圖為管腳圖,從a~g管腳輸入不同的8位二進(jìn)制編碼,可顯示不同的數(shù)字或字符。共陰極和共陽(yáng)極的字段碼互為反碼。其中:(a)為共陰極結(jié)構(gòu)。(b)為共陽(yáng)極結(jié)構(gòu)7.5.2LED數(shù)碼管顯示器的譯碼方式一.硬件譯碼方式譯碼方式是指由顯示字符轉(zhuǎn)換得到對(duì)應(yīng)的字段碼的方式。
硬件譯碼方式是指利用專門的硬件電路來(lái)實(shí)現(xiàn)顯示字符到字段碼的轉(zhuǎn)換,這樣的硬件電路有很多,比如MOTORLA公司生產(chǎn)的MC14495芯片就是其中的一種,MC14495是共陰極一位十六進(jìn)制數(shù)——字段碼轉(zhuǎn)換芯片,能夠輸出用四位二進(jìn)制表示形式的一位十六進(jìn)制數(shù)的七位字段碼,不帶小數(shù)點(diǎn)。它的內(nèi)部結(jié)構(gòu)如圖。4鎖存器地址譯碼和字段碼ROM陣列ABCDLE569107VssVDD816abcdefgh+iVCR11121314151234二.軟件譯碼方式
軟件譯碼方式就是通過(guò)編寫(xiě)軟件譯碼程序,通過(guò)譯碼程序來(lái)得到要顯示的字符的字段碼。7.5.2LED數(shù)碼管顯示器的譯碼方式一.硬件譯碼方式7.5.3LED數(shù)碼管的顯示方式
顯示多位數(shù)據(jù)的兩種電路:1.靜態(tài)顯示;2.動(dòng)態(tài)顯示。
對(duì)應(yīng)字位線:D0D1D2D3D4D5
abhCOM
abhCOM
abhCOMafbge
cdh段控和位控靜態(tài)顯示動(dòng)態(tài)顯示7.5.3LED數(shù)碼管的顯示方式顯示多位數(shù)據(jù)的一、LED靜態(tài)顯示LED靜態(tài)顯示時(shí),其公共端直接接地(共陰極)或接電源(共陽(yáng)極),各段選線分別與I/O口線相連。要顯示字符,直接在I/O線送相應(yīng)的字段碼。abcdefgdpI/O(1)abcdefgdpI/O(2)特點(diǎn):顯示亮度大,硬件和軟件都較簡(jiǎn)單,應(yīng)用廣泛。
顯示緩沖區(qū)與多位LED對(duì)應(yīng)關(guān)系:每個(gè)LED需要一個(gè)8位并行口。共陰極一、LED靜態(tài)顯示LED靜態(tài)顯示時(shí),其公共端直例:顯示80C51片內(nèi)RAM中以30H為首地址的8位字形數(shù)的程序:靜態(tài)顯示電路“0”例:顯示80C51片內(nèi)RAM中以30H為首地址的8位靜態(tài)顯示DIR:PUSH ACC ;保護(hù)現(xiàn)場(chǎng)
PUSH DPH PUSH DPL MOV R2,#08H ;顯示8個(gè)數(shù)
MOV R0,#30H ;顯示緩沖區(qū)地址送入R0DL0:MOV A,@R0 ;取要顯示的數(shù)作查表偏移量
MOV DPTR,#TAB ;指向字形碼表首
MOVC A,@A+DPTR ;查表得字形碼
MOV SBUF,A ;發(fā)送顯示DL1:JNB TI,DL1 ;等待發(fā)送完一楨數(shù)據(jù)
CLR TI ;清標(biāo)志,準(zhǔn)備繼續(xù)發(fā)送
INC R0 ;更新顯示單元
DJNZ R2,DL0 ;重復(fù)顯示所有數(shù)碼管
POP DPL ;恢復(fù)現(xiàn)場(chǎng)
POP DPH POP ACC RETTAB:DB 0C0H,0F9H,0A4H,0B0H,99H;0,1,2,3,4
DB 92H,82H,0F8H,80H,90H,88H;5,6,7,8,9,A
DB 83H,0C6H,0A1H,86H,8EH;B,C,D,E,F(xiàn)程序:DIR:PUSH ACC ;保護(hù)現(xiàn)場(chǎng)程序:二、LED動(dòng)態(tài)顯示方式LED動(dòng)態(tài)顯示是將所有的數(shù)碼管的段選線并接在一起,用一個(gè)I/O口控制,公共端不是直接接地(共陰極)或電源(共陽(yáng)極),而是通過(guò)相應(yīng)的I/O口線控制。D3D2D1D0I/O(1)I/O(2)
分時(shí)輪流選通數(shù)碼管的公共端,使得各數(shù)碼管輪流導(dǎo)通,在選通相應(yīng)LED后,即在顯示字段上得到顯示字形碼。特點(diǎn):提高數(shù)碼管的發(fā)光效率,可簡(jiǎn)化硬件線路。多位LED共用一個(gè)8位字段口(共陰極或共陽(yáng)極),各位LED公共端用字位口控制,掃描輸出顯示不同字形。二、LED動(dòng)態(tài)顯示方式LED動(dòng)態(tài)顯示是將所有
設(shè)數(shù)碼管為共陽(yáng)極,工作過(guò)程:
第一步使右邊第一個(gè)管的公共端D0為1,其余管的公共端為0,同時(shí)在I/O(1)上送右邊第一個(gè)數(shù)碼管的字段碼,這時(shí),只有右邊第一個(gè)數(shù)碼管顯示,其余不顯示;
第二步使右邊第二個(gè)管的公共端D1為1,其余的公共端為0,同時(shí)在I/O(1)上送右邊第二個(gè)數(shù)碼管的字段碼,這時(shí),只有右邊第二個(gè)數(shù)碼管顯示,其余不顯示,
依此類推,直到最后一個(gè),這樣四個(gè)數(shù)碼管輪流顯示相應(yīng)的信息,一個(gè)循環(huán)完后,下一循環(huán)又這樣輪流顯示,由于人的視覺(jué)滯留,只要循環(huán)的周期足夠快,看起來(lái)所有的數(shù)碼管都是一起顯示的了。這就是動(dòng)態(tài)顯示的原理。而這個(gè)循環(huán)周期對(duì)于計(jì)算機(jī)來(lái)說(shuō)很容易實(shí)現(xiàn)。所以在單片機(jī)中經(jīng)常用到動(dòng)態(tài)顯示。設(shè)數(shù)碼管為共陽(yáng)極,工作過(guò)程:三、LCD顯示LCD(LiquidCrystalDisplay):它是一種被動(dòng)式的顯示器,即液晶本身并不發(fā)光,而是利用液晶經(jīng)過(guò)處理后能改變光線通過(guò)方向的特性,而達(dá)到白底黑字或黑底白字顯示的目的。
LCD只能工作在靜態(tài)顯示方式。并要求加上專門的驅(qū)動(dòng)芯片4056。
原理與LED類似??!三、LCD顯示LCD(LiquidCrystalDisp串行口控制的靜態(tài)LCD顯示(2位)輸出2位顯示,即1字節(jié)。串行口控制的靜態(tài)LCD顯示(2位)輸出2位顯示,即1字節(jié)。程序:#include<reg51.h>#defineucharunsignedcharucharbyte=0x59;voiddisplay(ucharx){ SBUF=x; /*由串行口輸出*/ while(TI==0); /*等待8位發(fā)送結(jié)束*/ TI=0;}voidmain(void){ display(byte);}
因4056是BCD的LCD驅(qū)動(dòng)芯片,故byte中包含的BCD碼可直接輸出顯示。程序:#include<reg51.h>因4一.硬件譯碼靜態(tài)顯示下圖是一個(gè)兩位數(shù)碼管硬件譯碼靜態(tài)顯示的接口電路圖。abcdefgMC14495abcdefgabcdefgABCDLEMC14495abcdefgABCDLEP1.0P1.1P1.2P1.3P1.4P1.580517.5.4LED顯示器與單片機(jī)的接口LED顯示器從譯碼方式上有硬件譯碼方式和軟件譯碼方式。從顯示方式上有靜態(tài)顯示方式和動(dòng)態(tài)顯示方式。在使用時(shí)可以把它們組合起來(lái)。在實(shí)際應(yīng)用時(shí),如果數(shù)碼管個(gè)數(shù)較少,通常用硬件譯碼靜態(tài)顯示,在數(shù)碼管個(gè)數(shù)較多時(shí),則通常用軟件譯碼動(dòng)態(tài)顯示。一.硬件譯碼靜態(tài)顯示下圖是一個(gè)兩位數(shù)碼管硬件譯碼靜態(tài)顯示的接二.軟件譯碼動(dòng)態(tài)顯示
下圖是一個(gè)8位軟件譯碼動(dòng)態(tài)顯示的接口電路圖。用8255A擴(kuò)展并行I/O口接數(shù)碼管,數(shù)碼管采用動(dòng)態(tài)顯示方式,8位數(shù)碼管的段選線并聯(lián)與8255A的A口通過(guò)74LS373相連,8位數(shù)碼管的公共端通過(guò)74LS373分別與8255A的B口相連。也即8255A的B口輸出位選碼選擇要顯示的數(shù)碼管,8255A的A口輸出字段碼使數(shù)碼管顯示相應(yīng)的字符,8255A的A口和B口都工作于方式0輸出。
A口、B口、C口和控制口的地址分別為7F00H、7F01H、7F02H和7F03H。二.軟件譯碼動(dòng)態(tài)顯示下圖是一個(gè)8位軟件譯碼動(dòng)態(tài)顯示D0D1D2D7Q0Q1Q2Q3Q4Q5Q6Q7D0D1D2D3D4D5D6D7GOEVCC74LS373Q0Q1Q2Q3Q4Q5Q6Q7D0D1D2D3D4D5D6D7GOEVCC74LS373PA0PA1PA2PA3PA4PA5PA6PA7PB0PB1PB2PB3PB4PB5PB6PB7CSWRRD74LS373P2.7WRRDALEP0.0~P0.78051D0~D7A1A0GA1A08255地址:A口:7F00HB口:7F01HC口:7F02H控制口:7F03H
………共陰極D0D1D2D7Q0D0GOEVCC74LS373Q0D0顯示完畢?NY8255初始化動(dòng)態(tài)顯示初始化送段碼和位掃描碼讓第一個(gè)數(shù)碼管亮1ms生成下一個(gè)數(shù)碼管的位碼指針指向下一個(gè)顯示單元指針指向顯示緩沖區(qū)(8字節(jié))首單元從顯示緩沖區(qū)取數(shù)碼管要顯示的數(shù)查表求該數(shù)對(duì)應(yīng)的共陰極段碼12345678顯示完畢?NY8255初始化動(dòng)態(tài)顯示初始化送段碼和位掃描碼讓
軟件譯碼動(dòng)態(tài)顯示匯編語(yǔ)言程序?yàn)椋海ㄔO(shè)8個(gè)數(shù)碼管的顯示緩沖區(qū)為片內(nèi)RAM的57H~50H單元)DISPLAY:MOVA,#10000000B ;8255初始化
MOVDPTR,#7F03H;使DPTR指向8255控制寄存器端口
MOVX@DPTR,A MOVR0,#57H;動(dòng)態(tài)顯示初始化,使R0指向緩沖區(qū)首址
MOVR3,#7FH
;首位位選字送R3 MOVA,R3LD0:MOVDPTR,#7F01H ;使DPTR指向PB口
MOVX@DPTR,A ;選通顯示器高位(最右端一位) DECDPTR ;使DPTR指向PA口
MOVA,@R0 ;讀要顯示數(shù)
ADDA,#0DH ;調(diào)整距段選碼表首的偏移量
MOVCA,@A+PC ;查表取得段選碼
MOVX@DPTR,A ;段選碼從PA口輸出
ACALLDL1 ;調(diào)用1ms延時(shí)子程序
DECR0 ;指向緩沖區(qū)下一單元
MOVA,R3 ;位選碼送累加器A軟件譯碼動(dòng)態(tài)顯示匯編語(yǔ)言程序?yàn)椋?JNBACC.0,LD1;判斷8位是否顯示完畢,顯示完返回
RRA ;未顯示完,把位選字變?yōu)橄乱晃贿x字
MOVR3,A;修改后的位選字送R3 AJMPLD0;循環(huán)實(shí)現(xiàn)按位序依次顯示LD1:RETTAB:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H
;共陰極字段碼表DB:7FH,6FH,77H,7CH,39H,5EH,79H,71HDL1:MOVR7,#02H ;延時(shí)子程序DL:MOVR6,#0FFHDL0:DJNZR6,DL0DJNZR7,DLRET JNBACC.0,LD1;判斷8位是軟件譯碼動(dòng)態(tài)顯示C語(yǔ)言程序?yàn)椋?include<reg51.h>#include<absacc.h> //定義絕對(duì)地址訪問(wèn)#defineucharunsignedchar#defineuintunsignedintvoiddelay(uint); //聲明延時(shí)函數(shù)voiddisplay(void); //聲明顯示函數(shù)uchardisbuffer[8]={0,1,2,3,4,5,6,7};//定義顯示緩沖區(qū)voidmain(void){XBYTE[0x7f03]=0x80;//8255A初始化while(1){display(); //設(shè)顯示函數(shù)}}//************延時(shí)函數(shù)************voiddelay(uinti) //延時(shí)函數(shù){uintj;for(j=0;j<i;j++){}}軟件譯碼動(dòng)態(tài)顯示C語(yǔ)言程序?yàn)椋?/***********顯示函數(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++){p=disbuffer[i]; //取當(dāng)前顯示的字符temp=codevalue[p]; //查得顯示字符的字段碼XBYTE[0x7f00]=temp; //送出字段碼(PA口)temp=chocode[i]; //取當(dāng)前的位選碼XBYTE[0x7f01]=temp; //送出位選碼(PB口)delay(20); //延時(shí)1ms}}//***********顯示函數(shù)************7.6MCS-51單片機(jī)與行程開(kāi)關(guān)、晶閘管、繼電器的接口7.6.1行程開(kāi)關(guān)、繼電器與MCS-51單片機(jī)的接口行程開(kāi)關(guān)和繼電器常開(kāi)觸點(diǎn)與單片機(jī)的接口如圖所示。E1E2S10K10K10K10F光電耦合器件單片機(jī)的I/O引腳開(kāi)關(guān)7.6MCS-51單片機(jī)與行程開(kāi)關(guān)、晶閘管、繼電器的接口7.6.2晶閘管與MCS-51單片機(jī)的接口8051P1.0P1.1過(guò)零電路大功率晶閘管及負(fù)載5V5V740774079118012126546410K1000.1F~220V4N40MOC3041RsCs7.6.2晶閘管與MCS-51單片機(jī)的接口8051P17.6.3繼電器與MCS-51單片機(jī)的接口8051P1.17406VD1R+5VVCCVD2S1V18051P1.1R+5VS174064N25R1R2V1VD1VCC7.6.3繼電器與MCS-51單片機(jī)的接口8051P17.6.4蜂鳴器與MCS-51單片機(jī)的接口8051P1.07406+5VPB2130UP002A8051P1.0+5VPB2130UP002AR1R2V17.6.4蜂鳴器與MCS-51單片機(jī)的接口8051P1.第7章2+MCS-51與鍵盤的接口課件7.4MCS-51與鍵盤的接口7.4.1MCS-51單片機(jī)與鍵盤接口7.4.2MCS-51單片機(jī)與LED顯示器接口7.4.3MCS-51單片機(jī)與行程開(kāi)關(guān)、晶閘管、繼電器的接口單片機(jī)7.4MCS-51與鍵盤的接口7.4.1MCS-57.4.1MCS-51單片機(jī)與鍵盤接口7.4.1鍵盤的工作原理
鍵盤實(shí)際上是一組按鍵開(kāi)關(guān)的集合,平時(shí)按鍵開(kāi)關(guān)總是處于斷開(kāi)狀態(tài),當(dāng)按下鍵時(shí)它才閉合。它的結(jié)構(gòu)和產(chǎn)生的波形如圖所示。P1.1VCCGND(a)KP1.1(b)抖動(dòng)時(shí)間<10ms開(kāi)關(guān)動(dòng)作時(shí)間>100ms“斷開(kāi)”“閉合”<10ms“斷開(kāi)”7.4.1MCS-51單片機(jī)與鍵盤接口7.4.1鍵/S為=0,R=l,可得出A=l,A=0。當(dāng)按壓按鍵時(shí),/S=l,/R=0,可得出A=0,A=1,改變了輸出信號(hào)A的狀態(tài)。若由于機(jī)械開(kāi)關(guān)的接觸抖動(dòng),則/R的狀態(tài)會(huì)在0和1之間變化多次,若/R=l,由于A=0,因此G2門仍然是“有低出高”,不會(huì)影響輸出的狀態(tài)。同理,當(dāng)松開(kāi)按鍵時(shí),/S端出現(xiàn)的接觸抖動(dòng)亦不會(huì)影響輸出的狀態(tài)。因此,圖1所示的電路,開(kāi)關(guān)每按壓一次,A點(diǎn)的輸出信號(hào)僅發(fā)生一次變化。/S為=0,R=l,可得出A=l,A=0。鍵盤的處理主要涉及三個(gè)方面:1.按鍵的識(shí)別通過(guò)檢測(cè)輸出線電平的高低判斷鍵位有無(wú)按下:鍵位未按下,輸出為高鍵位按下,輸出為低
鍵盤的處理主要涉及三個(gè)方面:1.按鍵的識(shí)別通過(guò)檢測(cè)輸出線電2.抖動(dòng)的消除消除按鍵盤抖動(dòng)通常有兩種方法:硬件消抖和軟件消抖。
硬件消抖是通過(guò)在按鍵輸出電路上加一定的硬件線路來(lái)消除抖動(dòng),一般采用R-S觸發(fā)器或單穩(wěn)態(tài)電路。軟件消抖是利用延時(shí)來(lái)跳過(guò)抖動(dòng)過(guò)程。&I/O接口&+5v+5v消除抖動(dòng)電路開(kāi)關(guān)單片機(jī)2.抖動(dòng)的消除消除按鍵盤抖動(dòng)通常有兩種方法:硬件消抖和軟件消3.鍵位的編碼(也叫掃描碼)
當(dāng)軟件實(shí)現(xiàn)查找到一個(gè)鍵被按下后,為了要確定該鍵,一般事先用該鍵對(duì)應(yīng)的行、列的值(行值和列值)或者利用該鍵對(duì)應(yīng)的IO線先組裝一個(gè)關(guān)鍵字-----編碼。
然后通過(guò)按鍵編碼進(jìn)入該鍵對(duì)應(yīng)的按鍵處理程序;3.鍵位的編碼(也叫掃描碼)矩陣式鍵盤通常有兩種方法編碼。(1)用連接鍵盤的I/O線的二進(jìn)制組合進(jìn)行編碼。如(a)圖。(2)順序排列編碼。如(b)圖。處理方法如下:編碼值=行首編碼值X+列號(hào)Y。P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0FEDCBA9876543210(b)第0列第1列第0行第1行P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.088848281484442412824222118141211(a)+5V逐列輸出0以檢查行線行線0,1,2,3分別編碼:80,40,20,10列線0,1,2,3分別編碼:08,04,02,01行線0,1,2,3分別編碼:0,1,2,3列線0,1,2,3分別編碼:0,1,2,3第0行第0列4×行號(hào)+列號(hào)組裝掃描碼行號(hào)+列號(hào)組裝掃描碼矩陣式鍵盤通常有兩種方法編碼。(1)用連接鍵盤的I/O線的二7.4.2獨(dú)立式鍵盤與單片機(jī)的接口鍵盤的結(jié)構(gòu)形式一般有兩種:獨(dú)立式鍵盤與矩陣式鍵盤。
獨(dú)立式鍵盤就是各按鍵相互獨(dú)立,每個(gè)按鍵各接一根I/O口線,每根I/O口線上的按鍵都不會(huì)影響其它的I/O口線。GNDVCCGNDVCC與(b)查詢方式工作的獨(dú)立式鍵盤的結(jié)構(gòu)形式8051(a)中斷方式工作的獨(dú)立式鍵盤的結(jié)構(gòu)形式INT08051P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7按鍵編碼可為:FEH或01H7.4.2獨(dú)立式鍵盤與單片機(jī)的接口鍵盤的結(jié)構(gòu)形式一般有
下面是針對(duì)圖7.4(b)圖查詢方式的匯編語(yǔ)言形式的鍵盤程序??偣灿?個(gè)鍵位,KEY0~KEY7為8個(gè)鍵的功能程序。START:MOVA,#0FFH;
MOVP1,A;置P1口為輸入狀態(tài)
MOVA,P1;鍵狀態(tài)輸入
CPLA JZSTART;沒(méi)有鍵按下,則轉(zhuǎn)開(kāi)始
JBACC.0,K0;檢測(cè)0號(hào)鍵是否按下,按下轉(zhuǎn)
JBACC.1,K1;檢測(cè)1號(hào)鍵是否按下,按下轉(zhuǎn)
JBACC.2,K2;檢測(cè)2號(hào)鍵是否按下,按下轉(zhuǎn)
JBACC.3,K3;檢測(cè)3號(hào)鍵是否按下,按下轉(zhuǎn)
JBACC.4,K4;檢測(cè)4號(hào)鍵是否按下,按下轉(zhuǎn)
JBACC.5,K5;檢測(cè)5號(hào)鍵是否按下,按下轉(zhuǎn)
JBACC.6,K6;檢測(cè)6號(hào)鍵是否按下,按下轉(zhuǎn)
JBACC.7,K7;檢測(cè)7號(hào)鍵是否按下,按下轉(zhuǎn)
JMPSTART;無(wú)鍵按下返回,再順次檢測(cè)下面是針對(duì)圖7.4(b)圖查詢方式的匯編語(yǔ)言形式的鍵K0:AJMPKEY0K1:AJMPKEY1……K7:AJMPKEY7KEY0:…… ;0號(hào)鍵功能程序
JMPSTART;0號(hào)鍵功能程序執(zhí)行完返回KEY1:…… ;1號(hào)鍵功能程序
JMPSTART;1號(hào)鍵功能程序執(zhí)行完返回
……KEY7:…… ;7號(hào)鍵功能程序
JMPSTART;7號(hào)鍵功能程序執(zhí)行完返回K0:AJMPKEY07.4.3矩陣鍵盤與單片機(jī)的接口
矩陣式鍵盤又叫行列式鍵盤。用I/O口線組成行、列結(jié)構(gòu),鍵位設(shè)置在行列的交點(diǎn)上。例如4×4的行、列結(jié)構(gòu)可組成16個(gè)鍵的鍵盤,比一個(gè)鍵位用一根I/O口線的獨(dú)立式鍵盤少了一半的I/O口線。7.4.3矩陣鍵盤與單片機(jī)的接口矩陣式鍵
矩陣鍵盤的連接方法有多種:1可直接連接于單片機(jī)的I/O口線;2可利用擴(kuò)展的并行I/O口(8255、8155等)連接;3也可利用可編程的鍵盤、顯示專用接口芯片
(8279等)進(jìn)行連接等等。其中,利用擴(kuò)展的并行I/O口連接方便靈活,在單片機(jī)應(yīng)用系統(tǒng)中比較常用。矩陣鍵盤的連接方法有多種:下圖就是通過(guò)8255A芯片擴(kuò)展的并行I/O口連接48的矩陣鍵盤。P2.7=0:A口地址為:7F00H;C口地址為:7F02H。掃描法:列線輸出,行線輸入。列線逐列輸出0,某行有按鍵,行線輸入就為0;若無(wú)按鍵,行線輸入全部為1。PA7PA6PA5PA4PA3PA2PA1PA0PC0PC1PC2PC3012345678910111213141516171819202122232425262728293031CS74LS373WRRDA1A0P2.7WRRDALEP0.0~P0.7D0~D7RESET1K20F+5V+5V82555.1K48051編碼值=行首編碼值X+列號(hào)Y=8×行號(hào)+列號(hào)鍵碼=行首鍵號(hào)+列號(hào)(鍵號(hào)必須依次是從左至右書(shū)寫(xiě))
或鍵碼=列首鍵號(hào)+行號(hào)(鍵號(hào)必須依次是從上至下書(shū)寫(xiě))下圖就是通過(guò)8255A芯片擴(kuò)展的并行I/O口連接48的矩陣一.矩陣鍵盤的工作過(guò)程對(duì)矩陣鍵盤的工作過(guò)程可分兩步:第一步是CPU首先檢測(cè)鍵盤上是否有鍵按下;第二步是再識(shí)別是哪一個(gè)鍵按下(通過(guò)掃描碼)。1.檢測(cè)鍵盤上是否有鍵按下處理方法是:將列線送入全掃描字,讀入行線的狀態(tài)來(lái)判別。其具體過(guò)程如下:PA口輸出00H,即所有列線置成低電平,然后將行線電平狀態(tài)讀入累加器A中。如果有鍵按下,總會(huì)有一根行線電平被拉至低電平,從而使行輸入狀態(tài)不全為"1"。一.矩陣鍵盤的工作過(guò)程對(duì)矩陣鍵盤的工作過(guò)程可分兩步:2.識(shí)別鍵盤中哪一個(gè)鍵按下處理方法是:
將列線逐列置低電平,檢查行輸入狀態(tài),稱為逐列掃描。從PA0開(kāi)始,依次輸出“0”,置對(duì)應(yīng)的列線為低電平,然后從PC口讀入行線狀態(tài),如果全為“1”,則按下的鍵不在此列;如果不全為“1”,則按下的鍵必在此列,而且是該列與“0”電平的行線相交的交點(diǎn)上的那個(gè)鍵。為求取編碼,用計(jì)數(shù)器記錄下當(dāng)前掃描列的列號(hào),檢測(cè)到第幾行有鍵按下,就用該行的首鍵碼加列號(hào)得到當(dāng)前按鍵的編碼。2.識(shí)別鍵盤中哪一個(gè)鍵按下處理方法是:1.查詢工作方式
主程序循環(huán)中插入鍵盤檢測(cè)子程序,主程序每循環(huán)一次則鍵盤檢測(cè)子程序被執(zhí)行一次,對(duì)鍵盤進(jìn)行檢測(cè)一次,如果沒(méi)有鍵按下,則跳過(guò)鍵識(shí)別,直接執(zhí)行主程序;如果有鍵按下,則通過(guò)鍵盤掃描子程序識(shí)別按鍵,得到按鍵的編碼值,然后根據(jù)編碼值進(jìn)行相應(yīng)的處理,處理完后再回到主程序執(zhí)行。二.矩陣鍵盤的工作方式開(kāi)始有鍵按下否?調(diào)用12ms延時(shí)子程序有鍵按下否?判閉合鍵,編碼入棧保護(hù)閉合鍵釋放否?編碼A返回否否否是是是
鍵盤掃描子程序1.查詢工作方式主程序循環(huán)中插入鍵盤檢測(cè)子程
鍵盤掃描子程序如下:(硬件線路如圖7.4,8255A的A口、B口、C口和控制口地址分別為7F00H、7F01H、7F02H、7F03H,設(shè)8255A已在主程序中初始化。已設(shè)定為A口方式0輸出,C口的低4位方式0輸入。)KEY1:ACALLKS1
;調(diào)用判斷有無(wú)鍵按下子程序
JNZLK1;有鍵按下時(shí),(A)≠0轉(zhuǎn)消抖延時(shí)KEY2:ACALLTM6ms AJMPexit: ;無(wú)鍵按下返回LK1:ACALLTM12ms;調(diào)12ms延時(shí)子程序
ACALLKS1;查有無(wú)鍵按下,若有則真有鍵按下
JNZLK2 ;鍵(A)≠0逐列掃描
AJMPexit ;不是真有鍵按下,返回LK2:MOVR2,#0FEH;初始列掃描字(0列)送入R2 MOVR4,#00H;初始列(0列)號(hào)送入R4LK4:MOVDPTR,#7F00H;DPTR指向8255PA口
MOVA,R2 ;列掃描字送至8255PA口
MOVX@DPTR,A INCDPTR ;DPTR指向8255PC口
INCDPTR鍵盤掃描子程序如下:(硬件線路如圖7.4,8 MOVXA,@DPTR ;從8255PC口讀入行狀態(tài)
JBACC.0,LONE;查第0行無(wú)鍵按下,轉(zhuǎn)查第1行
MOVA,#00H ;第0行有鍵按下,行首鍵碼#00H→A AJMPLKP ;轉(zhuǎn)求鍵碼LONE:JBACC.1,LTWO;查第1行無(wú)鍵按下,轉(zhuǎn)查第2行
MOVA,#08H ;第1行有鍵按下,行首鍵碼#08H→A AJMPLKP ;轉(zhuǎn)求鍵碼LTWO:JBACC.2,LTHR ;查第2行無(wú)鍵按下,轉(zhuǎn)查第3行
MOVA,#10H ;第2行有鍵按下,行首鍵碼#10H→A AJMPLKP ;轉(zhuǎn)求鍵碼LTHR:JBACC.3,NEXT ;查第3行無(wú)鍵按下,轉(zhuǎn)該查下一列
MOVA,#18H ;第3行有鍵按下,行首鍵碼#18H→ALKP:ADDA,R4 ;求鍵碼,鍵碼=行首鍵碼+列號(hào)
PUSHACC ;鍵碼進(jìn)棧保護(hù)LK3:ACALLKS1 ;等待鍵釋放
JNZLK3 ;鍵未釋放,等待
POPACC ;鍵釋放,鍵碼→AEXIT: RET ;鍵掃描結(jié)束,出口狀態(tài)(A)=鍵碼 MOVXA,@DPTR ;從8255PC口NEXT:INCR4 ;準(zhǔn)備掃描下一列,列號(hào)加1 MOVA,R2 ;取列掃描字送累加器A JNBACC.7,KEND;判斷8列掃描否?掃描完返回
RLA ;掃描字左移一位,變?yōu)橄乱涣袙呙枳?/p>
MOVR2,A ;掃描字送入R2保存
AJMPLK4 ;轉(zhuǎn)下一列掃描KEND:AJMPKEY1
KS1:
MOVDPTR,#7F00H;DPTR指向8255的PA口
MOVA,#00H ;全掃描字→A MOVX@DPTR,A;全掃描字送往8255的PA口
INCDPTR ;DPTR指向8255的PC口
INCDPTR MOVXA,@DPTR ;讀入PC口行狀態(tài)
CPLA
;變正邏輯,以高電平表示有鍵按下
ANLA,#0FH ;屏蔽高4位,只保留低4位行線值
RET ;出口狀態(tài):(A)≠0時(shí)有鍵按下執(zhí)行KS1子程序的結(jié)果是:有閉合鍵則(A)≠0;無(wú)閉合鍵則(A)=0。CPLA;負(fù)邏輯不直觀,常采取行列線加反相器或軟件求反的方法把鍵盤改成正邏輯。NEXT:INCR4TM12ms:MOVR7,#18H;延時(shí)12ms子程序TM: MOVR6,#0FFHTM6: DJNZR6,TM6 DJNZR7,TM RETTM6ms:MOVR7,#0CH;延時(shí)6ms子程序TM2: MOVR6,#0FFHTM62:DJNZR6,TM6 DJNZR7,TM RETC語(yǔ)言鍵盤掃描子程序:略2.定時(shí)掃描工作方式3.中斷處理方式TM12ms:MOVR7,#18H;延時(shí)1C子程序:#include<reg51.h>#include<absacc.h>#defineucharunsignedchar#defineuintunsignedintVoiddelay(uint);Uchar
checkkey(void);Uchar
keyscan(void);Voidmain(void{ucharkey;While(1){key=keyscan();delay(2000);}}Voiddelay(uinti){uintj;For(j=0;j<I;j++){}}Ucharcheckkey(){UcharI;XBYTE[0x7f00]=0;i=XBYTE[7f02];i=i&0x0f;If(i==0x0f)return(0);Elsereturn(0xff);}C子程序:Ucharcheckkey()Ucharkeysan(){ucharscancode;//列掃描碼變量
Ucharcodevalue;//鍵值Ucharm;//行首編碼變量Uchark;//行檢測(cè)碼UcharI,j;If(checkkey()==0)return(0xff);//無(wú),返回ffElse{ delay(200);//延時(shí)
If(checkkey()==0)return(0xff);else{scancode=0xfe;m=0;//for(i=0;i<8;i++){
k=0x01;//行檢測(cè)碼
XBYTE[0x7f00]=scancode;
for(j=0;j<4;j++){
if((XBYTE[0x7f02]&k])==0){codevalue=m+i;注意書(shū)錯(cuò)
while(checkkey()!=0);//等待按鍵釋放
return(codevalue);//返回編碼
}else
{m=m+8;//下一行首編碼
k=k<<1;}
}
scancode=~((~scancode)<<1);注意書(shū)錯(cuò)
}}}Ucharkeysan()fo7.5MCS-51單片機(jī)與LED顯示器接口7.5.1LED顯示器的結(jié)構(gòu)與原理
在單片機(jī)應(yīng)用系統(tǒng)中通常使用的是8段式LED數(shù)碼管顯示器,它有共陰極和共陽(yáng)極兩種,如圖所示。abcdefgdpcomabcdefgdpcomabcdefgdp10987612345gfcomabedcomcdp(a)共陰極結(jié)構(gòu)(c)管腳圖(b)共陽(yáng)極結(jié)構(gòu)代碼位D7D6D5D4D3D2D1D0顯示段hgfedcbaLED(LightEmitingDiode)7.5MCS-51單片機(jī)與LED顯示器接口7.5.1
其中:(a)為共陰極結(jié)構(gòu)。(b)為共陽(yáng)極結(jié)構(gòu)。(c)圖為管腳圖,從a~g管腳輸入不同的8位二進(jìn)制編碼,可顯示不同的數(shù)字或字符。共陰極和共陽(yáng)極的字段碼互為反碼。其中:(a)為共陰極結(jié)構(gòu)。(b)為共陽(yáng)極結(jié)構(gòu)7.5.2LED數(shù)碼管顯示器的譯碼方式一.硬件譯碼方式譯碼方式是指由顯示字符轉(zhuǎn)換得到對(duì)應(yīng)的字段碼的方式。
硬件譯碼方式是指利用專門的硬件電路來(lái)實(shí)現(xiàn)顯示字符到字段碼的轉(zhuǎn)換,這樣的硬件電路有很多,比如MOTORLA公司生產(chǎn)的MC14495芯片就是其中的一種,MC14495是共陰極一位十六進(jìn)制數(shù)——字段碼轉(zhuǎn)換芯片,能夠輸出用四位二進(jìn)制表示形式的一位十六進(jìn)制數(shù)的七位字段碼,不帶小數(shù)點(diǎn)。它的內(nèi)部結(jié)構(gòu)如圖。4鎖存器地址譯碼和字段碼ROM陣列ABCDLE569107VssVDD816abcdefgh+iVCR11121314151234二.軟件譯碼方式
軟件譯碼方式就是通過(guò)編寫(xiě)軟件譯碼程序,通過(guò)譯碼程序來(lái)得到要顯示的字符的字段碼。7.5.2LED數(shù)碼管顯示器的譯碼方式一.硬件譯碼方式7.5.3LED數(shù)碼管的顯示方式
顯示多位數(shù)據(jù)的兩種
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)藥殘留檢測(cè)與風(fēng)險(xiǎn)評(píng)估作業(yè)指導(dǎo)書(shū)
- 三農(nóng)產(chǎn)業(yè)園區(qū)運(yùn)營(yíng)及管理指南
- 部門協(xié)同工作流程梳理與改進(jìn)方案
- 公路工程與橋梁工程作業(yè)指導(dǎo)書(shū)
- 賀州2025年廣西賀州市事業(yè)單位招聘610人筆試歷年參考題庫(kù)附帶答案詳解
- 湖北2025年湖北省空間規(guī)劃研究院招聘專業(yè)技術(shù)人員筆試歷年參考題庫(kù)附帶答案詳解
- 2023年證券從業(yè)資格考試《金融市場(chǎng)基礎(chǔ)知識(shí)》真題匯編三
- X市孕期營(yíng)養(yǎng)干預(yù)對(duì)妊娠期糖尿病孕婦血糖控制的影響研究
- 核磁共振在膝骨性關(guān)節(jié)炎診斷中的應(yīng)用價(jià)值探討分析
- 全流程信息化管理對(duì)門診安全采血流程的優(yōu)化作用研究
- 教師調(diào)課申請(qǐng)及補(bǔ)課情況表
- 新教科版三年級(jí)下冊(cè)科學(xué) 1-1 運(yùn)動(dòng)和位置 重點(diǎn)題型練習(xí)課件
- VTE防治基礎(chǔ)知識(shí)辦公文檔事務(wù)文書(shū)
- 室間隔缺損ppt課件文字可編輯
- 駕駛員職業(yè)生理和心理健康資料教學(xué)課件
- 股權(quán)糾紛答辯狀新
- 猴的介紹(終稿)
- 各種進(jìn)膠方式優(yōu)缺點(diǎn)分析
- 不動(dòng)產(chǎn)登記實(shí)務(wù)PPT完整版
- 2021北京高三期末文言文閱讀匯編
- 新教科版六年級(jí)科學(xué)下冊(cè)教學(xué)計(jì)劃
評(píng)論
0/150
提交評(píng)論