單片機原理及接口技術(shù)-基于C51 Proteus仿真(第二版)課件 第8、9章 人機交互接口設(shè)計;80C51單片機與DAC、ADC接口芯片的設(shè)計_第1頁
單片機原理及接口技術(shù)-基于C51 Proteus仿真(第二版)課件 第8、9章 人機交互接口設(shè)計;80C51單片機與DAC、ADC接口芯片的設(shè)計_第2頁
單片機原理及接口技術(shù)-基于C51 Proteus仿真(第二版)課件 第8、9章 人機交互接口設(shè)計;80C51單片機與DAC、ADC接口芯片的設(shè)計_第3頁
單片機原理及接口技術(shù)-基于C51 Proteus仿真(第二版)課件 第8、9章 人機交互接口設(shè)計;80C51單片機與DAC、ADC接口芯片的設(shè)計_第4頁
單片機原理及接口技術(shù)-基于C51 Proteus仿真(第二版)課件 第8、9章 人機交互接口設(shè)計;80C51單片機與DAC、ADC接口芯片的設(shè)計_第5頁
已閱讀5頁,還剩252頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1

第8章人機交互接口設(shè)計28.1鍵盤接口8.1.1鍵盤的工作原理8.1.2鍵盤的接口電路8.1.3鍵盤的工作方式8.2LED數(shù)碼管顯示器接口8.2.1LED數(shù)碼管的結(jié)構(gòu)8.2.2LED數(shù)碼管的工作原理8.3鍵盤與LED數(shù)碼管顯示器接口綜合設(shè)計實例8.3.1利用并行I/O芯片82C55實現(xiàn)的鍵盤/顯示器接口8.3.2利用單片機串行口實現(xiàn)的鍵盤/顯示器接口8.3.3基于專用芯片HD7279A實現(xiàn)的鍵盤/顯示器接口38.4LCD1602液晶顯示器接口8.4.1LCD1602液晶顯示模塊介紹8.4.2單片機控制LCD1602顯示舉例48.1鍵盤接口鍵盤是單片機應(yīng)用系統(tǒng)中最基本的輸入設(shè)備,通過鍵盤輸入數(shù)據(jù)或命令,是人工干預(yù)單片機的主要手段。按其結(jié)構(gòu)形式可分為編碼鍵盤和非編碼鍵盤。編碼鍵盤采用硬件方法完成鍵盤識別功能,每按下一個鍵,鍵盤通過其編碼電路自動產(chǎn)生一個編碼信息,即鍵碼。這種鍵盤使用方便,但硬件較復(fù)雜,計算機所用鍵盤即為編碼鍵盤。非編碼鍵盤是由軟件完成鍵盤識別功能的,它利用一套專用鍵盤編碼程序來識別按鍵的位置,并轉(zhuǎn)換成相應(yīng)的編碼信息,形成鍵碼。這種鍵盤硬件簡單,廣泛用于各種單片機應(yīng)用系統(tǒng)中。下面介紹主要非編碼鍵盤的工作原理及其工作方式。58.1.1鍵盤的工作原理1.按鍵的特性鍵盤實質(zhì)上是一組按鍵開關(guān)的集合,在單片機系統(tǒng)中最常用的鍵盤是機械式按鍵鍵盤。如圖8-1(a)所示,按鍵開關(guān)的兩端分別連接行線和列線,通過鍵盤開關(guān)機械觸點的斷開、閉合,行線電壓信號的輸出波形如圖8-1(b)所示。

按鍵在閉合或斷開瞬間,觸點由于機械彈性作用會出現(xiàn)抖動現(xiàn)象,然后才能穩(wěn)定。62.按鍵的確認(rèn)如果按鍵斷開,行線呈現(xiàn)高電平,反之,按鍵閉合時,行線呈現(xiàn)低電平。所以通過對行線電平的檢測,便可確認(rèn)按鍵按下與否。為了確保單片機對一次按鍵動作只確認(rèn)一次有效,必須消除抖動期t1和t3的影響。3.按鍵去抖抖動現(xiàn)象會引起CPU對一次鍵盤操作進行多次處理,從而可能產(chǎn)生錯誤,因而必須設(shè)法消除抖動。通過去抖動處理,可以得到按鍵閉合與斷開的穩(wěn)定狀態(tài)??梢酝ㄟ^硬件或軟件的方法消除按鍵抖動。硬件方法是加去抖動電路,如可通過RS觸發(fā)器實現(xiàn)硬件去抖動;軟件方法消除按鍵抖動的基本思想是:在第一次檢測到有鍵按下時,該鍵所對應(yīng)的行線為低電平,執(zhí)行一段延時10ms的子程序后,確認(rèn)該行線電平是否仍為低電平,如果仍為低電平,則確認(rèn)該行確實有鍵按下。當(dāng)按鍵松開時,行線的低電平變?yōu)楦唠娖?,?zhí)行一段延時10ms的子程序后,檢測該行線為高電平,說明按鍵確實已松開。通常多采用軟件方法。78.1.2鍵盤的接口電路常用的鍵盤接口有兩種:一種是獨立式鍵盤接口,另一種是矩陣式鍵盤接口。1.獨立式鍵盤接口獨立式鍵盤就是每個按鍵各接一根I/O輸入線,所有按鍵有一個公共地或公共正端,通過檢測I/O輸入線的電平狀態(tài),可以很容易地判斷哪個按鍵被按下,各個按鍵之間是相互獨立,互不影響的。當(dāng)按鍵數(shù)目較多時,獨立式鍵盤接口電路需要的輸入口線較多,故該種鍵盤電路僅適用于按鍵數(shù)目較少的應(yīng)用系統(tǒng)。下面從實際應(yīng)用的角度介紹幾種獨立式鍵盤的接口。8

圖8-2(a)所示為查詢方式的獨立式鍵盤接口電路,按鍵直接與單片機的I/O口線相連,通過讀I/O口,判斷I/O口線的電平狀態(tài),即可識別出按下的鍵。圖8-2(b)所示為中斷方式的獨立式鍵盤接口電路,只有在鍵盤有按鍵按下時,才進行處理,所以實時性強,效率高。當(dāng)鍵盤中有按鍵按下時,8輸入與非門74LS30的輸出經(jīng)過74LS04反相后向單片機的中斷請求輸入引腳發(fā)出低電平的中斷請求信號,單片機響應(yīng)中斷后,在中斷服務(wù)程序中,對按下的鍵進行識別。9圖8-2獨立式鍵盤接口電路10【例8-1】對于圖8-2(a)所示的獨立式鍵盤,采用查詢方式讀取鍵值,并根據(jù)不同鍵值,進行相應(yīng)的鍵處理。C51參考程序如下:#include<reg51.h>voidmain(){unsignedcharkeyvalue;do{P1=0xff; keyvalue=P1;//從P1口讀入鍵盤狀態(tài) keyvalue=~keyvalue;//鍵盤狀態(tài)取反

