【單片機】矩陣按鍵-原理+程序

學了矩陣式按鍵,感覺這方法挺不錯,我之前也搜過關於一些矩陣式按鍵的原理以及程序,好多是找出x,y的座標,然後通過一個計算公式計算出按鍵號,具體我也沒仔細看,我這種方法應該是和他們不一樣,今天分享給大家,大家可以做一下比較呀。

一、電路圖

下面是矩陣按鍵的連接圖。
在這裏插入圖片描述
第一行按鍵連接P1.0,第二行按鍵鏈接P1.1,第三行連接P1.2,第四行連接P1.3(從上到下)
第一列連接P1.4,第二列連接P1.5,第三列連接P1.6,第四列連接P1.7(從左到右)
對按鍵進性編序,第一行第一列的按鍵爲0號按鍵,先行後列進行排序,一直到最後一個F號按鍵。

二、原理

第一步:P1.0–P1.3輸出爲0(4行),P1.4–P1.7做輸入(4列)。
第二步:讀取P1.4–P1.7的數據並保存。
第三步:將第二步中保存的數據從P1.4–P1.7輸出,此時P1.0–P1.3做輸入。
第四步:讀取P1的數據,若無按鍵按下,此時讀取的數據爲0xff,若有按鍵按下,P1.0–P1.3中必定有一個爲0(對應着被按下按鍵的行),P1.4–P1.7中必定有一個爲0(對應着被按下按鍵的列)。
第五步:依據按鍵數組查找被按下的按鍵號。
舉例說明:
假設0號按鍵被按下,P1.0–P1.3輸出爲0(4行),P1.4–P1.7做輸入(4列),0號按鍵按下後,第一列對應的引腳P1.4輸入爲0,此時得到的P1.4–P1.7數據爲0111,將0111數據從P1.4–P1.7輸出,此時P1.0–P1.3做輸入,由於0號按鍵被按下,所以P1.0輸入爲0,則此時P1對應的數據爲0XEE(0111_0111),也就是第一行與第一列交叉處的按鍵被按下了。其他按鍵同理,不同的按鍵對應着不同的P1值。

三、代碼部分

#include <REGX51.H>

#define SEGPORT P0
#define KEYPORT P1

typedef unsigned char u8;
typedef unsigned int u16;

//數碼管顯示按鍵號,段碼
unsigned char code LEDCODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
//查找按鍵號的數組,行和列與電路圖一致
unsigned char KEYCODE[]=
{0XEE,0XDE,0XBE,0X7E,
 0XED,0XDD,0XBD,0X7D,
 0XEB,0XDB,0XBB,0X7B,
 0XE7,0XD7,0XB7,0X77};

//函數聲明
void delayxms(u16 s);  //延時函數
u8 KEY_Scan(void);     //按鍵掃描

//主函數
void main (void)
{
 while(1)
 {
  SEGPORT=~LEDCODE[KEY_Scan()];
 }
}

void delayxms(u16 s)
{
 u16 i,j;
 for(i=0;i<s;i++)
 { 
  for(j=0;j<120;j++)
  {}
 }
}

u8 KEY_Scan(void)
{
 u8 temp,num;
 KEYPORT=0xf0;  //P1.0--P1.3輸出0,P1.4--P1.7輸出爲1,爲輸入做準備
 temp=KEYPORT;  //讀入P1的值
 temp&=0xf0;    //保留P1.4--P1.7的數據
 if(temp!=0xf0) //若P1.4--P1.7輸入不全爲1,代表有按鍵被按下
 {
  delayxms(5);  //延時消抖
  KEYPORT=0xf0; //再次判斷是否真有按鍵按下
  temp=KEYPORT; //讀入P1的值
  temp&=0xf0;   //保留P1.4--P1.7的數據
  if(temp!=0xf0)  //真有按鍵按下
  {
   temp|=0x0f;    
   KEYPORT=temp; //將讀取的P1.4--P1.7數據從P1.4--P1.7輸出,此時P1.0--P1.3做輸入
   temp=KEYPORT; //再次讀取P1的值,上述原理中的第四步
   for(num=0;num<16;num++)  //查找按鍵號,
   {
    if(temp==KEYCODE[num])
     break;
   }
   return num;  //對應按鍵號
  }
  return 16;   //表示無按鍵按下
 }
 else
  return 16;
} 

四、仿真

由於在家,只能用proteus進行仿真,這裏當無按鍵按下時,我讓數碼管顯示”-“,有按鍵按下時,顯示被按下的按鍵號。
下面是我仿真的一個視頻!!!

單片機矩陣按鍵仿真

大家有什麼問題歡迎在品論區留言呀!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章