按键控制LED亮灭

[复制链接]
120|0
本文转载自iCEasy商城口碑评测作者:wx17582673332544
欢迎大家戳链接按键控制LED亮灭_口碑测评-iCEasy商城与原贴作者互动交流哦~
视频链接
https://www.bilibili.com/video/BV1Dqs4zuEHv?vd_source=ec4fb8b0409a86e8b490acf53696fc19
前言
使用GD32VW553-IOT-V2
开源口碑分享内容
1.首先我们来看一看GD32VW553-IOT-V2的引脚图与原理图。
                                                                                 
2.在官网下载需要的软件包。
3.代码原理:按键接控制器输入引脚、LED接输出引脚,按键未按下时输入引脚电平稳定,控制器不动作、LED 不亮,按下后输入引脚电平跳变,控制器检测到信号后,按预设程序改变输出引脚电平,让电流流过 LED 实现亮灭,这种模式还能通过编程实现按一次亮再按一次灭等复杂逻辑。
4.源代码
  1. #include "gd32vw55x.h"

  2. #include "systick.h"

  3. #include <stdio.h>

  4. #include "gd32vw553h_eval.h"



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

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

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

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

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



  10. /* 函数声明 */

  11. void system_init(void);

  12. void gpio_input_config(void);

  13. void gpio_led_config(void);

  14. uint8_t gpio_level_read_stable(void);

  15. void led_control_by_input(void);



  16. int main(void) {

  17. system_init();



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

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



  20. while(1) {

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

  22. delay_1ms(10);

  23. }

  24. }



  25. /* 系统初始化 */

  26. void system_init(void) {

  27. systick_config();

  28. gpio_input_config();

  29. gpio_led_config();

  30. }



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

  32. void gpio_input_config(void) {

  33. rcu_periph_clock_enable(RCU_GPIOA);



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

  35. gpio_mode_set(INPUT_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, INPUT_GPIO_PIN);

  36. }



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

  38. void gpio_led_config(void) {

  39. // GPIOA时钟已在gpio_input_config中使能



  40. gpio_mode_set(LED_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED_PIN);

  41. gpio_output_options_set(LED_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, LED_PIN);



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

  43. }



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

  45. uint8_t gpio_level_read_stable(void) {

  46. uint8_t level1, level2, level3;



  47. level1 = gpio_input_bit_get(INPUT_GPIO_PORT, INPUT_GPIO_PIN);

  48. delay_1ms(5);

  49. level2 = gpio_input_bit_get(INPUT_GPIO_PORT, INPUT_GPIO_PIN);

  50. delay_1ms(5);

  51. level3 = gpio_input_bit_get(INPUT_GPIO_PORT, INPUT_GPIO_PIN);



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

  53. }



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

  55. void led_control_by_input(void) {

  56. uint8_t input_level = gpio_level_read_stable();



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

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

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

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

  61. }

  62. }



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

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

  65. void SysTick_Handler(void) { delay_decrement(); }







您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

16

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部