行扫描法类似列扫描法:话不多说!如下
矩阵键盘如下图:
行扫描涉及到与运算:与运算符号为& ,计算规则是:有0全为0,全1才为1
如:1111 0000 和 1011 0000进行与运算
1111 0000
1011 0000
-----------
运算结果: 1011 0000
行扫描法:假设按下的是12号键
第1步:识别键盘有无键按下
第2步,识别出哪个按键被按下。采用逐行扫描法,在某一时刻只让1条行线处于低电平,其余所有行线处于高电平。
当第1行为低电平,其余各行为高电平时,因为是键3被按下,第1列的列线仍处于高电平;
当第2行为低电平,其余各行为高电平时,第1行的列线仍处于高电平;直到让第4行为低电平,
其余各行为高电平时,此时第1行的列线电平变为低电平,据此,可判断第4行第1列交叉点处的按键,
即12号键被按下。
#include <reg52.h>
typedef unsigned char u8;
#define KEY_PRESS P1 //控制P1的口
unsigned char code smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F
unsigned char KeyScan();//行扫描函数,返回相应的键值
unsigned char KeyPro(); //根据行扫描函数返回的键值,确定对应的按键,并返回0-15 即0-F
unsigned char Value; //保存键值
void delay(int ms) //延迟函数
{
u8 i;
while(ms--)
{
for(i=0; i<110; i++);
}
}
void main()
{
while(1)
{
delay(10);
P0 = smg[KeyPro()];//输出选中的按键对应的键值
}
}
unsigned char KeyScan()
{
KEY_PRESS=0xf0; //令低四位(列)为0,高四位(行)为1,即1111 0000,若有按键按下,则高四位的其中一位为0
if(KEY_PRESS!=0xf0)//判断是否有按键按下
{
delay(10); //消抖
KEY_PRESS=0x7f; //扫描第一行
if(KEY_PRESS!=0x7f)
{
Value=KEY_PRESS&0x7f;//进行与运算:有0全为0,全1才为1
return Value;
}
KEY_PRESS=0xbf; //扫描第二行
if(KEY_PRESS!=0xbf)
{
Value=KEY_PRESS&0xbf;
return Value;
}
KEY_PRESS=0xdf; //扫描第三行
if(KEY_PRESS!=0xdf)
{
Value=KEY_PRESS&0xdf;
return Value;
}
KEY_PRESS=0xef; //扫描第四行
if(KEY_PRESS!=0xef)
{
Value=KEY_PRESS&0xef;
return Value;
}
}
return Value;
}
unsigned char KeyPro()
{
switch(KeyScan())
{
case 0x77:return 0;break;//0
case 0x7b:return 1;break;//1
case 0x7d:return 2;break;//2
case 0x7e:return 3;break;//3
case 0xb7:return 4;break;//4
case 0xbb:return 5;break;//5
case 0xbd:return 6;break;//6
case 0xbe:return 7;break;//7
case 0xd7:return 8;break;//8
case 0xdb:return 9;break;//9
case 0xdd:return 10;break;//a
case 0xde:return 11;break;//b
case 0xe7:return 12;break;//c
case 0xeb:return 13;break;//d
case 0xed:return 14;break;//e
case 0xee:return 15;break;//f
}
}