11switch(keyvalue) { case1:……;break;//處理K1鍵case2:……;break;//處理K2鍵 case4:……;break;//處理K3鍵 case8:……;break;//處理K4鍵 case16:……;break;//處理K5鍵

case32:……;break;//處理K6鍵case64:……;break;//處理K7鍵case128:……;break;//處理K8鍵default://無按下鍵處理 break; }}while(1);}12【例8-2】對于圖8-2(b)所示的獨立式鍵盤,編寫中斷方式的鍵盤處理程序。C51參考程序如下:#include<reg51.h>bitkeyflag;//keyflag為有鍵按下的標(biāo)志位unsignedcharkeyvalue;//keyvalue為鍵值voiddelay(unsignedintn);//軟件延時nms函數(shù)voidmain(void){IE=0x81;//中斷允許設(shè)置IP=0x01; //中斷優(yōu)先級設(shè)置keyflag=0;do{if(keyflag)//如果標(biāo)志keyflag=1,則有鍵按下13{ keyvalue=~keyvalue;//鍵值取反 switch(keyvalue)//根據(jù)按下鍵的鍵值進行分支跳轉(zhuǎn){ case1:......;//處理K1鍵break;case2:......;//處理K2鍵break; case4:......;//處理K3鍵break;case8:......;//處理K4鍵break; case16:......;//處理K5鍵break;14case32:......;//處理K6鍵break; case64:......;//處理K7鍵break; case128:......;//處理K8鍵break;default://無按下鍵處理 break; }keyflag=0;//清除按鍵按下標(biāo)志}}while(1);}voidint0()interrupt0//有鍵按下,進入中斷函數(shù){unsignedcharrekey;IE=0x80;//屏蔽中斷keyflag=0;//設(shè)置鍵按下標(biāo)志位P1=0xff;//P1口鎖存器置1keyvalue=P1;//從P1口讀入鍵盤狀態(tài)delay(10);//延時10ms去抖rekey=P1;//再次讀取P1口狀態(tài)

if(keyvalue==rekey){keyflag=1;//有鍵按下,設(shè)置標(biāo)志位為1} IE=0x81;//中斷允許}voiddelay(unsignedintn)//延時nms函數(shù){ unsignedinti,j; for(i=0;i<n;i++) for(j=0;j<125;j++);}

程序中用到了外部中斷。當(dāng)沒有鍵按下時,標(biāo)志keyflag=0,程序一直執(zhí)行“do{}while()”循環(huán)。當(dāng)有鍵按下時,則74LS04的輸出端產(chǎn)生低電平,向單片機的腳發(fā)出中斷請求信號,單片機響應(yīng)中斷,執(zhí)行中斷函數(shù),在中斷函數(shù)中把keyflag置1,并得到鍵值。當(dāng)執(zhí)行完中斷函數(shù)后,再進入“do{}while()”循環(huán),此時由于“if(keyflag)”中的keyflag=1,則可根據(jù)鍵值keyvalue,執(zhí)行“switch(keyvalue)”分支語句,進行按下鍵的處理。此外,還可以采用擴展的I/O口作為獨立式按鍵接口電路,圖8-3所示為采用82C55擴展的獨立式鍵盤接口。

在上述幾種獨立式鍵盤電路中,各按鍵均采用了上拉電阻,這是為了保證在按鍵斷開時,各I/O口有確定的高電平,當(dāng)然如果輸入口線內(nèi)部已有上拉電阻,則外電路的上拉電阻可省去。獨立式按鍵的識別和編程都比較簡單,只需把與按鍵相連的I/O口線的狀態(tài)讀入到單片機內(nèi),如為高電平,則按鍵沒有按下;如為低電平,先延時10ms去抖,再讀該I/O口線的狀態(tài),若仍為低電平,則認(rèn)為確實有鍵按下。圖8-382C55擴展的獨立式鍵盤接口

在上述幾種獨立式鍵盤電路中,各按鍵均采用了上拉電阻,這是為了保證在按鍵斷開時,各I/O口有確定的高電平,當(dāng)然如果輸入口線內(nèi)部已有上拉電阻,則外電路的上拉電阻可省去。獨立式按鍵的識別和編程都比較簡單,只需把與按鍵相連的I/O口線的狀態(tài)讀入到單片機內(nèi),如為高電平,則按鍵沒有按下;如為低電平,先延時10ms去抖,再讀該I/O口線的狀態(tài),若仍為低電平,則認(rèn)為確實有鍵按下。圖8-4矩陣鍵盤結(jié)構(gòu)(1)矩陣式鍵盤工作原理按鍵設(shè)在行、列線交點上。行線通過上拉電阻接到+5V上。無按鍵按下時,行線處于高電平狀態(tài);當(dāng)有按鍵按下時,行線電平狀態(tài)將由與此行線相連的列線的電平?jīng)Q定。列線的電平如果為低,則行線電平為低;列線的電平如果為高,則行線的電平也為高,這一點是識別行列式鍵盤按鍵是否按下的關(guān)鍵所在。由于行列式鍵盤中行、列線為多鍵共用,各按鍵均影響該鍵所在行和列的電平,因此各按鍵彼此將相互發(fā)生影響,所以必須將行、列線信號配合起來并做適當(dāng)?shù)奶幚?,才能確定閉合鍵的位置。(2)按鍵的識別方法掃描法是常用的按鍵識別方法??煞謨刹竭M行:第一步,識別鍵盤有無鍵按下;第二步,如有鍵被按下,識別出具體的按鍵。

下面以圖8-4(b)所示的鍵7被按下為例,說明掃描法識別此鍵的過程。第一步,識別鍵盤有無鍵按下。首先把所有的列線均置為低電平,然后檢查各行線電平是否都為高電平,如果不全為高電平,則說明有鍵被按下,否則說明無鍵被按下。當(dāng)鍵7按下時,第二行線電平為低電平,但還不能確定是鍵7被按下,因為如果同一行的鍵4、5或6之一被按下,行線也會呈現(xiàn)低電平。所以,通過這一步只能得出第二行有鍵被按下的結(jié)論。

第二步,識別出哪個按鍵被按下。采用掃描法,在某一時刻只將一條列線置為低電平,其余所有列線均被置為高電平。當(dāng)?shù)谝涣袨榈碗娖?,其余各列為高電平時,因為是鍵7被按下,所以這時第二行的行線處于高電平狀態(tài);而當(dāng)?shù)诙袨榈碗娖?,其余各列為高電平時,同樣發(fā)現(xiàn)第二行的行線仍處于高電平狀態(tài);直到將第四列置為低電平,其余各列為高電平,此時第二行的行線電平變?yōu)榈碗娖剑纱丝膳卸ǖ诙械谒牧薪徊纥c處的按鍵,即7號鍵被按下。綜上所述,掃描法的思想是:先把某一列置為低電平,其余各列置為高電平,檢查各行線電平的變化,如果某行線電平為低,可確定此行此列交叉點處的按鍵被按下。

