按键控制LED亮灭
分享作者:wx17582673332544
评测品牌:萤火工场
评测型号:GD32VW553-IOT-V2
发布时间:2025-10-23 09:41:37
1
前言
使用GD32VW553-IOT-V2
开源口碑分享内容

1.首先我们来看一看GD32VW553-IOT-V2的引脚图与原理图。

                                                                                 

2.在官网下载需要的软件包。

3.代码原理:按键接控制器输入引脚、LED接输出引脚,按键未按下时输入引脚电平稳定,控制器不动作、LED 不亮,按下后输入引脚电平跳变,控制器检测到信号后,按预设程序改变输出引脚电平,让电流流过 LED 实现亮灭,这种模式还能通过编程实现按一次亮再按一次灭等复杂逻辑。

4.源代码

#include "gd32vw55x.h"

#include "systick.h"

#include <stdio.h>

#include "gd32vw553h_eval.h"


/* 引脚定义:A0(输入)控制A1(LED) */

#define INPUT_GPIO_PORT GPIOA // 输入引脚端口(A0)

#define INPUT_GPIO_PIN GPIO_PIN_0 // 输入引脚(A0,上拉输入)

#define LED_GPIO_PORT GPIOA // LED引脚端口(A1)

#define LED_PIN GPIO_PIN_1 // LED引脚(A1)


/* 函数声明 */

void system_init(void);

void gpio_input_config(void);

void gpio_led_config(void);

uint8_t gpio_level_read_stable(void);

void led_control_by_input(void);


int main(void) {

system_init();


printf("A0控制A1:高电平灭,低电平亮\r\n");

printf("Input: A0 | Output: A1\r\n");


while(1) {

led_control_by_input(); // 根据A0电平控制A1

delay_1ms(10);

}

}


/* 系统初始化 */

void system_init(void) {

systick_config();

gpio_input_config();

gpio_led_config();

}


/* 配置A0为上拉输入(默认高电平) */

void gpio_input_config(void) {

rcu_periph_clock_enable(RCU_GPIOA);


// 上拉输入:未接信号时默认高电平,接低电平(如GND)时为低电平

gpio_mode_set(INPUT_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, INPUT_GPIO_PIN);

}


/* 配置A1为推挽输出 */

void gpio_led_config(void) {

// GPIOA时钟已在gpio_input_config中使能


gpio_mode_set(LED_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED_PIN);

gpio_output_options_set(LED_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, LED_PIN);


gpio_bit_reset(LED_GPIO_PORT, LED_PIN); // 初始状态:灭

}


/* 带防抖的A0电平读取 */

uint8_t gpio_level_read_stable(void) {

uint8_t level1, level2, level3;


level1 = gpio_input_bit_get(INPUT_GPIO_PORT, INPUT_GPIO_PIN);

delay_1ms(5);

level2 = gpio_input_bit_get(INPUT_GPIO_PORT, INPUT_GPIO_PIN);

delay_1ms(5);

level3 = gpio_input_bit_get(INPUT_GPIO_PORT, INPUT_GPIO_PIN);


return (level1 == level2 && level2 == level3) ? level1 : level2;

}


/* 核心控制逻辑:A0高电平灭,低电平亮 */

void led_control_by_input(void) {

uint8_t input_level = gpio_level_read_stable();


if(input_level == SET) { // A0为高电平(未按按键)

gpio_bit_reset(LED_GPIO_PORT, LED_PIN); // A1输出低电平→灯灭

} else { // A0为低电平(按键按下,接GND)

gpio_bit_set(LED_GPIO_PORT, LED_PIN); // A1输出高电平→灯亮

}

}


/* 必要的中断服务函数 */

void HardFault_Handler(void) { while(1); }

void SysTick_Handler(void) { delay_decrement(); }


全部评论
暂无评论
0/144