–Matric_Key.h
#ifndef __Matric_Key_h
#define __Matric_Key_h
#define KEY_1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_8)
#define KEY_2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_9)
#define KEY_3 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_10)
#define KEY_4 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_11)
void Matric_Key_Init(void);
int Matric_Key_Scan(void);
#endif
–Matric_Key.c
#include <stdio.h>
#include "stm32f10x.h"
#include "Matric_Key.h"
void Matric_Key_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9
| GPIO_Pin_10 | GPIO_Pin_11 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOE ,&GPIO_InitStructure);
//设置PE8~11为输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13
| GPIO_Pin_14 | GPIO_Pin_15 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE,&GPIO_InitStructure);
//设置PE12~15为输出模式
}
int Matric_Key_Scan(void)
{
//扫描法
GPIO_SetBits(GPIOE,GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
GPIO_ResetBits(GPIOE,GPIO_Pin_12);
if(KEY_1 == 0 || KEY_2 == 0 || KEY_3 == 0 || KEY_4 == 0)
{
if(KEY_1 == 0)
{
return 1;
}else if(KEY_2 == 0)
{
return 2;
}else if(KEY_3 == 0)
{
return 3;
}else if(KEY_4 == 0)
{
return 4;
}
}
/*-------------------------------------*/
GPIO_SetBits(GPIOE,GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
GPIO_ResetBits(GPIOE,GPIO_Pin_13);
if(KEY_1 == 0 || KEY_2 == 0 || KEY_3 == 0 || KEY_4 == 0)
{
if(KEY_1 == 0)
{
return 7;
}else if(KEY_2 == 0)
{
return 8;
}else if(KEY_3 == 0)
{
return 9;
}else if(KEY_4 == 0)
{
return 4;
}
}
/*-------------------------------------*/
GPIO_SetBits(GPIOE,GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
GPIO_ResetBits(GPIOE,GPIO_Pin_14);
if(KEY_1 == 0 || KEY_2 == 0 || KEY_3 == 0 || KEY_4 == 0)
{
if(KEY_1 == 0)
{
return 4;
}else if(KEY_2 == 0)
{
return 5;
}else if(KEY_3 == 0)
{
return 6;
}else if(KEY_4 == 0)
{
return 4;
}
}
/*-------------------------------------*/
GPIO_SetBits(GPIOE,GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
GPIO_ResetBits(GPIOE,GPIO_Pin_15);
if(KEY_1 == 0 || KEY_2 == 0 || KEY_3 == 0 || KEY_4 == 0)
{
if(KEY_1 == 0)
{
return 1;
}else if(KEY_2 == 0)
{
return 2;
}else if(KEY_3 == 0)
{
return 3;
}else if(KEY_4 == 0)
{
return 4;
}
}else{return -1;}
/*-------------------------------------*/
}
//还有其他俩种方法:反转法、状态法