赞
踩
矩阵键盘使用的方法与独立按键类似,但是比独立按键节省I/O,同时使用方法变得相对复杂了,首先展示硬件连接。
对于矩阵键盘,常用的方法有两种,一个是线反转法,另一个是行列扫描法,本文介绍线反转法。
首先插入模块化编程的内容,新建两个文件命名为keyboard.h与keyboard.c并添加到工程中,然后在h文件中定义一个宏,便于与硬件连接发生改变时而进行代码的修改。
编程思路:
首先给矩阵键盘的端口Matrixkey_Port赋值0x0F,意为行为1列为0,即0000 1111,对应上图就是P10,P11,P12,P13为1,P14,P15,P16,P17为0,那么此时如果第一行有按键按下,P10这一位的高电平必然被拉低,1 & 0 = 0,P1就会变成0X0E,第二,三,四行亦如此,然后进行反推,当检测到这些值的出现时就可以知道是哪一行有按键按下,记录下行值,row就是行值;
再给矩阵键盘的端口Matrixkey_Port赋值0xF0,意为行为0列为1,即1111 0000,对应上图就是P10,P11,P12,P13为0,P14,P15,P16,P17为1,与第一次反推类似,可以得到列值col;
在下文的程序中,只要将row,col进行运算就能得到1-16的返回值。row的值是1 2 3 4,col的值是1 2 3 4,而键盘编码如下:
1 | 2 | 3 | 4 |
---|---|---|---|
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 |
返回值1-16与行列的关系是(row-1)*4+col。
#ifndef __KEYBOARD_H__
#define __KEYBOARD_H__
#define Matrixkey_Port P1
unsigned char Matrixkey_Scan(void);
#endif
撰写keyboard.c
#include <STC15F2K60S2.h>
#include "keyboard.h"
#include "delay.h"
//按键按下返回键值(1-16)没有按下返回0
//其中row:表示行数; col:表示列数
unsigned char Matrixkey_Scan(void)
{
unsigned char temp,row=0,col=0,i=0;
Matrixkey_Port=0x0f;//行为1列为0 0000 1111 ->0x0f
/*第一行若有按键按下 0000 1110 ->0x0e*/
/*第二行若有按键按下 0000 1101 ->0x0d*/
/*第三行若有按键按下 0000 1011 ->0x0b*/
/*第四行若有按键按下 0000 0111 ->0x07*/
delay_ms(1);
temp=Matrixkey_Port;
if(temp!=0x0f)//说明有按键按下
{
if(temp==0x0e) row=1;
else if(temp==0x0d)row=2;
else if(temp==0x0b)row=3;
else if(temp==0x07)row=4;
/*************进行列数识别*****************/
Matrixkey_Port=0xf0;//行为0列1 1111 0000->0xf0
temp=Matrixkey_Port;
if(temp!=0xf0)//说明有按键按下
{
switch(temp)
{
/*第一列若有按键按下 0111 0000 ->0x70*/
/*第二列若有按键按下 1011 0000 ->0xb0*/
/*第三列若有按键按下 1101 0000 ->0xd0*/
/*第四列若有按键按下 1110 0000 ->0xe0*/
case 0x70:col=1;break;
case 0xb0:col=2;break;
case 0xd0:col=3;break;
case 0xe0:col=4;break;
default:break;
}
}
while(Matrixkey_Port!=0xf0&&i<255)//按键松开与超时判断
{
delay_ms(1);
i++;
}
}
if(row!=0&&col!=0) return ((row-1)*4+col); //将行列数值 转换为 按键1、2、3、……16的值
else return 0;
}
#include "main.h"
#include "keyboard.h"
unsigned char keynum; //定义矩阵按键值
void main()
{
BUZZ_OFF; //关闭 蜂鸣器
while(1)
{
/**************矩阵按键************/
keynum = Matrixkey_Scan();
if(keynum!=0)
{
if(keynum == 1) //如果按键KEY1被按下,LED1亮
{
OPEN_Y4_LED // 打开 LED 的锁存器
P0 = ~0X01; // 1111 1110
LATCH_Y4_7 //锁存
}
if(keynum == 2) //如果按键KEY2被按下,LED2亮
{
OPEN_Y4_LED // 打开 LED 的锁存器
P0 = ~0X02; // 1111 1101
LATCH_Y4_7 //锁存
}
if(keynum == 3) //如果按键KEY3被按下,LED3亮
{
OPEN_Y4_LED // 打开 LED 的锁存器
P0 = ~0X04; // 1111 1011
LATCH_Y4_7 //锁存
}
if(keynum == 4) //如果按键KEY4被按下,LED4亮
{
OPEN_Y4_LED // 打开 LED 的锁存器
P0 = ~0X08; // 1111 0111
LATCH_Y4_7 //锁存
}
if(keynum == 5) //如果按键KEY5被按下,LED5亮
{
OPEN_Y4_LED // 打开 LED 的锁存器
P0 = ~0X10; // 1110 1111
LATCH_Y4_7 //锁存
}
if(keynum == 6) //如果按键KEY6被按下,LED6亮
{
OPEN_Y4_LED // 打开 LED 的锁存器
P0 = ~0X20; // 1101 1111
LATCH_Y4_7 //锁存
}
if(keynum == 7) //如果按键KEY7被按下,LED7亮
{
OPEN_Y4_LED // 打开 LED 的锁存器
P0 = ~0X40; // 1011 1111
LATCH_Y4_7 //锁存
}
if(keynum == 8) //如果按键KEY8被按下,LED8亮
{
OPEN_Y4_LED // 打开 LED 的锁存器
P0 = ~0X80; // 0111 1111
LATCH_Y4_7 //锁存
}
}
}
}
矩阵按键效果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。