下面來看一個采用Proteus虛擬仿真的矩陣式鍵盤的實際案例?!纠?-3】如圖8-5所示的4×4矩陣鍵盤,其行線與列線與單片機的P1.7~P1.0連接,圖中4個發(fā)光二極管用來顯示矩陣鍵盤的鍵號,其顯示由單片機的P0.3~P0.0控制,當(dāng)鍵盤上的某一鍵按下時,發(fā)光二極管顯示對應(yīng)的鍵號。例如,1號鍵按下時,通過發(fā)光二極管的亮滅顯示“0001”;E鍵按下時,發(fā)光二極管顯示“1110”。圖8-5發(fā)光二極管顯示4×4矩陣鍵盤鍵號的原理電路C51參考程序如下:include<reg51.h>#defineucharunsignedcharuchartemp,key;voiddelay(unsignedintn);//軟件延時nms函數(shù),見例8-2voidmain(void){while(1){ P1=0x0f; temp=P1;//所有的列線均置為低電平 if(temp!=0x0f)//判斷是否有鍵按下? { delay(10);//延時10ms去抖

if(temp!=0x0f)//如果確實有鍵按下,下面將識別按下鍵 { P1=0xef;//列掃描碼0xef將最右一列置為低 temp=P1;//讀鍵值 temp=temp&0x0f;if(temp!=0x0f)//判斷最右一列是否有鍵按下? { temp=P1;//讀鍵值switch(temp)//判斷鍵值{ case0xee:key=0;break; case0xed:key=4;break; case0xeb:key=8;break;case0xe7:key=12;break; } while(temp!=0x0f)//按鍵釋放確認(rèn){ temp=P1; temp=temp&0x0f;} } P1=0xdf;//列掃描碼0xdf,將右起第二列置為低 temp=P1; temp=temp&0x0f;if(temp!=0x0f)//判斷右起第二列是否有鍵按下?{ temp=P1;//讀鍵值 switch(temp)//判斷鍵值

{case0xde:key=1;break;case0xdd:key=5;break; case0xdb:key=9;break; case0xd7:key=13;break;} while(temp!=0x0f)//按鍵釋放確認(rèn){ temp=P1; temp=temp&0x0f;} } P1=0xbf;//列掃描碼0xbf,將右起第三列置為低temp=P1;//讀鍵值

temp=temp&0x0f;//判斷鍵值if(temp!=0x0f)//判斷右起第三列是否有鍵按下?{ temp=P1; switch(temp) { case0xbe:key=2;break; case0xbd:key=6;break; case0xbb:key=10 ;break; case0xb7:key=14;break; }

while(temp!=0x0f)//按鍵釋放確認(rèn){ temp=P1; temp=temp&0x0f;} } P1=0x7f;//列掃描碼0x7f,將右起第四列置為低temp=P1;temp=temp&0x0f;if(temp!=0x0f)//判斷右起第四列是否有鍵按下?{ temp=P1;//讀鍵值 switch(temp)//判斷鍵值 { case0x7e:key=3;break; case0x7d:key=7;break; case0x7b:key=11;break; case0x77:key=15;break; }

while(temp!=0x0f)//按鍵釋放確認(rèn){ temp=P1; temp=temp&0x0f;} } } P0=~key;//鍵值送發(fā)光二極管顯示}}}8.1.3鍵盤的工作方式單片機應(yīng)用系統(tǒng)中,單片機在忙于其他各項工作任務(wù)時,如何兼顧鍵盤的輸入,這取決于鍵盤的工作方式。鍵盤工作方式的選取應(yīng)根據(jù)實際應(yīng)用系統(tǒng)中單片機工作的忙、閑情況而定。其原則是,既要保證及時響應(yīng)按鍵操作,又不要過多占用單片機的工作時間。通常,鍵盤工作方式有三種,即編程掃描、定時掃描和中斷掃描。

1.編程掃描方式編程掃描方式只有當(dāng)單片機空閑時,才調(diào)用鍵盤掃描子程序,反復(fù)掃描鍵盤,等待用戶從鍵盤上輸入命令或數(shù)據(jù),來響應(yīng)鍵盤的輸入請求。編程掃描方式的工作過程如下:(1)在鍵盤掃描子程序中,首先判斷整個鍵盤上有無鍵按下;(2)延時10ms來消除按鍵抖動的影響。如確實有鍵按下,進行下一步;

(3)識別按下鍵的鍵號;(4)等待按鍵釋放后,再進行按鍵功能的處理操作;

2.定時掃描方式單片機對鍵盤的掃描也可采用定時掃描方式,即每隔一定的時間對鍵盤掃描一次。在這種掃描方式中,通常利用單片機內(nèi)部定時器,產(chǎn)生10ms的定時中斷,單片機響應(yīng)定時器溢出中斷請求,對鍵盤進行掃描,在有鍵按下時識別出該鍵,并執(zhí)行相應(yīng)鍵的處理程序。

3.中斷掃描方式為進一步提高單片機掃描鍵盤的工作效率,可采用中斷掃描方式,即只有在鍵盤有鍵按下時,才向單片機發(fā)出中斷請求,執(zhí)行鍵盤掃描程序并執(zhí)行該按鍵功能程序,如果無鍵按下,單片機將不理睬鍵盤。

至此,可將鍵盤所做的工作分為三個層次。(1)單片機如何來監(jiān)視鍵盤的輸入。體現(xiàn)在鍵盤的工作方式上就是:①編程掃描;②定時掃描;③中斷掃描。(2)確定具體按鍵的鍵號。體現(xiàn)在按鍵的識別方法上就是常用的掃描法。(3)執(zhí)行鍵處理程序,實現(xiàn)按鍵的功能。8.2LED數(shù)碼管顯示器接口LED數(shù)碼管在單片機系統(tǒng)中應(yīng)用非常普遍。LED(LightEmittingDiode)是發(fā)光二極管的縮寫。LED數(shù)碼管是由發(fā)光二極管構(gòu)成的字段組成的顯示器,所以被稱為“LED”顯示器。8.2.1LED數(shù)碼管的結(jié)構(gòu)常用的LED數(shù)碼管為8段(或7段,8段比7段多了一個小數(shù)點“dp”段)。每一個段對應(yīng)一個發(fā)光二極管,因此,LED數(shù)碼管實際上是由七個發(fā)光二極管組成“8”字形構(gòu)成的,加上小數(shù)點就是八個發(fā)光二極管,這些段分別由字母a,b,c,d,e,f,g,dp來表示。這種顯示器又有共陽極和共陰極之分,如圖8-6所示。共陽極LED顯示器內(nèi)部的發(fā)光二極管的陽極是連接在一起的,即為公共陽極,通常公共陽極接正電壓,當(dāng)某個發(fā)光二極管的陰極接低電平時,發(fā)光二極管被點亮,相應(yīng)的段被顯示。同樣,共陰極LED顯示器內(nèi)部的發(fā)光二極管的陰極是連接在一起的,即為公共陰極,通常公共陰極接地,當(dāng)某個發(fā)光二極管的陽極接高電平時,發(fā)光二極管被點亮,相應(yīng)的段被顯示。(a)共陽極(b)共陰極(c)外形及引腳

圖8-68段LED數(shù)碼管結(jié)構(gòu)及外形

