您的位置:首页 > 其它

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

2012-07-29 23:29 561 查看
//此按键数为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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  list