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