功能:12个按键输入 矩阵扫描 使用阿波罗F429开发板
亲测可用
--------------------------------------------------------分割线,第一次发帖-----------------------------------------------------------
以下是代码:
#include "4X3KeyPad.h"
#include "delay.h"
u8 KeyScan_4X3(void) // 键盘扫描函数
{
u8 keyValue = 0;
KEY4X3_RAW_SET(); // 行线置位, 4根行线置1,输出模式
KEY4X3_COL_RESET(); // 列线复位,输出模式
KEY4X3_RAW_READ_Init(); // 行线设为输入模式
if(RAW1_STATE==0||RAW2_STATE==0||RAW3_STATE==0||RAW4_STATE==0)
//#define RAW1_STATE PHin(15) ,即四行按钮有一个按下
{
delay_ms(30);
if (RAW1_STATE==0) keyValue=1; // raw1
else if (RAW2_STATE==0) keyValue=2; // raw2
else if (RAW3_STATE==0) keyValue=3; // raw3
else if (RAW4_STATE==0) keyValue=4; // raw4
else return 0;
KEY4X3_RAW_RESET(); // 行线复位
KEY4X3_COL_SET(); // 列线置位 ,3根列线置1
KEY4X3_COL_READ_Init(); //列线设为输入模式
if(COL1_STATE==0||COL2_STATE==0||COL3_STATE==0 )
{
delay_ms(30);
if (COL1_STATE==0) {keyValue+=5; return keyValue;} // raw1
else if(COL2_STATE==0) {keyValue+=9; return keyValue;} // raw2
else if(COL3_STATE==0) {keyValue+=13;return keyValue;} // raw3
else return 0;
}
return 0;
}
return 0;
}
u8 KEY4X3_ON_OFF=KEY4X3_CLOSE; // 默认关闭
/* -- 开关状态宏定义 --
#define KEY4X3_OPEN 1
#define KEY4X3_CLOSE 0
**********************************/
// 打开矩阵键盘
void KEY4X3_ON(void)
{
KEY4X3_ON_OFF= KEY4X3_OPEN;
}
// 关闭矩阵键盘
void KEY4X3_OFF(void)
{
KEY4X3_ON_OFF= KEY4X3_CLOSE;
}
// 行线置位
void KEY4X3_RAW_SET(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOG_CLK_ENABLE(); //开启GPIOG时钟
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟
__HAL_RCC_GPIOH_CLK_ENABLE(); //开启GPIOH时钟
__HAL_RCC_GPIOI_CLK_ENABLE(); //开启GPIOI时钟
// PH15设为输出模式
GPIO_InitStruct.Pin = GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //输出
GPIO_InitStruct.Pull = GPIO_PULLUP; //上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
// PG11设为输出模式
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
// PI1 PI5设为输出模式
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
// 4根行线置1
HAL_GPIO_WritePin(GPIOH,GPIO_PIN_15,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOI,GPIO_PIN_1,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOI,GPIO_PIN_5,GPIO_PIN_SET);
}
// 行线复位
void KEY4X3_RAW_RESET(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOG_CLK_ENABLE(); //开启GPIOG时钟
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟
__HAL_RCC_GPIOH_CLK_ENABLE(); //开启GPIOH时钟
__HAL_RCC_GPIOI_CLK_ENABLE(); //开启GPIOI时钟
// PH15设为输出模式
GPIO_InitStruct.Pin = GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
// PG11设为输出模式
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
// PI1 PI5设为输出模式
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
// 4根行线置0
HAL_GPIO_WritePin(GPIOH,GPIO_PIN_15,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOI,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOI,GPIO_PIN_5,GPIO_PIN_RESET);
}
// 行线设为输入模式
void KEY4X3_RAW_READ_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOG_CLK_ENABLE(); //开启GPIOG时钟
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟
__HAL_RCC_GPIOH_CLK_ENABLE(); //开启GPIOH时钟
__HAL_RCC_GPIOI_CLK_ENABLE(); //开启GPIOI时钟
// PH15设为输入模式
GPIO_InitStruct.Pin = GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
// PG11设为输入模式
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
// PI1 PI5设为输入模式
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
}
// 列线置位
void KEY4X3_COL_SET(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//__HAL_RCC_GPIOG_CLK_ENABLE(); //开启GPIOG时钟
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟
__HAL_RCC_GPIOH_CLK_ENABLE(); //开启GPIOH时钟
__HAL_RCC_GPIOI_CLK_ENABLE(); //开启GPIOI时钟
// PG14设为输出模式
//GPIO_InitStruct.Pin = GPIO_PIN_14;
//GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
//GPIO_InitStruct.Pull = GPIO_PULLUP;
//GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
//HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
// PA1设为输出模式 PC1
GPIO_InitStruct.Pin = GPIO_PIN_1;
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);
// PC4设为输出模式
GPIO_InitStruct.Pin = GPIO_PIN_4;
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);
//PH13设为输出模式
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
// 3根列线置1
//HAL_GPIO_WritePin(GPIOG,GPIO_PIN_14,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOH,GPIO_PIN_13,GPIO_PIN_SET);
}
// 列线复位
void KEY4X3_COL_RESET(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
// __HAL_RCC_GPIOG_CLK_ENABLE(); //开启GPIOG时钟
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟
__HAL_RCC_GPIOH_CLK_ENABLE(); //开启GPIOH时钟
__HAL_RCC_GPIOI_CLK_ENABLE(); //开启GPIOI时钟
// PG14设为输出模式
//GPIO_InitStruct.Pin = GPIO_PIN_14;
//GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
//GPIO_InitStruct.Pull = GPIO_PULLUP;
//GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
//HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
// PA1设为输出模式 PC1
GPIO_InitStruct.Pin = GPIO_PIN_1;
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);
// PC4设为输出模式
GPIO_InitStruct.Pin = GPIO_PIN_4;
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);
//PH13设为输出模式
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
// 3根列线置0
//HAL_GPIO_WritePin(GPIOG,GPIO_PIN_14,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOH,GPIO_PIN_13,GPIO_PIN_RESET);
}
// 列线设为输入模式
void KEY4X3_COL_READ_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
// __HAL_RCC_GPIOG_CLK_ENABLE(); //开启GPIOG时钟
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟
__HAL_RCC_GPIOH_CLK_ENABLE(); //开启GPIOH时钟
__HAL_RCC_GPIOI_CLK_ENABLE(); //开启GPIOI时钟
// PG14设为输入模式
//GPIO_InitStruct.Pin = GPIO_PIN_14;
// GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
// GPIO_InitStruct.Pull = GPIO_PULLUP;
// HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
// PA1设为输入模式 PC1
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// PC4设为输入模式
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// PH13设为输入模式
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
}
整个工程下载可以在CSDN搜 阿波罗F429开发板4X3按钮矩阵
下载后直接可用,原理可以参考帖子4x4的按钮矩阵原理一样