為使LED數(shù)碼管顯示不同的字型,就需要把相應(yīng)段的發(fā)光二極管點亮。比如,要在圖8-6(c)所示的LED數(shù)碼管顯示器上顯示一個數(shù)字“2”,那么應(yīng)當(dāng)點亮a、b、g、e、d段,而c、f、dp段不亮。為此,就要為LED數(shù)碼管顯示器提供字型碼,因為字型碼可使LED相應(yīng)的段發(fā)光,從而顯示不同的字型,因此,這種字型碼也稱為段碼。7段發(fā)光二極管,再加上一個小數(shù)點位,共計8段。因此提供給LED數(shù)碼管的段碼正好是一個字節(jié)。各段與字節(jié)中各位對應(yīng)關(guān)系如表8-1所示。

表8-1段碼與字節(jié)中各位對應(yīng)關(guān)系

按照上述格式,8段LED的段碼如表8-2所示。

表8-28段LED段碼

表8-2只列出了部分段碼,讀者可以根據(jù)實際情況選用,也可重新定義。另外,段碼是相對的,它由各字段在字節(jié)中所處的位決定。例如表8-2中8段LED段碼是按圖8-7(a)所示格式而形成的,“0”的段碼為3FH(共陰極)。反之,如將格式改為圖8-6(b)所示格式,則“0”的段碼為7EH(共陰極)。圖8-7段碼格式

字型及段碼由設(shè)計者自行設(shè)定,在使用中,一般習(xí)慣上還是以“a”段對應(yīng)段碼字節(jié)的最低位。8.2.2LED數(shù)碼管的工作原理圖8-8所示為由N個LED顯示塊構(gòu)成的顯示N位字符的LED顯示器的結(jié)構(gòu)原理圖。N個LED顯示塊有N位位選線和8×N位段碼線。段碼線控制顯示字符的字型,而位選線為各個LED顯示塊的公共端,用來選擇所需的LED顯示塊,控制該LED顯示位的亮或暗。LED數(shù)碼管顯示器有靜態(tài)顯示和動態(tài)顯示兩種顯示方式。圖8-8N位LED數(shù)碼管顯示器的結(jié)構(gòu)原理圖

1.LED靜態(tài)顯示方式LED數(shù)碼管工作于靜態(tài)顯示方式時,各位LED的共陰極(或共陽極)連接在一起并接地(或接+5V);每位的段碼線(a~dp)分別與一個8位的并行輸出口相連。之所以稱為靜態(tài)顯示,是因為各個LED的顯示字符一經(jīng)確定,相圖8-8N位LED數(shù)碼管顯示器的結(jié)構(gòu)原理圖應(yīng)并行輸出口的段碼輸出將維持不變,直到送入另一個段碼為止,所以顯示的亮度高。

圖8-9所示為一個4位LED靜態(tài)顯示器電路,各位可獨立顯示,只要在某位的段碼線上保持段碼電平,該位就能保持相應(yīng)的顯示字符。由于各位LED的段碼線分別由一個8位的并行輸出口控制,故在同一時刻,每一位LED顯示的字符可以各不相同。靜態(tài)顯示方式中單片機CPU為顯示器服務(wù)的時間短且軟件編程簡單,但硬件開銷大,接口電路復(fù)雜。如圖8-9所示,4個LED塊構(gòu)成的4位靜態(tài)顯示器電路,要占用四個8位I/O口,如果顯示器的位數(shù)增多,則需要增加I/O口的數(shù)目。因此在顯示位數(shù)較多的情況下,一般不建議采用靜態(tài)顯示方式。圖8-94位LED靜態(tài)顯示電路

【例8-4】單片機控制2只數(shù)碼管,靜態(tài)顯示2個數(shù)字“28”。本例的原理電路如圖8-10所示。單片機利用P1口與P2口分別控制兩個數(shù)碼管DS0與DS1的段碼,而共陽極數(shù)碼管DS0與DS1的公共端直接接至+5V,因此數(shù)碼管DS0與DS1始終處于導(dǎo)通狀態(tài)。利用P1口與P2口具有的鎖存功能,只需向單片機的P1口與P2口分別寫入相應(yīng)的顯示字符“2”和“8”的段碼即可。由于一個數(shù)碼管就占用了一個I/O端口,如果數(shù)碼管數(shù)目增多,則需要增加I/O端口,但是軟件編程簡單。圖8-102位數(shù)碼管靜態(tài)顯示原理電路與仿真C51參考程序如下:#include<reg51.h>voidmain(){P1=0xa4;//將數(shù)字“2”的段碼(共陽極)送P1口P2=0x80;//將數(shù)字“8”的段碼(共陽極)送P2口while(1);}2.LED動態(tài)顯示方式LED數(shù)碼管工作于動態(tài)顯示方式時,所有顯示位的段碼線的相應(yīng)段并接在一起,由一個8位I/O口控制,形成段碼線的多路復(fù)用,而各位的公共端分別由相應(yīng)的I/O線控制,形成各位的分時選通。

LED不同位顯示的時間間隔應(yīng)根據(jù)實際情況而定。發(fā)光二極管從導(dǎo)通到發(fā)光有一定的延時,導(dǎo)通時間太短,則發(fā)光太弱,人眼無法看清;但也不能太長,否則,就達不到“多位同時顯示”的效果,而且此時間越長,占用單片機CPU的時間就越多。另外,當(dāng)顯示位數(shù)增多時,將占用大量的單片機CPU時間,因此動態(tài)顯示實質(zhì)上是以犧牲單片機CPU時間來換取I/O端口的減少。

圖8-11所示為一個4位8段LED動態(tài)顯示電路,其中段碼線占用一個8位I/O口,而位選線占用一個4位I/O口。由于各位的段碼線并聯(lián),8位I/O口輸出的段碼對各位LED來說都是相同的。因此,在同一時刻,如果各位位選線都處于選通狀態(tài),4位LED將顯示相同的字符。若要各位LED能夠同時顯示出不同的字符,就必須采用動態(tài)顯示方式,即在某一時刻,只讓某一位的位選線處于選通狀態(tài),而其它各位的位選線處于關(guān)閉狀態(tài),同時,段碼線上輸出相應(yīng)位要顯示的字符的段碼。這樣,在同一時刻,4位LED中只有選通的那一位顯示出字符,而其它三位則是熄滅的。同樣,在下一時刻,只讓下一位的位選線處于選通狀態(tài),而其它各位的位選線處于關(guān)閉狀態(tài),在段碼線上輸出將要顯示字符的段碼,此時,只有選通位顯示出相應(yīng)的字符,而其它各位則是熄滅的。如此循環(huán)下去,就可以使各位顯示出將要顯示的字符。

由此可見,在同一時刻,只有一位顯示,其它各位熄滅,即各位的顯示字符是在不同時刻出現(xiàn)的,但由于LED顯示器的余輝和人眼的“視覺暫留”效應(yīng),只要每位顯示時間足夠短,就可以造成“多位同時亮”的假象,達到同時顯示的效果。圖8-114位LED動態(tài)顯示電路

