4*4的键盘矩阵
扫描二维码
随时随地手机看文章
一个4*4的键盘矩阵,可以采用逐行扫描或全扫描的方式实现按键的读取。
行列扫描
若行线和列线加驱动后空载时为高电平,逐行扫描的方法为逐行使行线的每位为低,再判断列线的返回信号,如果没有键按下,返回的信号全为高;如果返回的信号中有列线为低,那么肯定是有按键按下,根据列线和行线的交点可以判断按键的具体位置。
可以设置一个数组,存放从1到F对应的16个代码,比如将P2_0与P2_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#include"key.h"//键盘扫描码//键值01234567constunsignedcharkeyboard[16]={0x7e,0x7d,0x7b,0x77,0xbe,0xbd,0xbb,0xb7,//键值89abcdef0xde,0xdd,0xdb,0xd7,0xee,0xed,0xeb,0xe7};constunsignedcharSelect_bit[4]={0x01,0x02,0x04,0x08};//行列扫描所需变量unsignedcharKeyValue=0xFF;//键盘扫描值/******************************************************名称:delay_10ms功能:防抖动延时10ms参数:unsignedinti*******************************************************/voiddelay_10ms(unsignedinti){unsignedintj;for(;i>0;i--)for(j=2250;j>0;j--);}/******************************************************名称:key_value功能:获得键盘扫描值参数:unsignedcharscancode(行列锁确定的扫描值)*******************************************************/voidkey_value(unsignedcharscancode){unsignedcharpoint;for(point=0x00;point<0x10;point++){if(scancode==keyboard[point]){KeyValue=point;}}}/******************************************************名称:Key_AllScan功能:键盘全扫描参数:无*******************************************************/unsignedcharKey_AllScan(void){unsignedcharTemp_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);//获得键盘扫描值}}returnKeyValue;}/******************************************************名称:Key_RankScan功能:键盘行列扫描参数:无*******************************************************/unsignedcharKey_RankScan(void){unsignedcharTemp_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;}}}returnKeyValue;}