矩阵按键扫描函数---线路不管怎样接,此函数可适用,可做底层函数
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;
}
#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;
}
相关文章推荐
- 8.7 单片机矩阵按键的扫描
- 4*4矩阵按键扫描程序
- 正点原子标准例程-库函数版本——触摸按键扫描函数u8 TP_Scan(u8 tp)交流
- 第八节:在定时中断函数里执行独立按键的扫描程序。
- 矩阵按键的MSP430驱动函数
- 蓝桥杯——矩阵按键行列扫描
- 矩阵按键扫描
- 51单片机开发系列五_矩阵按键扫描
- 用扫描法读出4×4矩阵键盘,在数码管显示按键值
- 51单片机 矩阵按键的扫描、消抖、动作分离
- 关于独立按键与矩阵按键的程序(51单片机)
- 项目1.1-创建函数 两矩阵求积
- STC单片机按键扫描程序演示
- 10月8日 c语言 多维数组名 作函数参数 有一个3*4的矩阵,求所有元素中的最大值
- OpenCV中对数组(矩阵)的操作的函数表
- 新型的按键扫描程序,仅三行程序
- MATLAB基本的使用方法(图像,矩阵及函数)
- 新型的按键扫描程序
- 顺时针打印矩阵与二维数组作为函数参数
- 8.10 输入n*n阶矩阵,用函数编程计算并输出其两条对角线上的各元素之和