基於proteus的51單片機開發實例24-矩陣鍵盤(行列式鍵盤)

2020-08-20 老馬識途單片機

1. 基於proteus的51單片機開發實例24-矩陣鍵盤

1.1. 實驗目的


圖1 矩陣鍵盤電路


本實例我們來學習矩陣鍵盤(行列式鍵盤)的電路設計、編程實現。目的是通過較少的I/O口來識別多個按鍵。

1.2. 設計思路

我們在前面已經學習過獨立按鍵,在獨立按鍵電路中,一個按鍵連接單片機的一位I/O埠。這樣通過檢測I/O的狀態就能很方便的識別該按鍵是否按下。這種電路的優點是:電路簡單,程序簡單,缺點是一個按鍵就要佔用一個I/O口。我們知道,51單片機總共只有4個8位I/O口,如果外部電路功能較多,I/O口就會不夠用,例如如果電路中接了一個8位數碼管,又接了16個按鍵,那麼即使數碼管採用動態掃描法 也需要佔用16個I/O口(8位I/O口用於連接數碼管8個段,另8位I/O口用於控制8位數碼管的每一位),這時如果按鍵還是採用獨立按鍵的接法,每個按鍵接一位I/O口,那麼又要佔用16個I/O口,這樣就把單片機的I/O口全部佔完了,如果這時候想加一個蜂鳴器,就沒有多餘的I/O口了。所以很與必要考慮如何用較少的I/O口實現更多的功能。

矩陣鍵盤就是基於用較少I/O口連接更多按鍵的思路實現的。通常將多個按鍵排列成矩陣形式,這也是矩陣鍵盤名稱的由來,編程時,是按照矩陣的行、列組合判斷是那個按鍵被按下的,因此又稱為行列式鍵盤。

1.3. 基礎知識

最常見的矩陣鍵盤是4*4鍵盤,其實現方法是將16個按鍵按照4x4矩陣方式連接,如下圖所示。從連接方式來看,有4根行線和4根列線。每個行線和列線的交匯處就是一個按鍵位。這樣總共有8根線就可以實現16個按鍵的檢測,比一個按鍵連接一個I/O口節省了一半的I/O埠。


圖2 矩陣鍵盤結構


矩陣鍵盤的工作原理

一般矩陣鍵盤都會將按鍵按照一定的規律賦予不同的標號(例如按照從左到右的順序,或者從上到下的順序),當檢測到有按鍵按下後,根據被按下的按鍵序號賦予一定的鍵值。程序中就可以根據鍵值進行相應的處理。

在51單片機中,對於矩陣鍵盤的處理方法是:使用行列掃描法,將鍵盤的行線和列線分別連接到單片機的I/O口線上,然後按照如下步驟操作:

第一步:判斷是否有按鍵按下

將行線全部輸出低電平,全部列線輸出高電平,然後將列線置為輸入狀態,檢測列線的狀態,只要有一根列線為低電平 ,就表示矩陣鍵盤中有按鍵被按下了。

第二步:按鍵消除抖動

在第一步中如果檢測到有按鍵按下,則使用軟體消抖的方法延時20ms左右,再次判斷是否有列線為低電平,如果仍有列線為低電平,則認為確實有按鍵被按下,則進入到第三步處理,否則,認為是抖動,不予識別,繼續回到第一步重新開始按鍵檢測。

第三步:按鍵識別

確認有按鍵被按下後,接下來就是最關鍵的內容:確定那個按鍵被按下。這需要用逐行掃描的方法來確定。先掃描第一行,即將第一行對應的埠輸出低電平,然後讀每一列的電平,當出現某一列為低電平,說明該列與第一行的交叉點的按鍵被按下,如果所有列都是高電平,說明第一行的按鍵都未被按下,那麼開始掃描第二行,以此類推,直到找到被按下的鍵所在的行與列的交叉點。

第四步:鍵值確定

在第三步中,當確定有按鍵被按下,則按照事先確定好的按鍵序號,根據行與列的交叉位置確定鍵值。簡直一般按照一定的規律排列,例如1,2,3,4....。例如確定第一行第一列的交叉點按鍵為1號按鍵,第一行與第二列交叉點的按鍵為2號按鍵....第四行與第四列的交叉點的按鍵為16號按鍵。

1.4. 電路設計

本實例電路圖如圖1所示。矩陣鍵盤電路與單片機的P3口的8額I/O連接,P0口連接一個共陽極數碼管,用於演示按鍵序號,指示那個按鍵被按下。

1.5. 程序設計

本實例程序代碼如下。

為了能讓大家更為直觀的理解矩陣鍵盤的掃描原理,本例的代碼非常詳細的列出了整個矩陣鍵盤的行列掃描過程,沒有採用更簡潔的編程方法。

#include<AT89X51.h> //

sbit P34=P3^4; //埠引腳定義

sbit P35=P3^5; //

sbit P36=P3^6; //

sbit P37=P3^7; //

//共陽極數碼管段碼錶,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;

//延時函數

