郭弘澤,李 敏,b,陳麗霞,b,楊建利,c,王 虹,b
(河北大學(xué) a.電子信息工程學(xué)院; b.光伏技術(shù)虛擬仿真實驗教學(xué)中心; c.河北省數(shù)字醫(yī)療工程重點(diǎn)實驗室,河北 保定 071002)
單片機(jī)應(yīng)用系統(tǒng)中,鍵盤是人機(jī)交互必不可少的部分。通常實現(xiàn)單片機(jī)鍵盤的方法主要有獨(dú)立式鍵盤結(jié)構(gòu)和矩陣式鍵盤結(jié)構(gòu)。在按鍵數(shù)量較多時,為了減少I/O口的需求,通常采用矩陣式鍵盤結(jié)構(gòu)[1-3]?,F(xiàn)有的矩陣式鍵盤在使用過程中,使用的是x+y條線布局,可以監(jiān)控的按鍵數(shù)量為x×y個,若x和y均為4,那么在原有的8條線的基礎(chǔ)上加一條線,就可以實現(xiàn)最多4×5=20個按鍵的監(jiān)控。但是,單片機(jī)的內(nèi)部資源不管是ROM、RAM還是I/O口都是非常有限的資源,諸如這種x+y條線控制x×y個按鍵的情形,某種程度上來說對單片機(jī)的資源占用是非常大的。目前,對于矩陣式鍵盤主要采用掃描式進(jìn)行識別,有些按鍵需要掃描多次才能最終確認(rèn)是否被按下,這就造成了很大的延遲。針對這種8個I/O口可以實現(xiàn)對4×4=16個按鍵的識別與監(jiān)控的鍵盤結(jié)構(gòu)之后又出現(xiàn)了一種改進(jìn)型的按鍵陣列設(shè)計,可以使用8+2個I/O口來監(jiān)控8×8=64個按鍵[4],這種按鍵陣列設(shè)計雖然使得監(jiān)控按鍵的數(shù)量有所增加,但按鍵拓展性不強(qiáng),且仍采用掃描式識別,依然存在較大的時間延遲問題?;诖耍榻B了一種基于51單片機(jī)的鍵盤電路優(yōu)化設(shè)計,以解決現(xiàn)有的按鍵陣列設(shè)計拓展性不強(qiáng)、掃描式識別所帶來的時間延遲較大的問題。
如圖1所示,鍵盤電路以15個按鍵為例進(jìn)行說明。本例中鍵盤電路選用AT89C51型號單片機(jī),在單片機(jī)的最小系統(tǒng)上搭建了鍵盤電路和顯示電路。
圖1 鍵盤電路仿真圖Fig.1 Keyboard circuit simulation diagram
AT89C51型單片機(jī)上具有P0、P1、P2和P3四組端口,每組端口又包括8位I/O口。其中,P0組端口的8個引腳經(jīng)反向截止器與鍵盤電路中相應(yīng)的按鍵連接構(gòu)成鍵盤電路,因為51單片機(jī)P0口內(nèi)部沒有上拉電阻,為高阻狀態(tài),所以不能正常輸出高/低電平,為此在連接按鍵時外接了8只10kΩ大小的上拉電阻;P2組端口的8個引腳與單只數(shù)碼管的段碼相連,數(shù)碼管的公共端為電源,由此構(gòu)成顯示電路[5]。
鍵盤電路中的15個按鍵命名為K1~K15,每一個按鍵都有各自對應(yīng)的編號,每個編號采用二進(jìn)制表示,如按鍵1的編號是0001,按鍵2的編號是0010,以此類推,按鍵15的編號是1111。本例中通過P0組端口的4個引腳來監(jiān)控按鍵K1~K15按鍵,但是需要注意的是,按鍵與單片機(jī)上的引腳之間并非是直接的導(dǎo)線連接,兩者之間還需要設(shè)置一個反向截止器。該按鍵電路中的反向截止器選用二極管,由二極管的正極連接按鍵,二極管的負(fù)極連接單片機(jī)的引腳。每一個按鍵的左側(cè)至少連接一個二極管,按鍵通過二極管與單片機(jī)上P0組端口的其中4個引腳P0.0、P0.1、P0.2和P0.3相連接。各按鍵對應(yīng)的編號用四位二進(jìn)制來表示,因此,根據(jù)各按鍵的二進(jìn)制編號并結(jié)合四位二進(jìn)制的位次,將各按鍵與對應(yīng)二進(jìn)制位次的引腳進(jìn)行連接,即引腳P0.0對應(yīng)四位二進(jìn)制中的第一位(最低位),P0.1對應(yīng)四位二進(jìn)制中的第二位,P0.2對應(yīng)四位二進(jìn)制中的第三位,P0.3對應(yīng)四位二進(jìn)制中的第四位(最高位)。連接時,依據(jù)按鍵的二進(jìn)制編號中所存在的所有“1”對應(yīng)的二進(jìn)制位次進(jìn)行按鍵與引腳之間的連接。例如:對于按鍵K7,其二進(jìn)制編號為0111,在該二進(jìn)制編號0111中,存在三個“1”,且這三個“1”所對應(yīng)的二進(jìn)制位次分別是四位二進(jìn)制的低三位,因此,按鍵K7需要和單片機(jī)中三個引腳進(jìn)行連接,即按鍵K7連接單片機(jī)的引腳P0.0(網(wǎng)絡(luò)標(biāo)號:00)、P0.1(網(wǎng)絡(luò)標(biāo)號:01)和P0.2(網(wǎng)絡(luò)標(biāo)號:02)。
本例中按鍵的排序是采用二進(jìn)制進(jìn)行的布局,按鍵K1對應(yīng)的二進(jìn)制編號為0001,因此,按鍵K1左端通過導(dǎo)線接一個二極管后接到單片機(jī)的引腳P0.0(網(wǎng)絡(luò)標(biāo)號:00)上,其二進(jìn)制轉(zhuǎn)成十進(jìn)制后數(shù)為1;依次類推,按鍵15對應(yīng)的二進(jìn)制編號為1111,因此,按鍵K15左端通過導(dǎo)線分別連接四個二極管后分別接到單片機(jī)的引腳P0.0(網(wǎng)絡(luò)標(biāo)號:00)、P0.1(網(wǎng)絡(luò)標(biāo)號:01)、P0.2(網(wǎng)絡(luò)標(biāo)號:02)和P0.3(網(wǎng)絡(luò)標(biāo)號:03)上,即:按鍵K15對應(yīng)四個高電平,其二進(jìn)制轉(zhuǎn)成十進(jìn)制后數(shù)為15(仿真結(jié)果如圖1所示)。因此,采用四個I/O口,能檢測的按鍵最多是15個,通過將單片機(jī)n個引腳連接按鍵的拓展后,鍵盤電路中包括2n-1個按鍵(1≤n≤8),每個按鍵具有唯一的二進(jìn)制編號;這n個引腳分別對應(yīng)n位二進(jìn)制的位,依據(jù)各按鍵n位二進(jìn)制編號中所有1所在n位二進(jìn)制的位次,將按鍵與單片機(jī)上的相應(yīng)引腳相連接;或者對于某一按鍵來說,該按鍵n位二進(jìn)制編號中所有1所在n位二進(jìn)制的位次,在單片機(jī)中存在相對應(yīng)的引腳,將該按鍵與單片機(jī)中相對應(yīng)的引腳之間通過導(dǎo)線連接,即實現(xiàn)了按鍵與單片機(jī)的連接;按鍵被按下后,與其相連接的導(dǎo)線導(dǎo)通,對應(yīng)引腳呈現(xiàn)高電平,顯示單元在單片機(jī)的作用下,可將按鍵的二進(jìn)制編號所對應(yīng)的十進(jìn)制數(shù)按十六進(jìn)制顯示出來。依照本例中鍵盤電路的設(shè)計方式,二進(jìn)制數(shù)00000000無法檢測,且8位二進(jìn)制數(shù)最多可以表示十進(jìn)制的256,因此,此類型鍵盤電路可以利用單片機(jī)的8個I/O口,實現(xiàn)255個單只按鍵的檢測。
本例鍵盤電路中的所有按鍵均通過二極管與單片機(jī)的引腳相連接,該二極管的加入使得在某個按鍵按下時,能夠保證與該按鍵相接的I/O口呈現(xiàn)高電平,而其他與該按鍵不相接的I/O口依然是低電平,可以避免一個按鍵被按下,所有I/O口全部接收到1進(jìn)而呈現(xiàn)高電平的情況的發(fā)生。本例在Proteus仿真中采用了二極管實現(xiàn)反向截止,實際運(yùn)用中可以采用其他的元器件,只要在一定電壓內(nèi)的具有反向截止特性即可滿足條件。
顯示電路以單只數(shù)碼管為核心,采用共陽極連接方式,由單片機(jī)的P2端口的8個引腳完成段碼控制,以十六進(jìn)制形式實現(xiàn)按鍵K1~K15的序號顯示。顯示電路的主要作用是顯示按鍵號,以此測試按鍵排序[6]。如圖1所示,按鍵K15被按下后,數(shù)碼管顯示為F。
按鍵的檢測通過單片機(jī)引腳的電平變化來確定。需要特別說明的是:在本例中,無按鍵按下時單片機(jī)的P0端口的四個引腳(P0.0、P0.1、P0.2和P0.3)的值為0000,依照本例的按鍵排序方法,按鍵0對應(yīng)的二進(jìn)制編號為0000,對于此種情況,按鍵K0按下前后就無法產(chǎn)生電平變化,故不能用此方法來進(jìn)行按鍵K0的監(jiān)控,同理,八位二進(jìn)制數(shù)中也存在一個無法檢測的二進(jìn)制數(shù)00000000。為此,本例中按鍵排序由K1開始,啟動程序后,顯示電路顯示“0”時代表無鍵按下。以下為判別K1-K15按鍵的C語言部分源程序[7-9]。
void main()
{
P0 = 0x00; //P0口初始化
P1 = 0xff; //P1初始化
num =0;
P2 = shuzi[num];//無按鍵時顯示為0
while(1)
{
if(P0!=0x00&&P0!=0xff)
{
DelayMs(5);
if(P0!=0x00&&P0!=0xff)//延時判斷是否有按鍵按下
{
temp = P0; //P0口狀態(tài)讀取
if(temp%10>=0&&temp%10<=9)
{
num = temp%10; //讀取鍵號0-9
}
switch(temp) //讀取鍵號10-15(顯示為16進(jìn)制A-F)
{
case 0x0a:
num = 10;
break;
case 0x0b:
num = 11;
break;
case 0x0c:
num = 12;
break;
case 0x0d:
num = 13;
break;
case 0x0e:
num = 14;
break;
case 0x0f:
num = 15;
break;
default:;
}
P2 = shuzi[num];// 鍵值顯示
}
}
}
}
根據(jù)上述程序可知在軟件設(shè)計上只需要兩行代碼temp=P0,P2=shuzi[temp],即可實現(xiàn)對15個按鍵的識別與顯示。如果需要增多按鍵,只需要改變對應(yīng)的顯示代碼,但是獲取按鍵的編號仍然只需要一行代碼temp = P0。相比于傳統(tǒng)的方案,大大加快了按鍵的識別及響應(yīng)速度,極大地縮短了所需的代碼,最低只需一行代碼就可以獲得被按下按鍵的具體編號,與掃描式識別相比,效率大大提升。
為了檢測優(yōu)化后的鍵盤電路的可靠性、按鍵響應(yīng)速度及延遲時間[10],完成了4×4矩陣鍵盤和優(yōu)化鍵盤電路實物對比測試。在保證按鍵確定按下的情況下對兩種鍵盤電路的按鍵進(jìn)行多次隨機(jī)檢測,以STC89C52單片機(jī)為控制器,在晶振頻率為11.059 2 MHZ的單片機(jī)最小系統(tǒng)下測試[11-12],此時該系統(tǒng)的機(jī)器周期Tcy≈1.085 μs。在單片機(jī)內(nèi)部的定時/計數(shù)器T0工作于方式1的情況下,記錄兩種按鍵在去除軟件消抖時間后的按鍵識別時間所需的定時器計數(shù)個數(shù)。測試結(jié)果表明,優(yōu)化后的鍵盤的多個按鍵識別時間較為穩(wěn)定且約為傳統(tǒng)鍵盤識別時間的1/3,矩陣鍵盤中按鍵識別時間在同一行內(nèi)相同,不同行內(nèi)有一定差別。某次測試結(jié)果如表1所示,需說明表1內(nèi)鍵值K0僅適用于4×4矩陣鍵盤,優(yōu)化鍵盤不存在K0按鍵。
優(yōu)化后的鍵盤電路在充分利用了二極管的單向?qū)ㄐ缘那闆r下,利用單片機(jī)的4個引腳實現(xiàn)了2n-1即15個按鍵(n=4)的控制,大大減少了控制按鍵的I/O的數(shù)量,避免了過多占用單片機(jī)I/O端口資源,硬件電路設(shè)計簡單。借助Proteus仿真軟件及KEIL編寫的C語言程序,以單只發(fā)光二極管顯示了觸發(fā)按鍵的按鍵序號,軟件代碼簡潔,對比傳統(tǒng)的掃描方式按鍵電路,優(yōu)化后的鍵盤電路對按鍵的識別更高效。證明本電路響應(yīng)速度快,擴(kuò)展性強(qiáng),能夠穩(wěn)定可靠地工作。本例方法可適用于按鍵數(shù)量較多且單個控制的工程應(yīng)用。