51单片机按键控制数码管0~9_基于proteus的51单片机开发实例24-矩阵键盘(行列式键盘)...
1. 基于proteus的51單片機(jī)開(kāi)發(fā)實(shí)例24-矩陣鍵盤
1.1. 實(shí)驗(yàn)?zāi)康?/strong>
圖1 矩陣鍵盤電路
本實(shí)例我們來(lái)學(xué)習(xí)矩陣鍵盤(行列式鍵盤)的電路設(shè)計(jì)、編程實(shí)現(xiàn)。目的是通過(guò)較少的I/O口來(lái)識(shí)別多個(gè)按鍵。
1.2. 設(shè)計(jì)思路
我們?cè)谇懊嬉呀?jīng)學(xué)習(xí)過(guò)獨(dú)立按鍵,在獨(dú)立按鍵電路中,一個(gè)按鍵連接單片機(jī)的一位I/O端口。這樣通過(guò)檢測(cè)I/O的狀態(tài)就能很方便的識(shí)別該按鍵是否按下。這種電路的優(yōu)點(diǎn)是:電路簡(jiǎn)單,程序簡(jiǎn)單,缺點(diǎn)是一個(gè)按鍵就要占用一個(gè)I/O口。我們知道,51單片機(jī)總共只有4個(gè)8位I/O口,如果外部電路功能較多,I/O口就會(huì)不夠用,例如如果電路中接了一個(gè)8位數(shù)碼管,又接了16個(gè)按鍵,那么即使數(shù)碼管采用動(dòng)態(tài)掃描法 也需要占用16個(gè)I/O口(8位I/O口用于連接數(shù)碼管8個(gè)段,另8位I/O口用于控制8位數(shù)碼管的每一位),這時(shí)如果按鍵還是采用獨(dú)立按鍵的接法,每個(gè)按鍵接一位I/O口,那么又要占用16個(gè)I/O口,這樣就把單片機(jī)的I/O口全部占完了,如果這時(shí)候想加一個(gè)蜂鳴器,就沒(méi)有多余的I/O口了。所以很與必要考慮如何用較少的I/O口實(shí)現(xiàn)更多的功能。
矩陣鍵盤就是基于用較少I/O口連接更多按鍵的思路實(shí)現(xiàn)的。通常將多個(gè)按鍵排列成矩陣形式,這也是矩陣鍵盤名稱的由來(lái),編程時(shí),是按照矩陣的行、列組合判斷是那個(gè)按鍵被按下的,因此又稱為行列式鍵盤。
1.3. 基礎(chǔ)知識(shí)
最常見(jiàn)的矩陣鍵盤是4*4鍵盤,其實(shí)現(xiàn)方法是將16個(gè)按鍵按照4x4矩陣方式連接,如下圖所示。從連接方式來(lái)看,有4根行線和4根列線。每個(gè)行線和列線的交匯處就是一個(gè)按鍵位。這樣總共有8根線就可以實(shí)現(xiàn)16個(gè)按鍵的檢測(cè),比一個(gè)按鍵連接一個(gè)I/O口節(jié)省了一半的I/O端口。
圖2 矩陣鍵盤結(jié)構(gòu)
矩陣鍵盤的工作原理
一般矩陣鍵盤都會(huì)將按鍵按照一定的規(guī)律賦予不同的標(biāo)號(hào)(例如按照從左到右的順序,或者從上到下的順序),當(dāng)檢測(cè)到有按鍵按下后,根據(jù)被按下的按鍵序號(hào)賦予一定的鍵值。程序中就可以根據(jù)鍵值進(jìn)行相應(yīng)的處理。
在51單片機(jī)中,對(duì)于矩陣鍵盤的處理方法是:使用行列掃描法,將鍵盤的行線和列線分別連接到單片機(jī)的I/O口線上,然后按照如下步驟操作:
第一步:判斷是否有按鍵按下
將行線全部輸出低電平,全部列線輸出高電平,然后將列線置為輸入狀態(tài),檢測(cè)列線的狀態(tài),只要有一根列線為低電平 ,就表示矩陣鍵盤中有按鍵被按下了。
第二步:按鍵消除抖動(dòng)
在第一步中如果檢測(cè)到有按鍵按下,則使用軟件消抖的方法延時(shí)20ms左右,再次判斷是否有列線為低電平,如果仍有列線為低電平,則認(rèn)為確實(shí)有按鍵被按下,則進(jìn)入到第三步處理,否則,認(rèn)為是抖動(dòng),不予識(shí)別,繼續(xù)回到第一步重新開(kāi)始按鍵檢測(cè)。
第三步:按鍵識(shí)別
確認(rèn)有按鍵被按下后,接下來(lái)就是最關(guān)鍵的內(nèi)容:確定那個(gè)按鍵被按下。這需要用逐行掃描的方法來(lái)確定。先掃描第一行,即將第一行對(duì)應(yīng)的端口輸出低電平,然后讀每一列的電平,當(dāng)出現(xiàn)某一列為低電平,說(shuō)明該列與第一行的交叉點(diǎn)的按鍵被按下,如果所有列都是高電平,說(shuō)明第一行的按鍵都未被按下,那么開(kāi)始掃描第二行,以此類推,直到找到被按下的鍵所在的行與列的交叉點(diǎn)。
第四步:鍵值確定
在第三步中,當(dāng)確定有按鍵被按下,則按照事先確定好的按鍵序號(hào),根據(jù)行與列的交叉位置確定鍵值。簡(jiǎn)直一般按照一定的規(guī)律排列,例如1,2,3,4....。例如確定第一行第一列的交叉點(diǎn)按鍵為1號(hào)按鍵,第一行與第二列交叉點(diǎn)的按鍵為2號(hào)按鍵....第四行與第四列的交叉點(diǎn)的按鍵為16號(hào)按鍵。
1.4. 電路設(shè)計(jì)
本實(shí)例電路圖如圖1所示。矩陣鍵盤電路與單片機(jī)的P3口的8額I/O連接,P0口連接一個(gè)共陽(yáng)極數(shù)碼管,用于演示按鍵序號(hào),指示那個(gè)按鍵被按下。
1.5. 程序設(shè)計(jì)
本實(shí)例程序代碼如下。
為了能讓大家更為直觀的理解矩陣鍵盤的掃描原理,本例的代碼非常詳細(xì)的列出了整個(gè)矩陣鍵盤的行列掃描過(guò)程,沒(méi)有采用更簡(jiǎn)潔的編程方法。
#include //
sbit P34=P3^4; //端口引腳定義
sbit P35=P3^5; //
sbit P36=P3^6; //
sbit P37=P3^7; //
//共陽(yáng)極數(shù)碼管段碼表,0~9,A,b,c,d,E,F,H,P
unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89}; //
//定義鍵值的全局變量
unsigned char keyval;
//延時(shí)函數(shù)
void led_delay(void)
{
unsigned char j;
for(j=0;j<200;j++)
;
}
//數(shù)碼管顯示鍵值
void display(unsigned char k)
{
P0=Tab[k]; //鍵值送數(shù)碼管顯示
led_delay(); //延時(shí)
}
// void delay20ms(void)
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++)
;
}
void main(void)
{
EA=1; //總中斷開(kāi)啟
ET0=1; //定時(shí)器T0中斷開(kāi)啟
TMOD=0x01; //定時(shí)器T0工作方式1
TH0=(65536-500)/256; //定時(shí)器初值
TL0=(65536-500)%256; //定時(shí)器初值
TR0=1; //開(kāi)啟定時(shí)器
keyval=0x00; //鍵值初始化為0
P2=0xFC;//數(shù)碼管公共端打開(kāi),允許顯示
while(1)
{
display(keyval); //數(shù)碼管顯示鍵值
}
}
//定時(shí)器T0中斷服務(wù)程序
void time0_interserve(void) interrupt 1 using 1
{
TR0=0; //進(jìn)中斷后,先關(guān)閉定時(shí)器
P3=0xf0; //行線電平全部置低電平,列線全部置高電平
if((P3&0xf0)!=0xf0) //如果列線中有低電平,說(shuō)明有鍵被按下
delay20ms(); //延時(shí),消除按鍵抖動(dòng)
if((P3&0xf0)!=0xf0) //消抖后仍有列線為低電平,則認(rèn)為確實(shí)有按鍵按下
{
//掃描第一行
P3=0xfe; //行線第一行置低電平,
if(P34==0) //第一列為低電平,則第一行第一列的按鍵按下
keyval=1; //按下的按鍵的鍵值
if(P35==0) //第二列為低電平,則第一行第二列按鍵按下
keyval=2; //鍵值
if(P36==0) //第三列為低電平,則第一行第三列按鍵按下
keyval=3;
if(P37==0) //第四列為低電平,則第一行第四列按鍵按下
keyval=4; //
//掃描第二行
P3=0xfd;
if(P34==0)
keyval=5;
if(P35==0)
keyval=6;
if(P36==0)
keyval=7;
if(P37==0)
keyval=8;
//掃描第三行
P3=0xfb;
if(P34==0)
keyval=9;
if(P35==0)
keyval=10;
if(P36==0)
keyval=11;
if(P37==0)
keyval=12;
//掃描第四行
P3=0xf7;
if(P34==0)
keyval=13;
if(P35==0)
keyval=14;
if(P36==0)
keyval=15;
if(P37==0)
keyval=16;
}
TR0=1; //重啟定時(shí)器
TH0=(65536-500)/256; //定時(shí)器賦初值
TL0=(65536-500)%256; //
}
1.6. 實(shí)例仿真
編寫(xiě)程序代碼,編譯生成HEX文件,將HEX文件裝載到proteus電路的單片機(jī)中,開(kāi)始仿真,通過(guò)按下不同的按鍵觀察數(shù)碼管顯示的鍵值。
1.7. 總結(jié)
通過(guò)本實(shí)例,我們了解了如何用較少的按鍵實(shí)現(xiàn)矩陣鍵盤的按鍵識(shí)別。這為我們以后學(xué)習(xí)如何節(jié)約I/O端口打下了基礎(chǔ)。
總結(jié)
以上是生活随笔為你收集整理的51单片机按键控制数码管0~9_基于proteus的51单片机开发实例24-矩阵键盘(行列式键盘)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java多线程实战指南_学习笔记《Jav
- 下一篇: myeclipse使用git图文教程