首页 > 编程语言 >【微处理器系统原理与应用设计第九讲】GPIO之按键控灯功能——按键控制灯进行亮灭转换的应用设计与程序分析

【微处理器系统原理与应用设计第九讲】GPIO之按键控灯功能——按键控制灯进行亮灭转换的应用设计与程序分析

时间:2024-09-08 10:49:41浏览次数:15  
标签:亮灭 键控 current while 按键 GPIO btn 输入 previous

一、基础知识与明确

1、GPIO的有效电平

由按键结构决定,按键按下时输入为低电平,按键悬空时为输入为高电平,按键的输入给到GPIO的引脚(例如PC13)

2、条件控制语句

if(a):如果a为非0数字或字符那么就为真,if条件成立,反之不成立。

if(!a):如果!a为真,也就是a为0时,if条件成立,反之不成立。

if(a!=0):如果a不等于0,则使得if条件成立,反之不成立。等价于if(a)。

if(a==0): 如果a等于0,则使得if条件成立,反之不成立。等价于if(!a)。

3、单片机的执行速率一般为1s几十万次,按下按键的时长够走while循环很多次。

二、应用设计

1、功能需求

开发键控灯功能,即灯灭时,按一下按钮灯亮,灯亮时,按一下按钮灯灭。

2、设计思路

将PA5配置为数字推挽输出,PC13配置为数字输入。检测到PC13的输入从高电平变成低电平,PA5的值翻转。PA5初始输出为高电平。

3、软件流程图

4、主函数分析

int main()
{
	int btn_previous,btn_current; //定义变量
	LedInit(); //Led灯的初始化
	BtnInit(); //按钮的初始化
	btn_previous = 1; //初始化变量
	while(1){
		btn_current = BtnGet(); //获取当前按键的输入值
		if(!btn_current) //如果按键的输入为0,则进入第一层if语句
		{
			if(btn_previous) //如果之前的按键输入为1,则进入第二层if语句
				LedSw(); //Led灯进行翻转
		}
		btn_previous = btn_current; //更新按键的输入值
	}
	return 0;
		
}

(1) 初始化情况:没有按下按键的情况

(2)按下按键的瞬间

(3)继续按着按键的时候

(因为从按下到松开够while跑好多次,所以这种情况也要分析)

三、总结

1、本程序巧妙运用了btn_previous = btn_current指令来改变每次翻转后的按钮值来实现每按一次就运行一次LedSw,避免了在按的过程中程序一直跑while,而出现的亮灭快速交替的情况发生。

2、在程序内部没有由亮到灭和由灭到亮的操作之分,这是人为想要实现的目的,而在程序内部执行的只有LedSw的程序。 

标签:亮灭,键控,current,while,按键,GPIO,btn,输入,previous
From: https://blog.csdn.net/daviddou2022/article/details/142021454

相关文章

  • STM32学习笔记——GPIO
    GPIO——GeneralPurposeInputOutput——通用输入输出出口特点:通用性、快速翻转、中断支持、支持多种工作模式。8种输入输出模式模式性质特征应用标识浮空输入数字输入可读取引脚电平,若引脚悬空,则电平不确定适用于需要读取外部信号的场景,但外部信号状态......
  • FT232使用libusb控制GPIO
    FT232使用官方驱动控制GPIO很简单打开FT_OpenEx,FT_SetBitMode(FT_BITMODE_ASYNC_BITBANG)写FT_Write读FT_Read使用libusb方式打开// libusb-win32(v1.2.6.0)BOOL CHubGpio::InitLibusb(){ structusb_interface_descriptor*setting; structusb_bus *bus;......
  • GPIOMode_TypeDef 学习备注
    学习STM32——当需要用的GPIO引脚的时候往往要进行GPIO初始化,配置GPIO结构体函数。   GPIO初始化:   GPIO_InitTypeDefGPIO_InitStructure;              //定义结构体变量     GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;  ......
  • 51单片机 - 定时器0(按键控制LED流水灯模式)
    时间:2024.9.2目的:手撕51作者:Whappy定时器0寄存器配置1.定时器0配置过程首先要配置定时器的寄存器TCON和TMOD使计数器开始计数及定时器的初始值,配置使这个链路连起来。#include<REGX52.H>voidTimer0_Init(){ TMOD=0x01;//工作模式寄存器 //控制寄存器 TF......
  • GPIO
    GPIO:通用型输入输出STC8位单片机的每个引脚都有四种工作模式,分别是工作模式PnM1PnM0说明准双向(弱上拉)00即可输入也可输出,灌电流可达20mA,拉电流为270~150uA推挽输出(强上拉)01可达20mA,要加限流电阻高阻输入10电流既不能流入,也不能流出,但可用于测电平......
  • STM32GPIO操作底层解析
    我们使用HAL和标准库时,常常忽略他两的底层,只知道怎么用不知其原理,其实是大忌,因为底层丢了代码的灵魂就丢了,对以后的Linux开发不利常用的指令函数:voidGPIO_WriteBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,BitActionBitVal){/*Checktheparameters*/assert_p......
  • 基于STM32F407ZGT6用BH1750在OLED显示屏上显示光照数据,根据光照强度控制小灯亮灭(路灯
    占空比:高电平占整个电平周期的持续时长,从而控制小灯的亮度,小灯亮度的控制需用定时器的输出比较功能。PWM部分可以参考这篇文章PWM——基于STM32F407ZGT6开发板-CSDN博客此外我们还需要了解IIC的工作原理1.pwm.c   #include"public.h"/*pwm控制led实现呼吸灯1.......
  • STM32 GPIO 寄存器的配置
    32位配置寄存器:GPIOx_CRL,GPIOx_CRH32位数据寄存器:GPIOx_IDR,GPIOx_ODR32位置位/复位寄存器:GPIOx_BSRR16位复位寄存器:GPIOx_BRR32位锁定寄存器:GPIOx_LCKRGPIO寄存器详解CRL和CRH控制IO口,是四个位控制一个口,所以要两个32位的来控制16个口CRL32位端口配置低寄存器(GPIOx_......
  • 蓝桥杯单片机入门(8)—按键控制LED流水灯,加速,减速,暂停,开始
    这回我们讲的是,按键对LED灯的控制,这次是基于上次按键模块的基础上进行了进一步的加工,处理。通过按键,实现对LED流水灯的对应的各种功能。首先,在这里先介绍一个概念,标志位,标志位可以理解为设置的一个变量,这个变量作为标志位去使用,给标志位赋不同的值,执行不同的任务。比如标志位F......
  • STM32 - 按键控制LED灯
    功能:按键控制LED的亮灭。两个按键:PE3和PE2两个LED:PE5和PB5按键PE3控制LED2-PE5;按键PE2控制LED3-PB5main.c:#include"stm32f10x.h"//Deviceheader#include"Delay.h"#include"LED.h"#include"Key.h"uint8_tKeyNum;i......