按键是使用的PB0,PB1,PB2,PA0四个引脚,然后使用CubeMX配置引脚,4个脚都配置为输入模式和上拉。
程序生成之后把不用的删掉,需要的留下,这里我把函数名改了。
然后写按键扫描读取程序,这里参考的正点原子的按键输入程序(感谢原子哥感谢左神)。
这是点C程序:
#include "key.h"
void Key_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin : PA0 */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pins : PB0 PB1 PB2 */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
/*输入:1|0 模式 1为连续按,0为不连续按*/
unsigned char Key_Scan(unsigned char mode)
{
static unsigned int key_mode;
if(mode == 1)key_mode = 1;
if(key_mode == 1&&(KEY0 == 0||KEY1 == 0||KEY2 == 0||KEY3 == 0))
{
HAL_Delay(10);
key_mode = 0;
if(KEY0 == 0){return KEY0_FLG;}
else if(KEY1 == 0){return KEY1_FLG;}
else if(KEY2 == 0){return KEY2_FLG;}
else if(KEY3 == 0){return KEY3_FLG;}
}
else if(KEY0 == 1||KEY1 == 1||KEY2 == 1||KEY3 == 1) key_mode = 1;
return 0;
}
这是点H程序:
#ifndef __KEY_H
#define __KEY_H
#include "main.h"
#define KEY0 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)
#define KEY1 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
#define KEY2 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)
#define KEY3 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)
#define KEY0_FLG 1
#define KEY1_FLG 2
#define KEY2_FLG 3
#define KEY3_FLG 4
void Key_Init(void);
unsigned char Key_Scan(unsigned char mode);
#endif
这是主程序:滴答定时器10ms扫描一次,按键1按下的话LED显示0x55,按键2按下的话LED显示0xAA;Led_Disp程序是我自己写的,新手朋友注意。
unsigned char key;
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
LCD_Init();
LED_Init();
Key_Init();
while (1)
{
if(uwTick % 10 == 0)
{
key=Key_Scan(0);
}
if(key == 1)
{
Led_Disp(0x55);
}
if(key == 2)
{
Led_Disp(0xaa);
}
}
}
接下来看效果:
按键演示