矩阵键盘行列反转法
基本原理:
通过对行、列端口输出两次相反的值,并分别读入行值和列值,再将读入的行值和列值进行求和或按位“或”运算,得到每个按键的扫描码。所谓的“反转扫描法”实际上是利用处理器的高速扫描与低速的按键操作所形成的“时间差”,从按键按下开始到获取整个行值、列值时,按键实际上还没有松开。P1^0/P1^1/P1^2/P1^3 为行,P1^4/P1^5/P1^5/P1^6为列的键值如下。
图一 键值表
#include "reg51.h"
char led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
0xF8,0x80,0x90,0x08,0x03,0x46,0x21,0x06,0x0e};//数码管显示字符码
char keytp[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,
0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};//按键键值表
#define key P1
unsigned char key_scan(); //按键扫描子函数
void delay(); //延时函数
/**************************************
*
***************************************/
void main()
{
P0=0xff;
while(1)
{
P0=key_scan();
}
}
/**************************************
*
***************************************/
unsigned char key_scan()
{
char keyh,keyl,keytp,temp;
key=0X0F; //第一次行列输出的值 0000 1111
if(key!=0x0f)
{
delay();//软件去抖动
if(key!=0x0f)
{
keyh=key;//读出第一次按键按下的值进行保存keyh
}
key=0xf0;//第二次行列输出的值 1111 0000
keyl=key;//读出第二次按键按下的值进行保存keyl
keytp=keyh|keyl;
switch(keytp)
{
case 0xee: temp=led[0];break;
case 0xde: temp=led[1];break;
case 0xbe: temp=led[2];break;
case 0x7e: temp=led[3];break;
case 0xed: temp=led[4];break;
case 0xdd: temp=led[5];break;
case 0xbd: temp=led[6];break;
case 0x7d: temp=led[7];break;
case 0xeb: temp=led[8];break;
case 0xdb: temp=led[9];break;
case 0xbb: temp=led[10];break;//0000 1000
case 0x7b: temp=led[11];break;//0000 0011
case 0xe7: temp=led[12];break;//0100 0110
case 0xd7: temp=led[13];break;//0010 0001
case 0xb7: temp=led[14];break;//0000 0110
case 0x77: temp=led[15];break;//0000 1110
default:break;
}
}
return temp;
}
/**************************************
*
***************************************/
void delay()
{
char i=10;
while(i--);
}
图二 行列翻转式代码
图三 仿真图