本实验使用一枚按钮来切换板载LED的亮/灭状态,每按一次,亮/灭切换一次。
一、电路图
连接图
二、编程思路
当我们按下按钮时,LED状态不变,当我们松开按钮时,LED的状态才会发生变化。因此,我们需要捕捉按钮状态变化的瞬间。那么我们如何捕捉呢?我们可以申明两个变量 pre 和 cur。其中pre保存按钮上一次的值,cur保存按钮当前值,按键抬起为1,按键按下为0。我们不断更新pre和cur的值。当pre = cur 时,按键状态未发生变化,当 pre ≠ cur时,我们就可以捕捉到按键变化的瞬间。
当pre = 1 , cur = 0时,按键按下;当pre = 0 , cur = 1时,按键抬起。
三、CubeMX配置
最后生成代码,打开工程。
四、代码
我们在工程的main.c文件中进行代码编写,找到main.c文件的while循环处。
代码编写在上图的begin和end之间。
uint8_t pre = 1,cur = 1;// 申明两个变量并且赋值1,代表当前按键处于松开状态
uint8_t ledstate = 0; //用来保存当前LED的状态 0 ——熄灭 ;1 ——点亮。
while (1)
{
pre = cur ; //更新pre的值
if( HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_SET)//读取PA0上的电压,如果是高电压
{
cur = 1; //给cur赋值为1
}
else { //读到低电压
cur = 0;
}
if (pre != cur) //捕捉到了按动动作
{
if (cur = 0) //按键按下的动作
{
}
else //按键抬升的动作
{
if(ledstate == 0) //如果当前LED熄灭
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET); //点亮LED
ledstate = 1; //更新ledstate状态
}
else //当前LED点亮
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET); //熄灭LED
ledstate = 0; //更新ledstate状态
}
}
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
我们编译下载到单片机里面会发现有时候按键失灵,这是由于按键抖动引起的,我们再对其进行消抖。
按键的抖动时间一般不会超过10ms ,所以我们检测到按动动作之后延迟10ms就可以解决。
加入消抖代码。
uint8_t pre = 1,cur = 1;// 申明两个变量并且赋值1,代表当前按键处于松开状态
uint8_t ledstate = 0; //用来保存当前LED的状态 0 ——熄灭 ;1 ——点亮。
while (1)
{
pre = cur ; //更新pre的值
if( HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_SET)//读取PA0上的电压,如果是高电压
{
cur = 1; //给cur赋值为1
}
else { //读到低电压
cur = 0;
}
if (pre != cur) //捕捉到了按动动作
{
HAL_Delay(10); //按键消抖
if (cur = 0) //按键按下的动作
{
}
else //按键抬升的动作
{
if(ledstate == 0) //如果当前LED熄灭
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET); //点亮LED
ledstate = 1; //更新ledstate状态
}
else //当前LED点亮
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET); //熄灭LED
ledstate = 0; //更新ledstate状态
}
}
}
最终,我们就可以实现自由切换LED的亮灭状态。