4*4的键盘矩阵

来源:互联网 发布:有道云协作下载 mac 编辑:程序博客网 时间:2024/05/21 10:58

 

一个4*4的键盘矩阵,可以采用逐行扫描或全扫描的方式实现按键的读取。

行列扫描

若行线和列线加驱动后空载时为高电平,逐行扫描的方法为逐行使行线的每位为低,再判断列线的返回信号,如果没有键按下,返回的信号全为高;如果返回的信号中有列线为低,那么肯定是有按键按下,根据列线和行线的交点可以判断按键的具体位置。

可以设置一个数组,存放从1F对应的16个代码,比如将P2_0P2_7的交点处定为0,那么数组第0个元素则为0X7E(二进制0111 1110),当正确求出P2对应的数值时与数组对照便可求得按键的值。

uchar keyboard[16]={0x7e,0x7d,0x7b,0x77,0xbe,0xbd,0xbb,0xb7,0xde,

0xdd,0xdb,0xd7,0xee,0xed,0xeb,0xe7},这个数组就是对应键盘扫描值的0~F

注意:这个数组依照确定键值的位置不同而不同。

全扫描

全扫描的方法为先列线全为低,判断行线,如果行线有为低的,则可以判断有键按下,此时还不能判断某列的具体的键和列,还需反过来将列线全为高,再判断具体的列,根据行列号即确定具体的按键。

 

#include <at89x52.h>

#include "key.h"

 

//键盘扫描码

//键值 0 1 2 3 4 5 6 7

const unsigned char keyboard[16]={0x7e,0x7d,0x7b,0x77,0xbe,0xbd,0xbb,0xb7,

//键值 8 9 a b c d e f

0xde,0xdd,0xdb,0xd7,0xee,0xed,0xeb,0xe7 };

 

const unsigned char Select_bit[4] = {0x01,0x02,0x04,0x08};         //行列扫描所需变量

 

unsigned char KeyValue = 0xFF;         //键盘扫描值

 

/******************************************************

名称:delay_10ms

功能:防抖动延时10ms

参数:unsigned int i

*******************************************************/

void delay_10ms(unsigned int i)

{

unsigned int j;

for(;i>0;i--)

for(j=2250;j>0;j--);

}

 

/******************************************************

名称:key_value

功能:获得键盘扫描值

参数:unsigned char scancode(行列锁确定的扫描值)

*******************************************************/

void key_value(unsigned char scancode)

{

unsigned char point;

 

for( point = 0x00; point < 0x10; point++)

{

if(scancode == keyboard[point])

{

KeyValue = point;

}

}        

}

 

/******************************************************

名称:Key_AllScan

功能:键盘全扫描

参数:无

*******************************************************/

unsigned char Key_AllScan(void)

{

unsigned char Temp_key, Temp_10ms;

P2 = 0x0F;                        //全扫描线全为低,判断行线

Temp_key = P2;

if ( Temp_key < 0x0F )        //判断按键按下

{

delay_10ms(1);                 //延时防抖动

Temp_10ms = P2;

if(Temp_10ms == Temp_key)

{

Temp_key ^= 0xF0;   //列线全为高在判断具体的列

P2 = Temp_key;

Temp_key = P2;

key_value(Temp_key);   //获得键盘扫描值

}

}

return KeyValue;

}

 

/******************************************************

名称:Key_RankScan

功能:键盘行列扫描

参数:无

*******************************************************/

unsigned char Key_RankScan(void)

{

unsigned char Temp_key, Temp , Temp_10ms, point;

 

for(point = 0x00; point < 0x04; point++)         //逐行设置低电平

{

Temp = 0xFF;

Temp ^= Select_bit[point];                           //判断是否有按键按下

P2 = Temp;

Temp_key = P2;

if(Temp != Temp_key)

{

delay_10ms(1);                                                //延时放抖动

Temp_10ms = P2;

if(Temp_10ms == Temp_key)

{

key_value(Temp_key);

break;

}                

}        

}

return KeyValue;                        

}