读书人

矩阵按键扫描函数---路经不管怎样接

发布时间: 2012-08-29 08:40:14 作者: rapoo

矩阵按键扫描函数---线路不管怎样接,此函数可适用,可做底层函数

//此按键数为3*8, 可支持8*8

#include<reg51.h>

#define COM(x1,x2,x3,x4,x5,x6,x7,x8) ((x1&0xff)|((x2&0xff)<<1)|((x3&0xff)<<2)|((x4&0xff)<<3)|((x5&0xff)<<4)|((x6&0xff)<<5)|((x7&0xff)<<6)|((x8&0xff)<<7)) //编成一个字节数据
#define ROW_NUM 3 //矩阵列数

sbit Gate1 = P3^2; //按键控制端口1(列扫描)共8*3列
sbit Gate2 = P3^3; //按键控制端口2(列扫描)
sbit Gate3 = P3^4; //按键控制端口3(列扫描)
sbit Dial_KeyOne = P0^6;//表盘按键1 矩阵不管怎样接,只改变这里的定义
sbit Dial_KeyTwo = P2^6;//表盘按键2
sbit Dial_KeyThree = P2^7;//表盘按键3
sbit Dial_KeyFour = P2^5;//表盘按键4
sbit Dial_KeyFine = P2^4;//表盘按键5
sbit Dial_KeySix = P2^3;//表盘按键6
sbit Dial_KeySeven = P2^0;//表盘按键7
sbit Dial_KeyEight = P3^0;//表盘按键8


/////////////////////////////////
//矩阵按键扫描,有按键按下,返回
//相应按键编码,无按键按下,返回0
unsigned char ReadkeyValue(void)
{
unsigned char list; //行数据检测变量

unsigned char key_num; //显示的按键号
unsigned char idata shift; //移位变量
unsigned char row; //列扫描变量控制
char i; //列总数(当前为3列,8行)

i = 0;
key_num = 1;
row = 0x01;

while(i<ROW_NUM)
{
Gate1 = ((row&0x01)?0:1); //逐列扫描从011--101--110.........................
Gate2 = ((row&0x02)?0:1);
Gate3 = ((row&0x04)?0:1);
list = COM(Dial_KeyOne,Dial_KeyTwo,Dial_KeyThree,Dial_KeyFour,Dial_KeyFine,Dial_KeySix,Dial_KeySeven,Dial_KeyEight);
if(list !=0xff) //有按键按下
{
shift = 0x01; //对按下的按键编码,从1-24
list = ~list; //取反,所按下的为1
while(list != shift)
{
shift <<= 1;
key_num++;
}
return key_num;
}
row <<= 1;
key_num += 8; //下一列
i++;
}
key_num = 0;
return 0;
}

读书人网 >编程

热点推荐