矩阵按键介绍
独立键盘与单片机连接时,每一个按键都需要单片机的一个 I/O 口,若某单片机系统需较多按键,如果用独立按键便会占用过多的 I/O口资源。单片机系统中 I/O 口资源往往比较宝贵,当用到多个按键时为了减少 I/O 口引脚,引入了矩阵键盘。
无论是独立键盘还是矩阵键盘,单片机检测其是否被按下的依据都是一样的,也就是检测与该键对应的 I/O 口是否为低电平。独立键盘有一端固定为低电平,单片机写程序检测时比较方便。而矩阵键盘两端都与单片机 I/O 口相连,因此在检测时需编程通过单片机 I/O 口送出低电平。
检测方法
检测方法有多种,最常用的是逐行列扫描和行列扫描。
逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。
行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。
C51例程
#include
typedef unsigned int U16;
typedef unsigned char U8;
***it LSA = P2^2;
***it LSB = P2^3;
***it LSC = P2^4;
#define GPIO_KEY P1
#define GPIO_DIG P0
U8 keyValue = 0;
//共阴级码表
U8 code smgduan[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
void delay(U16 i)
{
while(i--);
}
void keyDown()
{
U8 a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{
delay(1000);
if(GPIO_KEY!=0x0f)
{
GPIO_KEY=0x0f;
switch(GPIO_KEY)
{
case 0x07:keyValue = 0;break;
case 0x0b:keyValue = 1;break;
case 0x0d:keyValue = 2;break;
case 0x0e:keyValue = 3;break;
default:;
}
GPIO_KEY=0xf0;
switch(GPIO_KEY)
{
case 0x70:keyValue = keyValue;break;
case 0xb0:keyValue = keyValue+4;break;
case 0xd0:keyValue = keyValue+8;break;
case 0xe0:keyValue = keyValue+12;break;
default:;
}
while((a<50)&&(GPIO_KEY!=0xf0))
{
delay(1000);
a++;
}
}
}
}
void main()
{
LSA = 0;
LSB = 0;
LSC = 0;
while(1)
{
keyDown();
GPIO_DIG=smgduan[keyValue];
}
}
矩阵按键介绍
独立键盘与单片机连接时,每一个按键都需要单片机的一个 I/O 口,若某单片机系统需较多按键,如果用独立按键便会占用过多的 I/O口资源。单片机系统中 I/O 口资源往往比较宝贵,当用到多个按键时为了减少 I/O 口引脚,引入了矩阵键盘。
无论是独立键盘还是矩阵键盘,单片机检测其是否被按下的依据都是一样的,也就是检测与该键对应的 I/O 口是否为低电平。独立键盘有一端固定为低电平,单片机写程序检测时比较方便。而矩阵键盘两端都与单片机 I/O 口相连,因此在检测时需编程通过单片机 I/O 口送出低电平。
检测方法
检测方法有多种,最常用的是逐行列扫描和行列扫描。
逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。
行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。
C51例程
#include
typedef unsigned int U16;
typedef unsigned char U8;
***it LSA = P2^2;
***it LSB = P2^3;
***it LSC = P2^4;
#define GPIO_KEY P1
#define GPIO_DIG P0
U8 keyValue = 0;
//共阴级码表
U8 code smgduan[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
void delay(U16 i)
{
while(i--);
}
void keyDown()
{
U8 a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{
delay(1000);
if(GPIO_KEY!=0x0f)
{
GPIO_KEY=0x0f;
switch(GPIO_KEY)
{
case 0x07:keyValue = 0;break;
case 0x0b:keyValue = 1;break;
case 0x0d:keyValue = 2;break;
case 0x0e:keyValue = 3;break;
default:;
}
GPIO_KEY=0xf0;
switch(GPIO_KEY)
{
case 0x70:keyValue = keyValue;break;
case 0xb0:keyValue = keyValue+4;break;
case 0xd0:keyValue = keyValue+8;break;
case 0xe0:keyValue = keyValue+12;break;
default:;
}
while((a<50)&&(GPIO_KEY!=0xf0))
{
delay(1000);
a++;
}
}
}
}
void main()
{
LSA = 0;
LSB = 0;
LSC = 0;
while(1)
{
keyDown();
GPIO_DIG=smgduan[keyValue];
}
}
举报