【例8-5】單片機控制8只數(shù)碼管,分別滾動顯示單個數(shù)字1~8。程序運行后,單片機控制左邊第一個數(shù)碼管顯示1,其他不顯示,延時之后,控制左邊第2個數(shù)碼管顯示2,其他不顯示,直至第8個數(shù)碼管顯示8,其他不顯示,反復(fù)循環(huán)上述過程。本例原理電路與仿真如圖8-12所示。圖8-128位數(shù)碼管動態(tài)顯示原理電路與仿真

圖8-12所示的動態(tài)顯示電路,由P0口通過兩片74HC573分時送出段碼和位控碼,兩片74HC573的輸出鎖存由P2口的高兩位口線控制。由于是虛擬仿真,即時掃描速度加快,數(shù)碼管的余輝也不能像實際電路那樣體現(xiàn)出來。如果對實際的硬件顯示電路進行快速掃描,由于數(shù)碼管的余輝和人眼的“視覺暫留”作用,只要控制好每位數(shù)碼管顯示的時間和間隔,則可造成“多位同時亮”的假象,達到同時顯示的效果。#include<reg51.h>#defineucharunsignedchar sbitseg=P2^6;//段選信號的鎖存器控制sbitbitn=P2^7;//位選信號的鎖存器控制C51參考程序如下:ucharcodewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//數(shù)碼管各位的位控碼ucharcodeduan[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};//共陰極數(shù)碼管的段碼表,1~8voiddelay(unsignedintn)//延時nms函數(shù){ unsignedinti,j; for(i=0;i<n;i++) for(j=0;j<125;j++);}voidmain(){ucharnum;

while(1){ for(num=0;num<8;num++) { bitn=1; P0=wei[num];//從P0口送出位控碼 bitn=0; seg=1; P0=duan[num];//從P0口送出段碼 seg=0; delay(10); } } }

8.3鍵盤與LED數(shù)碼管顯示器接口綜合設(shè)計實例在單片機應(yīng)用系統(tǒng)中,一般都是把鍵盤和顯示器放在一起考慮。下面介紹幾種實用的鍵盤/顯示器接口的設(shè)計方案。8.3.1利用并行I/O芯片82C55實現(xiàn)的鍵盤/顯示器接口【例8-6】圖8-13是單片機外擴并行I/O芯片82C55實現(xiàn)的16個按鍵和8位LED鍵盤/顯示器接口電路。82C55的PA口為輸出口,作為8位共陰極LED數(shù)碼管的位選口,PB口作為顯示段碼的輸出口,PC0~PC3口作為鍵盤的行線狀態(tài)輸入口,PC4~PC7口作為鍵盤的列線掃描輸出口。82C55的PA、PB、PC口及控制口的地址分別為:7FFCH、7FFDH、7FFEH及7FFFH。圖中7407為同相驅(qū)動器。圖8-13用并行接口芯片82C55實現(xiàn)的鍵盤/顯示器接口1.動態(tài)顯示程序設(shè)計C51參考程序如下:#include<reg51.h>#include<absacc.h>#defineucharunsignedchar#definePAportXBYTE[0x7ffc]//82C55的PB口地址0x7ffc#definePBportXBYTE[0x7ffd]//82C55的PB口地址0x7ffd#definePCportXBYTE[0x7ffe]//82C55的PB口地址0x7ffe#definecmdportXBYTE[0x7fff]//82C55的控制字寄存器端口地址0x7fffucharidatadis_buf[8]={1,2,3,4,5,6,7,8};//顯示緩沖區(qū),用戶可也根據(jù)顯示需要自行賦值ucharidatadis_buf[8]={1,2,3,4,5,6,7,8};//顯示緩沖區(qū),用戶可也根據(jù)顯示需要自行賦值ucharcodedistable[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共陰極數(shù)碼管段碼表,0,1,2,3,4,5,6,7,8,9A,b,C,d,E,Fvoiddelay(unsignedintn);//延時nms函數(shù),見例8-2voiddisplay(void){ucharsegcode,bitcode,i; bitcode=0xfe; for(i=0;i<=7;i++){ PAport=bitcode;//位選碼從PA口輸出,點亮某一位segcode=dis_buf[i]; PBport=distable[segcode];//段碼從PB口輸出 delay(5); //延時 bitcode=(bitcode<<1)|0x01; //位選碼左移一位 } }2.鍵盤掃描程序設(shè)計鍵盤采用編程掃描工作方式,鍵盤程序功能有以下4方面。(1)判別鍵盤上有無鍵按下,其方法為列掃描線PC4~PC7輸出全0,讀PC0~PC3的狀態(tài),若PC0~PC3全為1,則鍵盤上沒有按下鍵,若PC0~PC3不全為1,則有鍵按下。(2)在判別出鍵盤上有鍵按下后,延時一段時間去除鍵的機械抖動,再次判別鍵盤的狀態(tài),若仍有鍵按下,則認(rèn)為鍵盤上有鍵處于穩(wěn)定的閉合期,否則認(rèn)為是鍵的抖動。(3)識別按下鍵的鍵號,對鍵盤的列線進行逐列掃描,掃描線PC4~PC7依次輸出編碼“1110”、“1101”、“1011”、“0111”,只有一列為低電平,其余各列為高電平。依次讀PC0~PC3的狀態(tài),若PC0~PC3全為1,則列線為0的這一列沒有鍵按下。按下鍵的鍵號等于行線為低電平的行號乘以4再加上低電平的列號。例如PC4~PC7輸出為1011時,讀到PC0~PC3為1101,則第1行第2列(最上一行看作第0行,最左一列看作第0列)相交處的鍵處于按下狀態(tài),因此,按下鍵的鍵號N為N=1*4+2=6

(4)為了對鍵的一次按下僅做一次處理,采用的方法是判別到按下鍵釋放后再做鍵功能處理。C51參考程序如下:ucharkeynumber;//定義鍵號為全局變量ucharcheckkey(void)//檢測有無鍵按下函數(shù),有鍵按下返回0xff,無鍵按下返回0{ uchari; PCport=0x0f;//列線PC4~PC7輸出全0 i=PCport;//讀入行線PC0~PC3的狀態(tài) i=i&0x0f;//屏蔽PC口的高4位 if(i==0x0f)return(0);//無鍵按下返回0 elsereturn(0xff);}ucharkeyscan(void)//鍵盤掃描函數(shù),如有鍵按下,識別按下鍵的鍵號{ucharscancode,k,i,j; if(checkkey()!=0) //檢測是否有鍵按下,無鍵按下返回{ delay(10);//延時去抖if(checkkey()!=0)//再次檢測是否有鍵按下,無鍵按下返回{scancode=0xef;//列掃描碼,從左邊第一列開始掃描 for(i=0;i<4;i++){ k=0x01; PCport=scancode;//送列掃描碼

for(j=0;j<4;j++){ if((PCport&k)==0) //檢測當(dāng)前行是否有鍵按下? { keynumber=j*4+i;//當(dāng)前行有鍵按下,求鍵號 while(checkkey()!=0)//按鍵釋放確認(rèn) return1;//返回 }elsek=k<<1;} scancode=(scancode<<1)|0x01;//列掃描碼左移一位,掃描下一列} } } }8.3.2利用單片機串行口實現(xiàn)的鍵盤/顯示器接口當(dāng)單片機的串行口未作它用時,可用其來外擴鍵盤/顯示器。應(yīng)用單片機的串行口方式0,外擴移位寄存器74LS164來構(gòu)成鍵盤/顯示器接口,這是在實際應(yīng)用系統(tǒng)中,經(jīng)常采用的一種方案,其硬件接口電路如圖8-14所示。圖8-14用串行口擴展的鍵盤/顯示器接口

【例8-7】如圖8-14所示的用串行口擴展的鍵盤/顯示器接口:74LS164(0)~74LS164(7)作為8個LED顯示器的段碼輸出口,74LS164(8)作為鍵盤的列線掃描輸出口,單片機的P3.4、P3.5作為兩行鍵的行狀態(tài)輸入線,P3.3作為TXD引腳同步移位脈沖輸出控制線,P3.3=0時,與門輸出為0,禁止同步移位脈沖輸出。這種靜態(tài)顯示方式的優(yōu)點是亮度大,與動態(tài)掃描相比較,CPU不必頻繁地掃描顯示器,提高了工作效率,因而軟件設(shè)計比較簡單。下面給出程序清單,該程序中LED0顯示按下鍵的鍵號,LED1~LED7依次顯示數(shù)字1~7。C51參考程序如下:#include<reg51.h>#defineucharunsignedcharsbitP3_3=P3^3;sbitP3_4=P3^4;sbitP3_5=P3^5;ucharcodedistable[17]={0xc0,0xf9,0xa4,0xb0,0x99,//共陽極段碼表,0,1,2,3,40x92,0x82,0xf8,0x80,//5,6,7,80x90,0x88,0x83,0xc6,//9,A,b,C0xa1,0x86,0x8e,0xff};//d,E,F,滅ucharkeyval; voiddelay(unsignedintn);//軟件延時nms函數(shù),見例8-2voiddisplay(uchara); voidkeyscan(void) ; voidmain(void){uchari;SCON=0;//串行口初始化為方式0keyval=16; //LED0上電初始化為“滅”while(1){for(i=7;i>=1;i--)//LED1~LED7依次顯示1,2,3,4,5,6,7,{ display(i);//調(diào)用顯示子程序}

display(keyval);//LED0顯示按下鍵的鍵號keyscan();//調(diào)用鍵盤掃描子程序}}/***************************顯示子程序**************************/voiddisplay(uchara){P3_3=1; //允許TXD引腳同步移位脈沖輸出SBUF=distable[a]; //distable[]是定義的數(shù)碼管段碼表while(!TI);TI=0; }/*************************鍵盤掃描子程序************************/voidkeyscan(void){uchartemp,i;P3_3=0;//關(guān)閉顯示器輸出do{ temp=0;SBUF=temp;//74LS164(8)輸出00H,所有列線均置為0while(!TI);//串行輸出完否?TI=0;//串行輸出完畢,清TI}while(P3_4!=0&P3_5!=0);//是否有按鍵按下?delay(10);//延時10去抖if(P3_4==0|P3_5==0)//判斷是否由抖動引起?{//不是抖動引起temp=0x7f;//判別是哪個鍵按下,0x7f為最左一列輸出低for(i=0;i<=7;i++)//掃描8列{SBUF=temp; while(!TI); TI=0; if(P3_4==0)//第一行有鍵閉合否?{ keyval=i;//得到鍵號 while(!P3_4);//按鍵釋放確認(rèn)break;//識別出按下鍵,退出循環(huán) }if(P3_5==0)//第二行有鍵閉合否?{ keyval=i+8; //得到鍵號 while(!P3_5);//按鍵釋放確認(rèn) break;//識別出按下鍵,退出循環(huán) } temp=(temp>>1)|0x80;//列掃描碼右移,準(zhǔn)備掃描下一列} }}8.3.3基于專用芯片HD7279A實現(xiàn)的鍵盤/顯示器接口專用可編程鍵盤/顯示器接口芯片具有自動消除鍵抖動并識別按鍵代碼的功能,單片機通過專用接口芯片控制鍵盤/顯示器時,在軟件上可省去鍵盤去抖動程序以及鍵盤/顯示器動態(tài)掃描程序,只需對鍵盤/顯示器接口芯片中的各個控制寄存器進行正確的設(shè)置即可,從而可以提高CPU工作的效率。

1.各種專用鍵盤/顯示器接口芯片簡介早期常用的專用鍵盤/顯示器接口芯片是Intel公司于20世紀(jì)80年代推出的并行接口芯片8279,但8279的驅(qū)動電流較小,需加驅(qū)動電路;另外,8279采用并行方式與單片機通信,占用口線多,使得單片機系統(tǒng)的硬件開銷大,故8279在今天已逐漸退出市場。目前流行的鍵盤/顯示器接口芯片與單片機的接口多采用串行連接方式,占用口線少。常見的鍵盤/顯示器接口芯片有:ZLG7289A和ZLG7290B(周立功公司)、CH451(南京沁恒公司)、MAX7219、BC7281和HD7279等。

(1)ZLG7290B。ZLG7290B是廣州周立功單片機發(fā)展有限公司自行設(shè)計的數(shù)碼管顯示驅(qū)動及鍵盤掃描管理芯片。能夠直接驅(qū)動8位共陰式數(shù)碼管(或64只獨立的LED),同時還可以掃描管理多達64只按鍵,其中有8只按鍵還可以作為功能鍵使用。另外ZLG7290B內(nèi)部還設(shè)置有連擊計數(shù)器,能夠使某鍵按下后不松手而連續(xù)有效。ZLG7290B采用I2C串行總線方式,與微控制器的接口只需兩根信號線;該芯片為工業(yè)級芯片,抗干擾能力強,在工業(yè)測控中已有大量應(yīng)用。(2)CH451??蓜討B(tài)驅(qū)動8位LED數(shù)碼管顯示,具有BCD碼譯碼、閃爍、移位等功能。內(nèi)置大電流驅(qū)動級,段電流不小于30mA,位電流不小于160mA。內(nèi)置64(8×8)鍵鍵盤控制器,可對8×8矩陣鍵盤自動掃描,且有去抖動電路,并提供鍵盤中斷和按鍵釋放標(biāo)志位,可供查詢按鍵按下與釋放狀態(tài)。片內(nèi)內(nèi)置上電復(fù)位和看門狗定時器。芯片性價比較高,是目前使用較為廣泛的專用的鍵盤/顯示器接口芯片之一。但抗干擾能力不是很強,不支持組合鍵識別。

(3)MAX7219。MAXIM(美信)公司的產(chǎn)品。該芯片采用串行SPI接口,僅是單純驅(qū)動共陰極LED數(shù)碼管,沒有鍵盤管理功能,功能較為單一。(4)BC7281??沈?qū)動8位或16位數(shù)碼管顯示或64/128只獨立LED,具有64鍵鍵盤接口,內(nèi)建去抖功能,可實現(xiàn)閃爍、段點亮、段熄滅等功能。BC7281的驅(qū)動輸出極性及輸出時序均為軟件可控,從而可以和各種外部電路配合,適用于任何尺寸的數(shù)碼管。BC7281通過外接移位寄存器最多可驅(qū)動16位LED數(shù)碼管,但所需外圍電路較多,占PCB空間較大,且在驅(qū)動16位LED數(shù)碼管時,由于采用動態(tài)掃描方式工作,電流噪聲過大。(5)HD7279。HD7279是一片具有串行接口的,可同時驅(qū)動8位共陰極數(shù)碼管(或64只獨立LED)的智能顯示驅(qū)動芯片,該芯片同時還可連接64鍵的鍵盤矩陣,單片即可完成LED顯示、鍵盤接口的全部功能。且價格低廉,因此在鍵盤/顯示器接口的設(shè)計中得到了廣泛應(yīng)用。2.專用鍵盤/顯示器接口芯片HD7279A簡介HD7279A能同時驅(qū)動8個共陰極LED數(shù)碼管(或64個獨立的LED發(fā)光二極管)和64(88)鍵的編碼鍵盤矩陣??刂芁ED數(shù)碼管采用動態(tài)掃描的循環(huán)顯示方式。該芯片具有如下特性:串行接口,內(nèi)部含有驅(qū)動器,無需外圍元件即可直接驅(qū)動LED;內(nèi)部含有譯碼器,可直接接受BCD碼或16進制碼,并同時具有2種譯碼方式;多種控制指令,如消隱、閃爍、左移、右移、段尋址;各位獨立控制譯碼/不譯碼及消隱和閃爍屬性;64鍵鍵盤控制器,能夠自動消除鍵抖動并識別按鍵鍵值。有DIP和SOIC兩種封裝形式供選擇

(1)引腳說明與電氣特性下面以DIP(雙列直插式)封裝為例,介紹HD7279A芯片的外部引腳。HD7279A芯片有28個引腳,。其引腳如圖8-15所示,引腳說明如表8-3所示。圖8-15HD7279A的引腳

DIG0~DIG7為位驅(qū)動輸出端,分別連接8個LED數(shù)碼管的共陰極;SA~SG為段驅(qū)動輸出端,分別與LED數(shù)碼管的a~g段相連。DP為小數(shù)點的驅(qū)動輸出端。DIG0~DIG7和SA~SG同時還分別是64鍵鍵盤的列線和行線端口,完成對鍵盤的譯碼和鍵碼識別。在8×8陣列中每個鍵的鍵碼是用十六進制表示的,可用讀鍵盤數(shù)據(jù)指令讀出,鍵碼范圍是00H~3FH。HD7279A芯片與單片機接口僅需4條接口線:、DATA、CLK和。其中為片選信號(低電平有效)。當(dāng)單片機訪問HD7279A(讀鍵號或?qū)懼噶睿r,應(yīng)將置為低電平。DATA為串行數(shù)據(jù)端,當(dāng)單片機向HD7279A發(fā)送數(shù)據(jù)時,DATA為輸入端;當(dāng)HD7279A向單片機輸出鍵碼時,DATA為輸出端。CLK為數(shù)據(jù)串行傳送的同步時鐘輸入端,時鐘的上升沿表示數(shù)據(jù)有效。

為按鍵信號輸出端,在無鍵按下時為高電平;而有鍵按下時此引腳變?yōu)榈碗娖讲⑶乙恢北3值芥I釋放為止。RC引腳用于外接振蕩元件,其典型值為R=1.5kΩ,C=15pF。為復(fù)位端。該端由低電平變成高電平并保持18~25ms即復(fù)位結(jié)束。通常,該端接+5V即可。HD7279A的電氣特性如表8-4所示。(2)控制指令HD7279A的控制指令包括6條不帶數(shù)據(jù)的純指令、7條帶數(shù)據(jù)指令和1條讀鍵盤指令。①純指令(6條)復(fù)位指令。指令代碼為A4H,其功能為清除所有顯示,包括字符消隱屬性和閃爍屬性。測試指令。指令代碼為BFH,其功能為將所有的LED點亮并閃爍,可用于自檢。左移指令。指令代碼為A1H,其功能為將所有的顯示左移1位,移位后,最右位空(無顯示),不改變消隱和閃爍屬性。右移指令。指令代碼為A0H,其功能與左移指令相似,只是方向相反。循環(huán)左移指令。指令代碼為A3H,其功能為將所有的顯示循環(huán)左移1位。移位后,最左位內(nèi)容移至最右位,不改變消隱和閃爍屬性。循環(huán)右移指令。指令代碼為A2H,其功能與循環(huán)左移指令相似,只是方向相反。

②帶數(shù)據(jù)指令(7條)帶數(shù)據(jù)指令均由雙字節(jié)組成,第1字節(jié)為指令標(biāo)志碼,第2字節(jié)為顯示內(nèi)容。按方式0譯碼下載指令

。該指令格式如下。

該指令由2個字節(jié)組成。第1字節(jié)為指令,其中a2、a1、a0為顯示位地址,表示顯示數(shù)據(jù)應(yīng)送給8位數(shù)碼管中的哪一位,當(dāng)a2a1a0=000表示最低位數(shù)碼管,a2a1a0=111表示最高位數(shù)碼管。第2字節(jié)為顯示內(nèi)容,其中dp為小數(shù)點控制位,dp=1時,小數(shù)點顯示;dp=0時,小數(shù)點熄滅。d3、d2、d1、d0為顯示數(shù)據(jù),收到此指令時,HD7279A按表8-5所示的規(guī)則進行譯碼和顯示。指令中的×××為無用位。

例如,如果指令第1字節(jié)為80H,第2字節(jié)為06H,則最低位數(shù)碼管顯示6,小數(shù)點dp熄滅;如果指令第1字節(jié)為87H,第2字節(jié)為8CH,則最高位數(shù)碼管顯示H,小數(shù)點dp點亮。按方式1譯碼下載指令。該指令格式如下。

此指令與上一條指令基本相同,所不同的是譯碼方式,該指令按表8-6所示的規(guī)則進行譯碼和顯示。不譯碼下載指令。該指令格式如下。

其中,a2、a1、a0仍為顯示位地址,a~g和dp為顯示數(shù)據(jù),分別對應(yīng)7段LED數(shù)碼管的各段。當(dāng)相應(yīng)的數(shù)據(jù)位為1時,該段點亮,為0時,該段不點亮。該指令可在指定位上顯示字符。例如,若指令第1字節(jié)為96H,第2字節(jié)為3EH,則在L7位(最低位看作第1位)LED數(shù)碼管上顯示字符U,小數(shù)點dp熄滅。閃爍控制指令。該指令格式如下。

該指令控制各個數(shù)碼管的閃爍屬性。d1~d8分別對應(yīng)L1~L8位數(shù)碼管,該位為1,數(shù)碼管不閃爍;該位為0,數(shù)碼管閃爍。默認(rèn)狀態(tài)為所有數(shù)碼管均不閃爍。消隱控制指令。該指令格式如下。

該指令控制各個數(shù)碼管的消隱屬性。d1~d8分別對應(yīng)L1~L8位數(shù)碼管,該位為1,數(shù)碼管顯示;該位為0,數(shù)碼管消隱。當(dāng)某一位被賦予了消隱屬性后,HD7279A在掃描時將跳過該位,因此在這種情況下無論對該位寫入何值,均不會被顯示,但寫入的值將被保留,在將該位重新設(shè)為顯示狀態(tài)后,最后一次寫入的數(shù)據(jù)將被顯示出來。當(dāng)無需用到全部8個數(shù)碼管顯示的時候,將不用的位設(shè)為消隱屬性,可以提高顯示的亮度。注意:至少應(yīng)有一位保持顯示狀態(tài),如果消隱控制指令中d1~d8全部為0,該指令將不被接受,HD7279A保持原來的消隱狀態(tài)不變。段點亮指令

。該指令格式如下。

該指令為段尋址指令,作用為點亮數(shù)碼管中某一指定的段,或LED矩陣中某一指定的LED。d5~d0為段地址,范圍從00H~3FH,具體分配為:第1個數(shù)碼管的g段地址為00H,f段為01H,.…..,a段為06H,小數(shù)點dp為07H,第2個數(shù)碼管的g段地址為08H,f段為09H,.…..,以此類推直至第8個數(shù)碼管的小數(shù)點dp地址為3FH。例如,指令第1字節(jié)為E0H,第2字節(jié)為00H,則點亮L1位LED數(shù)碼管的g段;如果第2字節(jié)為11H,則點亮L3位LED數(shù)碼管的f段。段關(guān)閉指令

。該指令格式如下。

該指令的作用是關(guān)閉某個數(shù)碼管中的某一段。d5~d0為段地址,范圍從00H~3FH,具體分配與上述的段點亮指令相同,僅將點亮段變?yōu)殛P(guān)閉段。例如,指令第1字節(jié)為C0H,第2字節(jié)為00H,則關(guān)閉L1位LED數(shù)碼管的g段;如果第2字節(jié)為11H,則關(guān)閉L3位LED數(shù)碼管的f段。③讀鍵盤指令。該指令的作用是從HD7279A讀出當(dāng)前按下鍵的鍵值,格式如下。

