用独立按键控制led亮灭_陪你一起玩树莓派-按键

在控制电路中,设备的启停、参数的设置都离不开按键操作,所以按键的处理也是很重要的一个环节。

9e32f9cdd8ba910140d8a0ee65f50380.png

常用按键

一、在本节课中我们会讲到两个重要的概念

1、中断处理

中断就是CPU正常运行期间,由于内、外部事件引起的CPU暂时停止正在运行的程序,去执行该内部事件或外部事件的引起的服务中去,服务执行完毕后再返回断点处继续执行的情形。这样的中断机制极大的提高了CPU运行效率。

2、按键防抖

通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。

抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。这是一个很重要的时间参数,在很多场合都要用到。

95330640a0628b821030cc79ebf14419.png

按键的消抖,可用硬件或软件两种方法:

硬件消抖

在键数较少时可用硬件方法消除键抖动。

软件消抖

如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。

二、实验前准备

1、面包板 x 1

2、轻触按键 x 2

3、10K电阻 x 2

4、杜邦线若干

5、发光二极管 x 1

三、原理图

b61b1eadc55024ea6bcba00af208122e.png

注意:上一节我们的led的正极是接在gpio.18上,通过gpio.18 设置为高电平点亮。本节我们的led正极接在3.3v上,通过gpio.18设置低电平点亮.

按键说明:2个按键一端接在3.3v上,另一端分别接在GPIO.05和GPIO.06上,同时用两个10K的电阻从GPIO端接到GND上(用作下拉电阻)

四、实验目的

1、通过一个按键控制led亮灭

2、通过两个按键控制led的亮灭

五、程序代码

1、一个按键控制

#!/usr/bin/python3# 导入树莓派GPIO库,为了方便操作,我们定义一个GPIO的别名import RPi.GPIO as GPIOimport timekey_up = 6key_down = 5led = 18global ledStatusledStatus = Truedef init(): # 设置GPIO的引脚编码方式,这里我们选用BCM编码方式,相应的引脚也要按BCM设置 GPIO.setmode(GPIO.BCM) # 设置忽略警告信息 GPIO.setwarnings(False) # 定义按键引脚 # 设置按键对应的GPIO为输入模式并且设置为下拉模式 GPIO.setup(key_up, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(key_down, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # 设置led引脚,设置GPIO为输出模式 GPIO.setup(led, GPIO.OUT) # 按键设置中断,第一个参数:gpio编号,第二个:触发方式,第三个:回调方法,第四个:软件消抖时间 GPIO.add_event_detect(key_up, GPIO.RISING, callback=on_key_up, bouncetime=200) GPIO.add_event_detect(key_down, GPIO.RISING, callback=on_key_down, bouncetime=200)# 按键回调方法def on_key_up(channel): print('up') global ledStatus ledStatus = not ledStatus GPIO.output(led, ledStatus)def on_key_down(channel): print('down')# 初始化init()GPIO.output(led, GPIO.HIGH)try: while 1: passexcept Exception as e: print(e)

2、两个按键控制

#!/usr/bin/python3# 导入树莓派GPIO库,为了方便操作,我们定义一个GPIO的别名import RPi.GPIO as GPIOimport timekey_up = 6key_down = 5led = 18def init(): # 设置GPIO的引脚编码方式,这里我们选用BCM编码方式,相应的引脚也要按BCM设置 GPIO.setmode(GPIO.BCM) # 设置忽略警告信息 GPIO.setwarnings(False) # 定义按键引脚 # 设置按键对应的GPIO为输入模式并且设置为下拉模式 GPIO.setup(key_up, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(key_down, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # 设置led引脚,设置GPIO为输出模式 GPIO.setup(led, GPIO.OUT) # 按键设置中断,第一个参数:gpio编号,第二个:触发方式,第三个:回调方法,第四个:软件消抖时间 GPIO.add_event_detect(key_up, GPIO.RISING, callback=on_key_up, bouncetime=200) GPIO.add_event_detect(key_down, GPIO.RISING, callback=on_key_down, bouncetime=200)# 按键回调方法def on_key_up(channel): print('up') GPIO.output(led, 0)def on_key_down(channel): print('down') GPIO.output(led, 1)init()GPIO.output(led, GPIO.HIGH)try: while 1: passexcept Exception as e: print(e)

GPIO.RISING 的意思是上升沿触发

boundcetime=200的意思是不检测200毫秒内的触发,这个就是防抖关键

关注我,陪你一起玩树莓派

欢迎大家把玩树莓派遇到的问题留言,我会一一解答。

下一节,我们一块学习PWM

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我理解了你的问题。这是一个常见的STM32应用实战问题,下面是一个简单的解决方案: 首先,你需要连接一个LED和一个按键到STM32开发板。将LED连接到开发板的一个GPIO引脚,将按键连接到另一个GPIO引脚。 接下来,你需要编写程序来控制LED亮灭。在这个程序中,你需要初始化GPIO引脚,设置LED引脚为输出模式,设置按键引脚为输入模式,然后在一个循环中不断读取按键状态并根据按键状态控制LED亮灭。 以下是一个示例代码: ```c #include "stm32f10x.h" int main(void) { GPIO_InitTypeDef GPIO_InitStructure; // 初始化LED引脚 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化按键引脚 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); while(1) { if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == RESET) { // 按键按下 GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET); } else { // 按键未按下 GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET); } } } ``` 在这个程序中,我们使用了STM32的库函数来初始化GPIO引脚和读取按键状态。当按键按下时,LED引脚被设置为低电平,LED灯会亮起来。当按键未按下时,LED引脚被设置为高电平,LED灯会熄灭。 希望这个解决方案能帮助到你。如果你有任何问题或需要进一步的帮助,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值