矩阵键盘
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4×4矩阵键盘
1.原理说明
一般的4*4矩阵键盘(如图1)一般要8个I/O口(如图1),对于按键较多的硬件系统来说是很浪费的I/O口,本方案仅采用4个I/O和4个普通二极管就可以轻松实现4×4矩阵键盘,方案原理与普通4*4矩阵键盘类似,下面先分析普通矩阵键盘原理,再进一步改进为本方案。
原理如下B4口为低电平,A1~A4,B1~B3为高电平,单片机不停的扫描,假若有键按下如A1与B4交叉处按下则对应的A1被拉低为低电平,可以定义此键号为1,同理以此类推B3口为低电平,其余口为高电平,交叉处按键按下可定义其按键号,将按键号存储在寄存器中,可用查表方法并通过数码管显示按键号。
对于下图(图2)用4个I/O和4个普通二极管初始化PA0.0~PA0.3 均为高电平,在这里二极管作用是当IO口为低电平时可以导通,高电平时截止。程序流程图如下
图1
图2
2.程序介绍如下
void RCC_Configuration(void);
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_PP _ OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
GPIOSetBits()
{
GPIO_SetBits(GPIOA,GPIO_Pin_0);
GPIO_SetBits(GPIOA,GPIO_Pin_1);
GPIO_SetBits(GPIOA,GPIO_Pin_2);
GPIO_SetBits(GPIOA,GPIO_Pin_3);
}
单片机不停的扫描程序,(右侧四个键单独来写),由于扫描速度是很快(微妙级)的,所以有足够的时间去显示每个按键的。
当(GPIO_Pin_0==0)时表明有键按下,我们定义为0号键,
当(GPIO_Pin_1==0)时表明有键按下,我们定义为1号键,
当(GPIO_Pin2==0)时表明有键按下,我们定义为2号键,
当(GPIO_Pin_3==0)时表明有键按下,我们定义为3号键,
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0)
return 0;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==0)
return 1;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)==0)
return 2;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==0)
return 3;
其余按键方法不同于右侧四个按键,每个I/O口接一个二极管以保证当有高电平截止,低电平导通,即可得到每个键号。扫描程序分析如下:
当( GPIO_Pin_0==0) 时:
若(GPIOA, GPIO_Pin_1)==0)则为4键按下,
若(GPIOA, GPIO_Pin_2)==0)则为5键按下,
若(GPIOA, GPIO_Pin_3)==0)则为6键按下,
当GPIO_Pin_1==0时:
若(GPIOA, GPIO_Pin_0)==0)则为7键按下,
若(GPIOA, GPIO_Pin_2)==0)则为8键按下,
若(GPIOA, GPIO_Pin_3)==0)则为9键按下,
当GPIO_Pin_2==0时:
若(GPIOA, GPIO_Pin_0)==0)则为A(10)键按下,
若(GPIOA, GPIO_Pin_1)==0)则为B(11)键按下,
若(GPIOA, GPIO_Pin_3)==0)则为C(12)键按下,
当GPIO_Pin_3==0时:
若(GPIOA, GPIO_Pin_0)==0)则为D(13)键按下,
若(GPIOA, GPIO_Pin_1)==0)则为E(14)键按下,
若(GPIOA, GPIO_Pin_2)==0)则为F(15)键按下,
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==0)
return4;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)==0)
return5;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==0)
return6;
}
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==0)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0)
return7;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)==0)
return8;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==0)
return9;
}
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)==0)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0)
return10;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==0)
return11;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==0)
return12;
}
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==0)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0)
return13;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)==0)
return14;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==0)
return15;
}
/**
****************************************************************************** * @file None
* @author None
* @version V3.5.0
* @date 2012年6月05号
* @brief Main program body
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
void RCC_Configuration(void);
void GPIO_Configuration(void);
void GPIOSetBits(void);