13 矩阵按键
2018-03-25 本文已影响0人
aaa小菜鸡
单片机STC89C52学习——13 矩阵按键
汇总:00 单片机STC89C52学习
参考教程:普中科技
1 工作原理
1.1 矩阵按键的由来
使用较少IO口,控制较多按键 原理图1.2 矩阵按键扫描原理
- 逐行扫描
通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。 - 行列扫描(通常采用)
通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,则通过接收的数据值,判断是哪一列有按键按下;然后反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是哪一行有按键按下。这样就能够确定是哪一个按键按下了。
1.3 将矩阵按键变为独立按键
如将S1、S5、S9、S13变为独立按键:
P13输出低电平,相当于独立按键的GND;控制P14~P17
2 程序:矩阵按键——LED后四位显示按下的矩阵按键
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
#define GPIO_KEY P1// 矩阵键盘
// #define GPIO_DIG P0// 数码管
#define GPIO_LED P2// LED灯
u8 keyValue = 0x00;// 全局变量
// u8 code LEDSeg[] = {0x3f , 0x06 , 0x5b , 0x4f ,
// 0x66 , 0x6d , 0x7d , 0x07 ,
// 0x7f , 0x6f , 0x77 , 0x7c ,
// 0x39 , 0x5e , 0x79 , 0x71};
void delay (u16 i)
{
while (i --);
}
void keyMat()// 行列扫描
{
u8 a = 0;// keil默认就是0
GPIO_KEY = 0x0f;// 高四位低电平,低四位高电平
if (GPIO_KEY != 0x0f)// 通过低四位判断是否按下
{
delay (1000);// 消抖
if (GPIO_KEY != 0x0f)// 再次判断
{
GPIO_KEY = 0x0f;// 保险起见,可以再赋一次值
// keyValue = keyValue | GPIO_KEY;// 记录低四位...不能这样记录
switch (GPIO_KEY)
{
case 0x07:
keyValue = 0; break;
case 0x0b:
keyValue = 1; break;
case 0x0d:
keyValue = 2; break;
case 0x0e:
keyValue = 3; break;
}
GPIO_KEY = 0xf0;
// keyValue = keyValue | GPIO_KEY;// 记录高四位...不能这样记录
switch (GPIO_KEY)
{
case 0x70:
keyValue = keyValue; break;
case 0xb0:
keyValue += 4; break;
case 0xd0:
keyValue += 8; break;
case 0xe0:
keyValue += 12; break;
}
while ((a < 50) && (GPIO_KEY != 0xf0))// 松开才继续,或者超时
{
delay(1000);
a ++;
}
}
}
}
void main()
{
// LSA = 0; LSB = 0; LSC = 0;
while (1)
{
keyMat();
GPIO_LED = ~keyValue;// 在LED上显示
}
}
效果:按下矩阵按键后,相应的LED灯亮