嵌入式c语言——学习笔记6
STM32的按键开发基础
按键描述的基本原理:
·按键信号的识别:一般来说,按键的两个引脚的一端通过电阻上拉到高电平,另一端则接地。
在没有按键按下的时候,输入引脚位高电平,
当有按键按下,输入引脚为低电平。
通过反复读取按键输入引脚的信号,然后识别高地电平来判断是否有按键触发。
·为什么去抖动:按键的输入引脚有低电平产生不代表一定是有按键按下,也许是干扰信号,因此,需要通过去抖动处理,将这些干扰信号过滤,从而获得真实的按键触发信号。
·如何去抖动:首次检测到按键输入引脚有低电平后,稍作延时,再次读取该引脚,如还是低电平,则确认为按键触发信号;否则,判断为干扰信号,不予处理。
HAL库中关于GPIO的3个重要函数
·电平输出函数
void HAL_GPIO_WritePin( GPIO_TypeDef*GPIOx, uint16_t GPIo_Pin, GPIO_PinState PinState );
void HAL_GPIO_WritePin( GPIO_TypeDef*GPIOx, uint16_t GPIo_Pin, GPIO_PinState PinState );
·电平翻转函数
void HAL_GPlO_TogglePin( GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin);
void HAL_GPlO_TogglePin( GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin);
·电平输入函数
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
例:判断PC13引脚的输入信号,若为高电平,则将PB9引脚控制的LED灯的开关状态切换。
if( HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)== GPIO_PIN_SET )
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
}
if( HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)== GPIO_PIN_SET )
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
}
实例:
·代码最好写在/* USER CODE BEGIN 0 */与/* USER CODE END 0 */之间
代码如下:
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
#define KEY2 HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)/*宏定义*/
#define KEY3 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)/*宏定义*/
#define KEY4 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5)/*宏定义*/
void Delay(unsigned int t)
{
while(t--);/*目的是消耗时间*/
}
/*按键扫描函数*/
void Scan_Keys()
{
if(KEY2 == 0)/* 0相当于GPIO_PIN_RESET */
{
Delay(1000);
if(KEY2 == 0)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);/*翻转函数*/
while(KEY2 == 0);
}
}
if(KEY3 == 0)
{
Delay(1000);
if(KEY3 == 0)
{
while(KEY3 == 0);
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);/*翻转函数*/
}
}
if(KEY4 == 0)
{
Delay(1000);
if(KEY4 == 0)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8|GPIO_PIN_9,GPIO_PIN_RESET);
while(KEY4 == 0);
}
}
}
/* USER CODE END 0 */
while(1)函数中写入Scan_Keys();
如果没有配针的情况下要增加或者修改引脚的话有两种方法:
第一种方法:退出Keil5,回到配置工具STM32CubeMX中增加或者修改引脚,再生成代码。
第二种方法:在gpio.c里面修改代码
如果不知道gpio.c的话也可以在main.c中找到 MX_GPIO_Init(); 然后右击选中Go To Definition Of 'MX_GPIO_Init();'
写入图中红框中的代码
最后就可以运行成功了!