void led_delay(void)

{

unsigned char j;

for(j=0;j<200;j++)

;

}

//數碼管顯示鍵值

void display(unsigned char k)

{

P0=Tab[k]; //鍵值送數碼管顯示

led_delay(); //延時

}

// void delay20ms(void)

{

unsigned char i,j;

for(i=0;i<100;i++)

for(j=0;j<60;j++)

;

}

void main(void)

{

EA=1; //總中斷開啟

ET0=1; //定時器T0中斷開啟

TMOD=0x01; //定時器T0工作方式1

TH0=(65536-500)/256; //定時器初值

TL0=(65536-500)%256; //定時器初值

TR0=1; //開啟定時器

keyval=0x00; //鍵值初始化為0

P2=0xFC;//數碼管公共端打開,允許顯示

while(1)

{

display(keyval); //數碼管顯示鍵值

}

}

//定時器T0中斷服務程序

void time0_interserve(void) interrupt 1 using 1

{

TR0=0; //進中斷後,先關閉定時器

P3=0xf0; //行線電平全部置低電平,列線全部置高電平

if((P3&0xf0)!=0xf0) //如果列線中有低電平,說明有鍵被按下

delay20ms(); //延時,消除按鍵抖動

if((P3&0xf0)!=0xf0) //消抖後仍有列線為低電平,則認為確實有按鍵按下

{

//掃描第一行

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; //重啟定時器

TH0=(65536-500)/256; //定時器賦初值

TL0=(65536-500)%256; //

}

1.6. 實例仿真

編寫程序代碼,編譯生成HEX文件,將HEX文件裝載到proteus電路的單片機中,開始仿真,通過按下不同的按鍵觀察數碼管顯示的鍵值。

1.7. 總結

通過本實例,我們了解了如何用較少的按鍵實現矩陣鍵盤的按鍵識別。這為我們以後學習如何節約I/O埠打下了基礎。

相關焦點

  • 基於proteus的51單片機開發實例37-DAC0832
    基於proteus的51單片機開發實例37-DAC08321.1. 實驗目的之前我們學習了數模轉換晶片DAC0808,今天我們繼續學習另一種D/A轉換晶片DAC0832。設計思路圖1 DAC0832電路本例中使用51單片機控制D/A
  • 51單片機對矩陣鍵盤實現16個按鍵操作的設計
    矩陣鍵盤是單片機外部設備中所使用的排布類似於矩陣的鍵盤組。矩陣式結構的鍵盤顯然比直接法要複雜一些,識別也要複雜一些,列線通過電阻接正電源,並將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。矩陣鍵盤的優點是節約單片機IO口,例如普通鍵盤8個IO口只能用作8個按鍵,而矩陣鍵盤能作16個按鍵。
  • 基於proteus的51單片機開發實例30-模塊化程序設計
    基於proteus的51單片機開發實例30-模塊化程序設計1.1.實驗目的模塊化程序設計不知不覺我們的51單片機開發實例已經進行到第三十篇了設計思路本實例的設計思路是:將《基於proteus的51單片機開發實例29-單總線DS18B20的讀寫》中的程序代碼按照延時功能、LCD1602液晶顯示功能、DS18B20的讀寫控制功能這三個部分,使用模塊化程序設計的方法,將這三個部分分別封裝為三個.c和.h文件
  • 基於proteus的51單片機開發實例33-單片機的編程規範
    基於proteus的51單片機開發實例33-單片機程序的編程規範說明:本文中所說的編程規範只是我個人的一些想法和實踐,有些經驗可能並不能適合所有場合,當然也不可避免的有比較偏頗的看法,請大家多多批評指正。
  • 單片機4×4矩陣鍵盤設計方案
    1、設計原理本文引用地址:http://www.eepw.com.cn/article/172439.htm  (1)如圖14.2所示,用單片機的並行口P3連接4×4矩陣鍵盤,並以單片機的P3.0-P3.3各管腳作輸入線,以單片機的P3.4-
  • 簡單的4×4行列式鍵盤控制電路設計(三款電路設計原理圖詳解)
    >4X4行列式鍵盤控制電路(一) 1.概述 鍵盤是一組按壓式開關的集合,是微機系統不可缺少的輸入設備,用於輸入數據和命令。(掃描)顯示兩種。 4X4行列式鍵盤控制電路(二) 如圖2所示,用AT89S51的並行口P1接4×4矩陣鍵盤,以P1.0-P1.3作輸入線,以P1.4-
  • 跟我學51單片機(四):獨立-矩陣鍵盤應用與設計
    上講介紹並應用了單片機的串口通信,並給出了實例。從這一講開始將介紹單片機的外圍電路。這講向大家介紹單片機外接鍵盤電路,通過該講,讀者可以掌握單片機外接鍵盤的工作原理從而實現電路與程序設計。
  • 基於FPGA的RS232行列式矩陣鍵盤接口設計
    一、引言本文引用地址:http://www.eepw.com.cn/article/245960.htm本方案是用VHDL語言來實現的基於RS232按位串行通信總線的行列式矩陣鍵盤接口電路,具有復位和串行數據的接收與發送功能,根據發光二極體led0
  • 如何使用通用單片機製作MIDI鍵盤
    有些計算機音序軟體支持用電腦鍵盤模擬琴鍵,可通過計算機鍵盤將音符輸入計算機,有愛好者就用電腦鍵盤的控制晶片改裝玩具電子琴,將其並接在計算機鍵盤上,稱之為電腦琴,但這種控制晶片本身並不是為演奏音樂開發的,單音演奏還可以,在多個按鍵壓下時會出錯。
  • 51單片機矩陣鍵盤與8051連接設計
    眾所周知,51單片機一般的鍵盤檢測原理為非編碼鍵盤檢測,沒有專門用來產生鍵編碼號或鍵值的電路晶片;而我們使用的電腦鍵盤為編碼鍵盤,通過編碼電路晶片為每個按鍵產生一個編碼號,可以通過串行總線把鍵值傳輸給電腦。
  • 51單片機教程:矩陣式鍵盤接口技術及程序設計
    在單片機系統中鍵盤中按鈕數量較多時,為了減少I/O口的佔用,常常將按鈕排列成矩陣形式,如圖1所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鈕加以連接。
  • 單片機4x4矩陣鍵盤掃描程序
    4x4  矩陣鍵盤  掃描程序 編輯:什麼魚 引用地址:http://news.eeworld.com.cn/mcu/article_2017111335900.html 推薦閱讀 51單片機學習實踐:用NTC
  • 基於51單片機的異步串行接口鍵盤設計
    筆者結合工作實際,圍繞單片機89C51設計了通用異步串行接口鍵盤作為顯示分系統的擴展鍵盤。目的在於為顯示分系統增加一種幹預手段。實踐表明:此鍵盤改善了系統的人機界面,提高了系統的處理效率。1 設計要求與工作原理1.1 設計要求 (1)擴展鍵盤鍵位編碼符合顯示分系統的約定。
  • 單片機 4*4 矩陣鍵盤應用
    在單片機按鍵使用過程中,當鍵盤中按鍵數量較多時 為了減少埠的佔用通常將按鍵排列成矩陣 形式如下圖所示,在矩陣式鍵盤中 每條水平線和垂直線在交叉處不直接連通而是通過一個按鍵加以連接,到底這樣做是出意何種目的呢?
  • STC90C51單片機矩陣鍵盤聯動動態數碼管
    實驗準備STC90C51單片機一臺P2 GPIO口短接矩陣鍵盤JP4GPIO P0 短接動態數碼管控制端573LedOn2(0,(v+1)/10); } } } } }實驗程序講解矩陣鍵盤採用行列式掃描
  • 介紹一個非常好用的單片機仿真軟體PROTEUS(帶下載連結)
    首先把proteus軟體連結發給需要的朋友百度網盤連結:https://pan.baidu.com/s/1gaWBwyVgbQGEDL-29Zkqhg 提取碼:ddgd想自學低端從事單片機教學多年,雖說不夠精通,但帶領學生入門單片機足夠了。說實話,一個從沒有接觸過計算機語言的初學者,因為沒有程序的概念,學習單片機是有一定難度的。但如果方法得當,則能再最短時間內入門,也會為之後的深入學習打好一個良好的基礎。以下我將從幾方面來總結入門單片機需要做的幾步。首先,選好設備。
  • 51單片機之4位數加法計算器的設計報告
    AT89C52是一個低功耗,高性能的51內核的CMOS 8位單片機,片內含8k空間的可反覆擦些1000次的Flash只讀存儲器,具有256 bytes的隨機存取數據存儲器(RAM),32個雙向I/O口,2個16位可編程定時計數器。綜合考慮,選擇方案二,採用Atmel公司的AT89C52單片機作為控制器。
  • 基於51單片機的兩路溫度控制器的設計方案
    本方案設計的實現基於C51單片機的兩路溫度控制器,做到成本最低化,精確度高,兩路溫度的顯示和控制,能在溫度超出設定的最高溫度時啟動電風扇進行降溫,在溫度低於設定的最低溫度時啟動蜂鳴器報警,能夠用戶設定最高最低溫。  2.系統結構  溫度控制器系統包括以下幾個主要部分:溫度傳感器,報警電路,LED顯示電路,鍵盤控制,89C51控制部分。
  • 基於Cortex-M0的USB密碼鍵盤設計
    引言本文引用地址:http://www.eepw.com.cn/article/171417.htm密碼鍵盤廣泛地應用在金融、電信、會員卡等很多領域,現在市場的密碼鍵盤主要有三大類接口:PS2、串口和USB。
  • 基於單片機的應用於視頻監控的矩陣切換器設計
    根據視頻監控系統對矩陣切換器的基本要求,設計了基於單片機的32×8視頻矩陣切換器。文中詳細論述了其接口電路設計,最後給出了由此矩陣切換器組成的視頻監控系統實例。