列扫描法类似行扫描法:话不多说,如下!
矩阵键盘如下图:
列扫描涉及到与运算:与运算符号为& ,计算规则是:有0全为0,全1才为1
如:1111 0000 和 1011 0000进行与运算
1111 0000
1011 0000
-----------
运算结果: 1011 0000
行扫描法:假设按下的是3号键
第1步:识别键盘有无键按下
第2步,识别出哪个按键被按下。采用逐列扫描法,在某一时刻只让1条列线处于低电平,其余所有列线处于高电平。
当第1列为低电平,其余各列为高电平时,因为是3号键被按下,
第1行的行线仍处于高电平;当第2列为低电平,其余各列为高电平时,
第1行的行线仍处于高电平;直到让第4列为低电平,其余各列为高电平时,
此时第1行的行线电平变为低电平,据此,可判断第1行第4列交叉点处的按键,即3号键被按下。
#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=0xf7; //扫描第一列
if(KEY_PRESS!=0xf7)
{
Value=KEY_PRESS&0xf7;//进行与运算:有0全为0,全1才为1
return Value;
}
KEY_PRESS=0xfb; //扫描第二列
if(KEY_PRESS!=0xfb)
{
Value=KEY_PRESS&0xfb;
return Value;
}
KEY_PRESS=0xfd; //扫描第三列
if(KEY_PRESS!=0xfd)
{
Value=KEY_PRESS&0xfd;
return Value;
}
KEY_PRESS=0xfe; //扫描第四列
if(KEY_PRESS!=0xfe)
{
Value=KEY_PRESS&0xfe;
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
}
}
不对之处望见谅,并指出错误 ( ̄︶ ̄)↗