新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī) 4*4矩陣鍵盤 掃描方式

51單片機(jī) 4*4矩陣鍵盤 掃描方式

作者: 時(shí)間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
實(shí)際工程應(yīng)用中,遇到按鍵比較多的情況,大多是使用矩陣鍵盤或者編碼鍵盤。處于成本考慮,一般使用矩陣鍵盤。

以下是矩陣鍵盤部分原理圖:

本文引用地址:http://butianyuan.cn/article/201611/321311.htm



代碼如下:

#include
#define uint unsigned int
#define uchar unsigned char
sbit duanxuan=P2^6;
sbit pianxuan=P2^7;

uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; //編碼定義

void delay_xs(uint);//延時(shí)函數(shù)聲明
void display(uint);//顯示函數(shù)聲明(只是負(fù)責(zé)送段選信號(hào))
void keyscan();//鍵盤掃描函數(shù)聲明

void main()
{
//數(shù)碼管位選端初始化
duanxuan=1;
P0=0x40;
duanxuan=0;
P0=0xff;
pianxuan=1;
P0=0xc0;
pianxuan=0;
//主體部分
while(1)
{
keyscan();
}
}
//延時(shí)函數(shù)主體
void delay_xs(uint xs)
{
uint i,j;
for(i=xs;i>0;i--)
{
for(j=110;j>0;j--)
{
}
}
}
//顯示函數(shù)主體
void display( uint key)
{
duanxuan=1;
P0=table[key];
duanxuan=0;
}
//鍵盤掃描函數(shù)主體
void keyscan()
{
uint buffer,key;
//掃描第一行
P0=0xfe; //1111 1110賦值給P3,此時(shí)鍵盤第一行全為0
buffer=P3;
buffer=buffer&0xf0; //1111 1110 & 1111 0000=1111 0000如果有按鍵按下,1111 1110的高四位必定出現(xiàn)0,此時(shí)按位與的結(jié)果不再是1111 0000
if(buffer!=0xf0) //不等于1111 0000 說明有鍵被按下
{
delay_xs(10); //延時(shí)10us,防止抖動(dòng)
buffer=P3; //此時(shí)的buffer=buffer&1111 0000,不是P3,所以要重新賦值,為延時(shí)之后再判斷做準(zhǔn)備
buffer=buffer&0xf0;
if(buffer!=0xf0) //依然按下
{
buffer=P3;//再一次賦值
switch(buffer)//判斷第一行哪一個(gè)按鍵被按下
{
case 0xee: //如果是第一個(gè)按鍵被按下,buffer(P3)的值將是1110 1110
key=0;
break;
case 0xde:
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(buffer!=0xf0) //buffer不等于1111 0000,說明按鍵沒有還是被按下
{
buffer=P3;
buffer=buffer&0xf0;
}
display(key);//送段選信號(hào)
}

}
//掃描第二行
P3=0xfd;
buffer=P3;
buffer=buffer&0xf0;
if(buffer!=0xf0)
{
delay_xs(10);
buffer=P3;
buffer=buffer&0xf0;
if(buffer!=0xf0)
{
buffer=P3;
switch(buffer)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(buffer!=0xf0)
{
buffer=P3;
buffer=buffer&0xf0;
}
display(key);
}
}
//掃描第三行
P3=0xfb;
buffer=P3;
buffer=buffer&0xf0;
if(buffer!=0xf0)
{
delay_xs(10);
buffer=P3;
buffer=buffer&0xf0;
if(buffer!=0xf0)
{
buffer=P3;
switch(buffer)
{
case 0xeb:
key=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
break;
}
while(buffer!=0xf0)
{
buffer=P3;
buffer=buffer&0xf0;
}
display(key);
}
}
//掃描第四行
P3=0xf7;
buffer=P3;
buffer=buffer&0xf0;
if(buffer!=0xf0)
{
delay_xs(10);
buffer=P3;
buffer=buffer&0xf0;
if(buffer!=0xf0)
{
buffer=P3;
switch(buffer)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(buffer!=0xf0)
{
buffer=P3;
buffer=buffer&0xf0;
}
display(key);
}
}
}


以上,結(jié)束。



評(píng)論


技術(shù)專區(qū)

關(guān)閉