应用行列反转法操纵矩阵键盘
行列反转法的简单实用,我自己整理了一下,分享给大家。根据开发板原理图可知,P3口接为矩阵键盘,其中P3.0~P3.3接行线,P3.4~P3.7接列线,P0口接共阴极6段数码管。
图 1
反转法的原理:反转法就是通过给单片机的端口两次赋值,最后得出所按键的值的一种算法。具体操作如下:
1.我们给P3口赋值0x0f,即00001111,假设S6键(TX开发板中,S6键相当于第一个按键)按下了,则这时P3口的实际值为00001110;
2.我们给P3口再赋值0xf0,即11110000,如果S6键按下了,则这时P3口的实际值为11100000;
3.我们把两次P3口的实际值相加得11101110,即0xee。 由此我们便得到了按下S6键时所对应的数值0xee,以此类推可得出其他15个按键对应的数值,有了这种对应关系,对应关系见图2.
图2
以下为程序: 反转法矩阵键盘的应用,通过按下矩阵按键,使数码管第一位(0xFE)显示数值,是我自己敲的可执行的程序,拿来与大家共享
#include<reg52.h>
#define ucharunsigned char
#define uintunsigned int
uchar n,key;
sbit dula=P2^6;
sbit wela=P2^7;
void delayms(uint xms); //延时函数
void keyscan() ; //按键扫描函数
void display(); //数码管显示函数
uchar code table[]={ //数码管的显示程序
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code jian[]={ //矩阵按键显程序
0xee,0xDe,0xbe,0X7e,
0Xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,
0xe7,0xd7,0xb7,0x77};
void main() //主函数
{
while(1)
{
keyscan(); //执行按键扫描函数
display(); //执行数码管显示函数
}
}
void delayms(uint xms) //延时函数
{
uint i,j;
for(i=xms;i>0;i--) i=xms,也就是xms毫秒
for(j=110;j>0;j--);
}
void keyscan() //按键扫描函数
{
uchar l,h,i; //l为第四位,h为高四位
P3=0x0f; 令P3=0x00001111
l=P3&0X0f; //l为低四位,即行
if(l!=0x0f) //如果按键被按下,此时执行if循环
{
delayms(10); // 延时10毫秒,目的是消抖
if(l!=0x0f) //再次检测是否按下
{
l=P3&0x0f; //此时低四位确定,即某一行有按键被按下了
}
}
P3=0xf0; //P3=0X11110000
h=P3&0Xf0; //h为高四位,即列
if(h!=0xf0) //如果按键有被按下
{
delayms(10); //延时
if(h!=0xf0)
{
h=P3&0xf0; //此时得出高四位,即列
}
}
key=l+h; //相加确定出某一个按键被按下
for(i=0;i<16;i++) //查找i,确定i的值。目的是接下来对应到数码管的哪一位
{
if(key==jian[i]) //算出i
n=i;
}
}
void display() //显示函数
{
dula=1;
P0=table[n];
dula=0;
P0=0xff; //目的是消影
wela=1;
P0=0xfe;
wela=0;
delayms(5);
}
实验现象如下: