【STM32】按键控制小灯的亮灭

今天我们用STM32单片机上的按键来控制小灯泡的亮灭,楼主在b站STM32教学中进行学习,其中有几点是楼主觉得对于新手有点难理解的地方进行讲解,详细视频教学请参考,文中配图来源于keysking视频教学(up主做的挺好的,点赞!!!)

【【STM32入门教程-2024】第4集 按键控制小灯 GPIO输入 | keysking的stm32教程】 https://www.bilibili.com/video/BV1Z84y157dx/?p=5&share_source=copy_web&vd_source=9509e6dea87ae27d12da0fcdc70da468

今天需要用STM32完成的任务是:

1、按住单片机上的KEY1键,LED_GREEN亮起,松开KEY1,LED_GREEN熄灭

2、按下单片机上的KEY2键,LED_RED亮起,再按下KEY2,LED_RED熄灭(反转亮灭)

任务1:

下图中的电容作用:消除按键抖动

下图中的10K电阻,为上拉电阻

下图中的PB12为浮空输入模式(并入一个非常非常大的电阻,假设是a,KEY1断开情况下,10K电阻与电阻a进行分压,10K电阻在无穷大的电阻面前,分到的电压几乎为0,所以PB12几乎为3.3V)

此处PB12用于检测KEY1状态(KEY1断开,则PB12直接接入3.3V;KEY1闭合,则PB12接入0V)

代码部分:

  while (1)
  {
	HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin);
	if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET){
		HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin, GPIO_PIN_SET);
	}else{
		HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin, GPIO_PIN_RESET);
	}

  }

代码理解:

HAL_GPIO_ReadPin:用来获取KEY1状态,如果按键被按下,则PB12为低电平,则让LED_GREEN处于高电平点亮;反之如果按键被松开,则执行else语句,LED_GREEN处于低电平熄灭

任务2:

该图为KEY2的原理图,与KEY1图的区别在于,没有了上拉电阻

所以PB13为上拉输入模式(个人理解:自带高电平)

代码部分:

  while (1)
  {	
    if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET){
		HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);
		while(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET){}
    }

代码理解:

HAL_GPIO_TogglePin的作用是反转,如果灯是熄灭的则变为点亮,如果灯点亮则变为熄灭

问题:如果不加while循环,可以实现功能吗?

答案:不能,因为在按键被按下时,while(1)飞速循环,HAL_GPIO_ReadPin一直在检测KEY2的状态,一直是被按下的状态,则灯泡一直在反转,由于频率太快,肉眼看不出来闪烁,所以一直亮。当松开的时候会出现两种情况,第一种是在松开前灯泡反转为熄灭,松开后灯泡一直亮;第二种是在松开前灯泡反转为亮,松开后灯泡一直熄灭,所以按下按键后,灯泡不一定是亮的。

加上while循环后,在松开前灯泡反转一次后,一直处于死循环,直到下一次按键被按下,灯泡再进行反转。

大家有什么问题,欢迎大家留言讨论!!!!

您的支持是我学习的最大动力!!!

STM32单片机是一种常见的微控制器,在嵌入式系统中常用于控制硬件设备。如果你想用STM32控制LED灯通过按键操作,通常会涉及以下几个步骤: 1. **初始化**:首先对GPIO(通用输入输出)模块进行配置,将LED连接到相应的GPIO引脚,并设置为推挽输出模式。 2. **按键检测**:使用中断的方式监听按键信号。当按键按下时,GPIO的状态会发生变化,我们可以读取这个状态并触发相应操作。 3. **LED控制**:当检测到按键事件时,根据按键的状态(通常是高电平代表按下)来切换LED的点状态。例如,可以将GPIO设置为低电平来点LED,设置为高电平来熄LED。 4. **中断服务函数**:编写一段处理按键中断的服务程序,负责处理按键状态的变化以及LED的切换。 下面是一个简单的伪代码示例: ```c void KEY_Init(void) { GPIO_InitStructure.GPIO_Pin = LED_Pin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; HAL_GPIO_Init(LED_PORT, &GPIO_InitStructure); } // 按键中断处理函数 void EXTI0_IRQHandler(void) { if (HAL_GPIO_ReadPin(KEY_PIN) == GPIO_PIN_SET) { // 按键按下,LED点 HAL_GPIO_WritePin(LED_PORT, LED_Pin, GPIO_PIN_RESET); } else { // 按键松开,LED熄 HAL_GPIO_WritePin(LED_PORT, LED_Pin, GPIO_PIN_SET); } } int main(void) { KEY_Init(); HAL_NVIC_EnableIRQ(EXTI0_IRQn); // 开启按键中断 while (1) {} } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值