與其他指令不同,此指令的第1個字節(jié)15H為單片機傳送到HD7279A的指令,而第2個字節(jié)d7~d0則為HD7279A返回的按鍵值,其范圍是00H~3FH(無鍵按下時為FFH)。當(dāng)HD7279A檢測到有效按鍵時,引腳從高電平變?yōu)榈碗娖剑⒁恢北3值桨存I釋放為止。在此期間,如果HD7279A接收到來自單片機的讀鍵盤指令15H,則HD7279A向單片機發(fā)出當(dāng)前按下鍵的鍵值。3.單片機與HD7279A的接口設(shè)計(1)接口電路圖8-16所示為80C51單片機通過HD7279A控制8個數(shù)碼管和64鍵矩陣鍵盤的接口電路。外接振蕩元件為典型值,晶振頻率為12MHz。上電后,HD7279A大約經(jīng)過15~18ms的時間才進入工作狀態(tài)。單片機判斷鍵盤矩陣中是否有按鍵按下,是通過腳電平來判斷的。使用中斷方式時,可將腳接至單片機的外部中斷輸入端,并設(shè)置成跳沿觸發(fā)。HD7279A控制顯示器時,應(yīng)連接共陰極顯示器。對于不使用的按鍵和顯示器,可以不連接。省去的顯示器或?qū)︼@示器設(shè)置的消隱、閃爍屬性,均不影響鍵盤的使用。除非不用顯示器,否則串聯(lián)在DP及SA~SG引線上的200電阻不可省去。

