背景
结合之前的工程,接入双按键模块 U025,一个红色按键和一个蓝色按键。模块的外观和原理图如下图所示:
连接
按键模块和开发板的连接如下;
代码实现
按键管脚定义
/** * @brief * boot按键 -- 管脚0 * 红色按键 -- 管脚12 * 绿色按键 -- 管脚11 * @defgroup BTN_PIN_GROUP * @{ */ #define BTN_BOOT_PIN 0 #define BTN_RED_PIN 12 #define BTN_BLUE_PIN 11 /** * @} */
按键初始化
/** * @brief 按键硬件初始化、对象初始化 */ void btn_init(void) { pinMode(BTN_BOOT_PIN, INPUT_PULLUP); /* 按键硬件初始化,输入上拉模式 */ btn_boot_obj.attach(BTN_BOOT_PIN); /* 按键对象绑定到硬件 */ btn_boot_obj.interval(10); /* 设置按键消抖时间 */ /* 红色按键 */ pinMode(BTN_RED_PIN, INPUT_PULLUP); btn_red_obj.attach(BTN_RED_PIN); btn_red_obj.interval(5); /* 蓝色按键 */ pinMode(BTN_BLUE_PIN, INPUT_PULLUP); btn_blue_obj.attach(BTN_BLUE_PIN); btn_blue_obj.interval(5); }
按键扫描及处理
在 loop() 中调用按键扫描函数 btn_process() ,根据按下按键的不同,调用 screen_button_status() 在屏幕显示不同的内容。
/** * @brief 在主循环中调用此函数 * * @param */ void btn_process(void) { /* 在此更新所有的按键状态 */ btn_boot_obj.update(); btn_red_obj.update(); btn_blue_obj.update(); if (btn_boot_obj.changed()) { /* 按键状态变化了,包含按下和释放事件 */ if (btn_boot_obj.read()) { /* 高电平表示按键释放 */ led_status = !led_status; screen_button_status(BTN_BOOT_PIN, false); } else { /* 低电平表示按键按下 */ screen_button_status(BTN_BOOT_PIN, true); } } digitalWrite(LED_PIN, led_status); /* 红色按键状态检测 */ if (btn_red_obj.changed()) { Serial.println("btn red changed"); if (btn_red_obj.fell()) { /* HIGH-->LOW,按下 */ Serial.println("btn red PRESSED"); screen_button_status(BTN_RED_PIN, true); } else if (btn_red_obj.rose()) { /* LOW-->HIGH, 释放*/ Serial.println("btn red RELEASED"); screen_button_status(BTN_RED_PIN, false); } else { Serial.println("btn red UNKNOWN"); } } /* 蓝色按键状态检测 */ if (btn_blue_obj.changed()) { Serial.println("btn blue changed"); if (btn_blue_obj.fell()) { /* HIGH-->LOW,按下 */ Serial.println("btn blue PRESSED"); screen_button_status(BTN_BLUE_PIN, true); } else if (btn_blue_obj.rose()) { /* LOW-->HIGH, 释放*/ Serial.println("btn blue RELEASED"); screen_button_status(BTN_BLUE_PIN, false); } else { Serial.println("btn blue UNKNOWN"); } } } /** * @brief 根据按下的按键状态在屏幕上显示不同的内容 * * @param btn_pin see @ref BTN_PIN_GROUP * @param isPressed */ void screen_button_status(int btn_pin, bool isPressed) { canvas.fillScreen(ST77XX_BLACK); canvas.setCursor(0, 25); switch (btn_pin) { case BTN_BOOT_PIN: canvas.setTextColor(ST77XX_BLUE); canvas.print("Button: "); canvas.setTextColor(ST77XX_YELLOW); if(isPressed) { canvas.println("Pressed"); } else { canvas.println("Released"); } break; case BTN_RED_PIN: canvas.setTextColor(ST77XX_RED); canvas.println("Hello EEPW & DigiKey"); canvas.println("CoderX9527"); canvas.println(String(__DATE__)); break; case BTN_BLUE_PIN: canvas.setTextColor(ST77XX_BLUE); canvas.println("ESP32S3:"); canvas.println("WiFi: 2.4GHz 802.11 b/g/n"); canvas.println("Bluetooth 5(LE)"); break; default: break; } display.drawRGBBitmap(0, 0, canvas.getBuffer(), LCD_WIDTH, LCD_HEIGHT); }
演示
1. BOOT 按键显示文字
2. 红色按键显示文字
红色按键按下显示文字内容如下:
Hello EEPW & DigiKey CoderX9527 Nov 9 2024
3. 蓝色按键显示文字
蓝色按键按下显示文字内容如下:
ESP32S3: WiFi: 2.4GHz 802.11 b/g/n Bluetooth 5(LE)
4. 视频演示
见B站演示视频:
EEPW-DIY-电子测光笔-任务3-屏幕显示文字_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1Z6UoYQEhU/?vd_source=8f2bbf56b70c541bec2ea0b9f102ebee