感谢论坛网友(ID:Apu7578)在原有基础上修改的
/************************main.c**************************************************************/
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
extern u8 keyValue_4X4;
/************************************************
ALIENTEK 阿波罗STM32F429开发板4*4矩阵按键
矩阵按键实验-HAL库函数版
作者:Bingo
************************************************/
int main(void)
{
u8 key;
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
delay_init(180); //初始化延时函数
uart_init(115200); //初始化USART
LED_Init();
KEY4X4_ON(); //打开矩阵
delay_ms(1000);
printf("ScanInit...
");
while(1)
{
key = KeyScan_4X4();
switch(key)
{
case 1: printf("S1
" ); break;
case 2: printf("S5
" ); break;
case 3: printf("S9
" ); break;
case 4: printf("S13
"); break;
case 5: printf("S2
" ); break;
case 6: printf("S6
" ); break;
case 7: printf("S10
"); break;
case 8: printf("S14
"); break;
case 9: printf("S3
" ); break;
case 10: printf("S7
" ); break;
case 11: printf("S11
"); break;
case 12: printf("S15
"); break;
case 13: printf("S4
" ); break;
case 14: printf("S8
" ); break;
case 15: printf("S12
"); break;
case 16: printf("S16
"); break;
}
delay_ms(10);
}
}
/****************************************************key.h*********************************************************/
#include "sys.h"
/******** 行线状态宏定义 ************/
#define RAW1_STATE PBin(6)
#define RAW2_STATE PBin(7)
#define RAW3_STATE PBin(8)
#define RAW4_STATE PBin(9)
/******** 列线状态宏定义 ************/
#define COL1_STATE PCin(6)
#define COL2_STATE PCin(7)
#define COL3_STATE PCin(8)
#define COL4_STATE PCin(9)
/********************* 键值分布*************************
S1 S2 S3 S4
S5 S6 S7 S8
S9 S10 S11 S12
S13 S14 S15 S16
*******************************************************
********************矩阵按键连线***********************
PC6 PC7 PC8 PC9
PB6-------|--------|--------|--------|----
PB7 ------|--------|--------|--------|----
PB8-------|--------|--------|--------|----
PB9 ------|--------|--------|--------|----
*******************************************************/
/* -- 开关状态宏定义 -- */
#define KEY4X4_OPEN 1
#define KEY4X4_CLOSE 0
/* -----------------所有相关函数 --------------------- */
void KEY4X4_ON(void); // 开启矩阵键盘
void KEY4X4_OFF(void); // 关闭矩阵键盘
void KEY4X4_RAW_SET(void); // 行线置位
void KEY4X4_RAW_RESET(void); // 行线复位
void KEY4X4_RAW_READ_Init(void); // 行线设为输入模式
void KEY4X4_COL_SET(void); // 列线置位
void KEY4X4_COL_RESET(void); // 列线复位
void KEY4X4_COL_READ_Init(void); // 列线设为输入模式
u8 KeyScan_4X4(void); // 键盘扫描函数
/***************************key.c***************************************************************************/
#include "key.h"
#include "delay.h"
u8 KeyScan_4X4(void)
{
u8 keyValue=0;
static u8 key_up=1;//按键松开标志
KEY4X4_RAW_SET(); // 行线置位 1
KEY4X4_COL_RESET(); // 列线复位 0
KEY4X4_RAW_READ_Init(); // 行线设为输入模式
if(key_up&&(RAW1_STATE==0||RAW2_STATE==0||RAW3_STATE==0||RAW4_STATE==0))
{
delay_ms(10);
key_up=0; //屏蔽此行则表示支持 连续按
if (RAW1_STATE==0) keyValue=0; // raw1
else if(RAW2_STATE==0) keyValue=1; // raw2
else if(RAW3_STATE==0) keyValue=2; // raw3
else if(RAW4_STATE==0) keyValue=3; // raw4
else return 0;
KEY4X4_RAW_RESET(); // 行线复位 0
KEY4X4_COL_SET(); // 列线置位 1
KEY4X4_COL_READ_Init(); // 列线设为输入模式
if(COL1_STATE==0||COL2_STATE==0||COL3_STATE==0||COL4_STATE==0)
{
//delay_ms(5);
if (COL1_STATE==0) {keyValue+=1; return keyValue;} // col1
else if(COL2_STATE==0) {keyValue+=5; return keyValue;} // col2
else if(COL3_STATE==0) {keyValue+=9; return keyValue;} // col3
else if(COL4_STATE==0) {keyValue+=13; return keyValue;} // col4
else return 0;
}
return 0;
}
else if(RAW1_STATE==1&&RAW2_STATE==1&&RAW3_STATE==1&&RAW4_STATE==1) key_up=1;
return 0; //无按键按下
}
// 打开矩阵键盘
u8 KEY4X4_ON_OFF=KEY4X4_CLOSE; // 默认关闭
void KEY4X4_ON(void)
{
KEY4X4_ON_OFF=KEY4X4_OPEN;
}
// 关闭矩阵键盘
void KEY4X4_OFF(void)
{
KEY4X4_ON_OFF=KEY4X4_CLOSE;
}
/****************************** 行线置位 1 *************************************/
void KEY4X4_RAW_SET(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟
// PB6,PB7,PB8,PB9设为输出模式
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// 4根行线置1
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9,GPIO_PIN_SET);
}
/****************************** 行线复位 0 *************************************/
void KEY4X4_RAW_RESET(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟
// PB6,PB7,PB8,PB9设为输出模式
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// 4根行线置0
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9,GPIO_PIN_RESET);
}
/****************************** 行线设为输入模式 ******************************/
void KEY4X4_RAW_READ_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟
// PB6,PB7,PB8,PB9设为输入模式
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
/****************************** 列线置位 **************************************/
void KEY4X4_COL_SET(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟
// PC6,PC7,PC8,PC9设为输出模式
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// 4根列线置1
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9,GPIO_PIN_SET);
}
/****************************** 列线复位 **************************************/
void KEY4X4_COL_RESET(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟
// PC6,PC7,PC8,PC9设为输出模式
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// 4根列线置0
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9,GPIO_PIN_RESET);
}
/****************************** 列线设为输入模式 ******************************/
void KEY4X4_COL_READ_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟
// PC6,PC7,PC8,PC9设为输入模式
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
} |