4*4的键盘矩阵

一个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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值