一、矩阵按键的由来
按键矩阵是由一个个独立按键连接在一起,每一行引出一个管脚,每一列也引出
一个管脚。
二、矩阵按键的扫描原理
逐行扫描:通过高四位轮流输出低电平来对矩阵键盘逐行扫描,当低四位接
收到的数据不全为 1 的时候,说明有按键按下,通过接收到的数据是哪一位为 0
来判断是那一个按键被按下。
行列扫描:
行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数
据,低四位不全位高电平时,说明有按键按下,通过接收到的数值,判断是哪一列有按键按
下,然后在反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值
判断是那一行有按键按下,这样能够确定是哪一个按键按下。
三、矩阵按键变成独立按键
每一行接一个 GND
四、代码
#include
#include
typedef unsigned char u8;
typedef unsigned int u16;
// 预处理数据类型 无符号
// 预处理数据类型
#define GPIO_GIO P0
#define GPIO_KEY P1
// 宏定义
//
按键断选
按键接口
P2^2;
/*// 138 译码器管脚定义
sbit LSA =
sbit LSB = P2^3;
sbit LSC = P2^4;
*/
u8 KeyValue;
// 全局变量 存储读到的键值
// 延迟函数
void delay(u16 i){
while(i--);
}
u8 code smgduan[16]={0X3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};
//共阴
/*静态数码管 P0 口,矩阵 P1 口*/
void KeyDown(){
char a =0 ;
GPIO_KEY = 0x0f;
if(GPIO_KEY != 0x0f){
// -128 到 128 初始化 a
// 对并行串口的定义,高四位为低电平
// 判断按键是否按下
delay(1000);
// 按键消抖
if(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;
// 0000 0111
// 0000 1011
// 0000 1101
// 0000 1110
}
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; //
}
GPIO_KEY
while((a<50)&&(GPIO_KEY!=0xf0))
// 强 制 退 出 while 循 环
{
delay(1000);
a++;
}
// 延迟 10 毫秒
}
}
}
// 数组
/**********************************
数码管显示真值表 共阳
1
0
5
0xc0 0xf9 0xa4 0xb0 0x99 0x92
2
3
4
6
9
0x82 0xf8 0x80 0x90
7
8
a
b
0x88 0x83
c
e
d
f
0xa7 0xa1 0x86 0x8e
*************************************
数码管显示数字的真值表
*/
/*void DigDisplay(){
//
u8 i;
for(i=0;i<8;i++){
switch(i){
case(0):
LSA = 0;LSB=0;LSC=0;break;
case(1):
LSA = 1;LSB=0;LSC=0;break;
case(2):
LSA = 0;LSB=1;LSC=0;break;
case(3):
LSA = 1;LSB=1;LSC=0;break;
case(4):
LSA = 0;LSB=0;LSC=1;break;
case(5):
LSA = 1;LSB=0;LSC=1;break;
case(6):
LSA = 0;LSB=1;LSC=1;break;
case(7):
LSA = 1;LSB=1;LSC=1;break;
}
P0 = smgduan[i];
delay(100);
//P0= 0X00;
}
}
*/
void main(){
P0=~smgduan[0];
while(1){
KeyDown();
GPIO_GIO =smgduan[KeyValue];
}
}