日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

51单片机按键控制数码管0~9_基于proteus的51单片机开发实例24-矩阵键盘(行列式键盘)...

發(fā)布時(shí)間:2023/12/10 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51单片机按键控制数码管0~9_基于proteus的51单片机开发实例24-矩阵键盘(行列式键盘)... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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í)例仿真

編寫程序代碼,編譯生成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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。