STM32
直播中

云中云

8年用户 918经验值
私信 关注
[问答]

如何使用库函数的方法用按键控制一个LED灯的取反?

如何使用库函数的方法用按键控制一个LED灯的取反?

回帖(1)

刘兵

2021-11-25 11:35:01
**
要求:当按键按下的时候,对LED的状态进行取反

装备:电脑,MDK5,STM32F103ZET6开发板,USB线

**
**
首先自己配置一个工程模板,如下所示**


























第二步:电路图







第三步:写代码
主函数:


#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"


int main(void)
{       


        delay_init(); //延时函数初始化
        Led_Init(); //LED初始化
        key_init(); //按键初始化
  
        while(1)
        {
                key1();       
        }//判断按键是否按下,按键按下所执行的程序


按键函数:


#include "key.h"
#include "delay.h"
#include "led.h"


void key_init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO的结构体变量

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//开启GPIOE使能


        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2;//使用GPIOE.2引脚
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置GPIOE的工作模式为带上拉输入
        GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE寄存器
}//按键初始化函数


void key1(void)
{
         if(KEY1==0)//判断按键是否按下,如果按下则满足KEY1==0,否则继续判断按键是否按下
         {
                 delay_ms(500);//按键消抖程序和防止按键是误触的
                  if(KEY1==0)//再次判断按键是否按下
                 {       
                        LED1=!LED1;//如果按下则执行按键取反(利用逻辑取反)
                 }                
         }
       
}//按键按下所执行程序


LED初始化:


#include "led.h"
#include "stm32f10x.h"


void Led_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO的结构体变量
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//打开GPIOC的时钟
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//设置GPIOC的端口,使用GPIOC.1
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置工作速度为50MHz
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//普通推挽输出模式
        GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC寄存器
       
}//LED初始化函数


按键头文件:


#ifndef _key_
#define _key_


#include "sys.h"


#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)//宏定义GPIOE.2


void key_init(void);
void key1(void);


#endif


LED头文件:


#ifndef _led_
#define _led_
#include "sys.h"


void Led_Init(void);


#define LED1 PCout(1)// LED1等价GPIOC.0


#endif




发现缺少一个延时函数,自己写喽。可以使定时器写,也可以是简单的一个计数器。这里就不多介绍。
第四步:结果
按键的时间得按久一些否则会有问题,主要还是消抖的问题。长按500ms就会出现取反,如果太快就会发现一些很神奇的现象,感觉会自闭的。
最后小小的总结一下:
利用库函数写一个简单的程序也许体会不到他的便捷性,但是慢慢地你就会发现他真的好用。不要放弃学习。emmmmm…大概就这样了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分