LED灯的点亮和按键控制_GPIO

一、GPIO控制灯亮

  1. 原理图绘制


在这里插入图片描述

点“p”添加原件,有led灯和按键

在这里插入图片描述

添加led在PA1和PA11引脚上,这里led 的正极接了电源,所以这里只有引脚输出低电平时,灯才会点亮。

在这里插入图片描述在这里插入图片描述

2.代码编写
①创建其他c文件的文件夹
在代码文件中新增一个文件夹“Hardware”,并添加到工程中,
在这里插入图片描述

右击绿色高光处,选择另外一个绿色高光处,点红色高光处,输入“Hardware”,点击ok
随后再按下面操作

在这里插入图片描述
在这里插入图片描述
②在Hardware文件夹下,创建led.c的文件,以便封装点亮led 的函数
在这里插入图片描述

同样创建.h文件

给LED.c添加头文件,给LED.h添加头文件对于LED.c,首先对它进行led的初始化,即初始化时钟,初始化端口,然后添加灯亮的指令函数

#include "stm32f10x.h"                  // Device header
void Led_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_1);//默认高电平,熄灭
}
void LED1_GO(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_1);//低电平,点亮
}
void LED1_OFF(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}

在.h文件添加.c文件中的函数名

#ifndef __LED_H
#define __LED_H
void Led_Init(void);
void LED1_GO(void);
void LED1_OFF(void);
#endif
//在#endif后面要空一行

在main函数添加led的.h文件

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"                 
int main(void)
{
//2忘记初始化灯了
Led_Init();
while (1)
{
LED1_GO();
Delay_ms(100);
LED1_OFF();
Delay_ms(100);
LED1_GO();
Delay_ms(100);
LED1_OFF();
Delay_ms(700);
}
}

④写入.hex文件
双击芯片
在这里插入图片描述

运行即可

错误汇总
1.
在这里插入图片描述

这里要写8M才能正常闪烁

2.在main函数中,忘记写入初始化led灯的函数了

二、按键控制led灯亮

需求:①按一下常亮,再按一下熄灭(led1)②按一下闪烁几下后常亮(led2)
1.原理图绘制:
在这里插入图片描述
按键接了地,所以在引脚为按下后,引脚为低电平,所以需要引脚读取电平信号判断是否按下,即按下,引脚电平为低,读取后,可进行判断,判断为低电平(按下状态),则点亮led灯

2.逻辑设计
创建一个检测按键的函数,如果按下①号按键返回给亮灯函数1,如果按下②号按键,返回给亮灯函数2;亮灯函数设置一个参数,如果检测传入的参数是多少;
参数为1,是对led1灯进行操作,先检测led1灯的状态(设置了一个led1灯的状态值,点亮为1,熄灭为0),如果为熄灭状态,就点亮然后置状态为1.
参数为2,调用led.c中的led闪烁函数,然后led闪烁函数让led保持常亮

3.代码编写
编辑Key的.c和.h文件
查看gpio的c文件
在这里插入图片描述

可以看到它的用法,是读取输出口的数据bit,如果在输出模式下,想看一下输出了什么,就可以用这个函数。
那么key.c现在需要使用
在这里插入图片描述
这个函数

主要代码如下
Key.c

//检测是否按下函数,供main调用
uint8_t Key_GetVal(void)
{
    uint8_t key_data_1 = 0;
    uint8_t led_status = 0;//默认灯熄灭
    //按键开关led
    if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0)//代表板子按下,低电平
    {
        //按键刚按下时,会有抖动,所以需要消抖
        Delay_ms(20);
        while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0);
        //如果按键一直按下不放,就一直卡在这里
        Delay_ms(20);
        key_data_1 = 1;
    }
    if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) == 0)//第2个按钮被按下,传递不同参数
    {
        Delay_ms(20);
        while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) == 0);
        Delay_ms(20);
        key_data_1 = 2;
    }
    
    return key_data_1;
    
}

LED.c