如果不使用鍵盤,圖10-16所示的與鍵盤連接的10k電阻和100k電阻便可省去。如果使用鍵盤,電路中的100k下拉電阻則不可省去。HD7279A采用動態(tài)循環(huán)掃描方式,如果采用普通的LED數(shù)碼管亮度不夠,則可采用高亮度或超高亮度型號的LED數(shù)碼管。圖8-16單片機與HD7279A的接口電路(2)程序設(shè)計C51參考程序如下。#include<reg51.h>//***函數(shù)定義***voidlong_delay(void); //長延時voidshort_delay(void); //短暫延時voiddelay10ms(unsignedchar); //延時10MSvoidwrite7279(unsignedchar,unsignedchar); //寫入到HD7279unsignedcharread7279(unsignedchar); //從HD7279讀出voidsend_byte(unsignedchar); //發(fā)送一個字節(jié)unsignedcharreceive_byte(void); //接收一個字節(jié)//***變量及I/O口定義***unsignedchardigit[5];unsignedcharkey_number,j,k;unsignedinttmr;unsignedlongwait_cnter;sbitcs=P1^0; //csatP1.4sbitclk=P1^1; //clk連接于P1.5sbitdat=P1^2; //dat連接于P1.2sbitkey=P1^3; //key連接于P1.3//******HD7279A指令******#defineCMD_RESET0xa4#defineCMD_TEST0xbf#defineDECODE00x80#defineDECODE10xc8#defineCMD_READ0x15#defineUNDECODE0x90#defineRTL_CYCLE0xa3#defineRTR_CYCLE0xa2#defineRTL_UNCYL0xa1#defineRTR_UNCYL0xa0#defineACTCTL0x98#defineSEGON0xe0#defineSEGOFF0xc0#defineBLINKCTL0x88//***主程序***main(){ while(1) { for(tmr=0;tmr<0x2000;tmr++); //上電延時 send_byte(CMD_RESET); //復(fù)位HD7279A

//******************************************//測試指令演示//******************************************send_byte(CMD_TEST); //測試指令 for(j=0;j<3;j++) //延時約3秒 { delay10ms(100); } send_byte(CMD_RESET); //清除顯示//**********************************************//閃爍指令及鍵盤接口測試//將用戶按鍵的鍵碼顯示出來,如果10秒內(nèi)無按鍵//或按S0鍵即進入下一步演示//**********************************************wait_cnter=0; key_number=0xff; write7279(BLINKCTL,0xfc); //第1、2兩位設(shè)為閃爍顯示 write7279(UNDECODE,0X08); //在第1位顯示下劃線'_' write7279(UNDECODE+1,0x08); //在第2位顯示下劃線'_' do { if(!key) //如果有鍵按下 {key_number=read7279(CMD_READ);//讀出鍵碼 write7279(DECODE1+1,key_number/16);//在第2位顯示鍵碼高8位

write7279(DECODE1,key_number&0x0f); //在第1位顯示鍵碼低8位 while(!key); //等待按鍵放開 wait_cnter=0; } wait_cnter++;}while(key_number!=0&&wait_cnter<0x30000); //如果按鍵為‘0’和超時則進入下一步演示write7279

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論