首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-08-29 
矩阵按键扫描函数---线路不管怎样接,此函数可适用,可做底层函数//此按键数为3*8, 可支持8*8#includereg51

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

//此按键数为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;
}

热点排行