void LED2_Blink(void)
{
    for(int i =0 ; i<5;i++){
    GPIO_ResetBits(GPIOA,GPIO_Pin_11);//低电平,点亮
    Delay_ms(10000);
    GPIO_SetBits(GPIOA,GPIO_Pin_11);
    Delay_ms(10000);
    GPIO_ResetBits(GPIOA,GPIO_Pin_11);//低电平,点亮
    }
}
void LED_SET(uint8_t led_num)//led_num=1时点亮led1灯
{
    if(led_num==1){
        if(led1_status == 0){//led1_status为全局变量,检测此时灯是亮的还是熄灭状态,熄灭状态的话,按下按钮就要点亮
            GPIO_ResetBits(GPIOA,GPIO_Pin_1);
            led1_status = 1;
            Delay_ms(200);
        }
        else
        {
            GPIO_SetBits(GPIOA,GPIO_Pin_1);//高电平,为灭
            led1_status = 0;
            Delay_ms(200);
        }
    }
    if(led_num == 2){
        LED2_Blink();
    }
}

main.c

int main(void)
{
    //test2:按键点亮led
    Led_Init();
    Key_Init();
    while(1)
    {
        LED_SET(Key_GetVal());
    }
}
  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以参考以下代码: #include "stm32f10x.h" #define LED_PIN GPIO_Pin_13 int main() { // 初始化LED引脚 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = LED_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化按键引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); while(1) { if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) { GPIO_SetBits(GPIOB, LED_PIN); } else { GPIO_ResetBits(GPIOB, LED_PIN); } } return 0; } ### 回答2: 下面是一个使用STM32F103VCT6控制LED点亮的代码示例,通过按键中断来触发LED的状态改变。 首先,我们需要初始化LED的引脚和按键的引脚,将它们分别连接到STM32F103VCT6的GPIO引脚。 ```c #include "stm32f10x.h" void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; // 初始化LED引脚 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); } void Button_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; // 初始化按键引脚 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); } int main(void) { // 初始化系统时钟等 // ... LED_Init(); Button_Init(); // 启用外部中断线0 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 配置外部中断线0为触发下降沿触发 EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); // 配置外部中断线0对应的中断通道 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); while (1) { // 在主循环中执行其他任务 // ... } } // 外部中断线0的中断处理函数 void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { // LED状态取反 GPIO_WriteBit(GPIOC, GPIO_Pin_13, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13))); // 清除中断标志位 EXTI_ClearITPendingBit(EXTI_Line0); } } ``` 在上面的代码中,我们首先通过`LED_Init`函数初始化了LED的引脚(PC13),通过`Button_Init`函数初始化了按键的引脚(PA0)。 然后,我们启用外部中断线0,并配置触发方式为下降沿触发。我们还通过`NVIC_InitStructure`配置了外部中断线0对应的中断通道,并使能了中断。 在`EXTI0_IRQHandler`函数中,我们首先通过`EXTI_GetITStatus`函数判断中断是否发生,如果发生了,就将LED的状态取反,即点亮或熄灭。 最后,通过`EXTI_ClearITPendingBit`函数清除中断标志位。 在主循环中,我们可以执行其他任务,这样即使没有中断发生,程序也可以正常运行。 以上就是一个使用STM32F103VCT6控制LED点亮的代码示例,通过按键中断来触发LED的状态改变。 ### 回答3: 要使用STM32F103VCT6微控制控制LED点亮,可以通过按键中断来触发LED的状态改变。 首先,需要在代码中定义按键和LED的引脚。 ```c #define BUTTON_PIN GPIO_PIN_0 #define BUTTON_PORT GPIOA #define LED_PIN GPIO_PIN_1 #define LED_PORT GPIOA ``` 接下来,在初始化函数中配置按键和LED的引脚。 ```c void GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; // 配置按键引脚 GPIO_InitStruct.Pin = BUTTON_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct); // 配置LED引脚 GPIO_InitStruct.Pin = LED_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct); // 中断配置 HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); } ``` 然后,编写中断处理函数,用于按键的触发和切换LED状态。 ```c void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == BUTTON_PIN) { HAL_GPIO_TogglePin(LED_PORT, LED_PIN); // 切换LED状态 } } ``` 最后,启动程序,并在主函数中执行代码。 ```c int main(void) { HAL_Init(); SystemClock_Config(); GPIO_Init(); while(1) { // 主循环 } } ``` 通过以上代码,当按下按键时,会触发按键中断,中断处理函数会切换LED的状态,实现LED点亮控制

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值