[PSOC™] 【英飞凌PSOC 4000T DIY】基于OLED的按键检测

[复制链接]
 楼主| lulugl 发表于 2025-4-19 22:09 | 显示全部楼层 |阅读模式
<
本帖最后由 lulugl 于 2025-4-19 22:23 编辑

【前言】
英飞凌PSOC 4000T是集成了第五代 CAPSENSE™ 触控技术,可以轻松实现触摸感应,这篇我将分享如何使用2按键来实现按键感应与OLED的结合,这实现图形化的展示:
【实现步骤】
1、首先新建一个基本2按键的示例程序:

2、选择2个按键的示例工程:

3、生成工程后,打开外设配置,由于原先的工程,他是做为slave来使用的,需要修改为master模式。如下图所示:

4、根据I2C外设的例程,复制一个原来我驱动OLED屏的示例中的OLED的驱动到工程中,帖子链接为:https://bbs.21ic.com/icview-3446028-1-1.html
5、最后工程为文件为如下所示:

6、在led控制函数中添加OLED显示函数:
  1. /*******************************************************************************
  2. * Function Name: led_control
  3. ********************************************************************************
  4. * Summary:
  5. *  Control the LEDs one the expansion board to show the button status:
  6. *    No touch - LEDs == OFF
  7. *    Touch - Corresponding LED == ON
  8. *******************************************************************************/
  9. // 定义全局标志位
  10. static uint8_t led_states = 0;
  11. static uint8_t gui_fill_states = 0;

  12. void led_control()
  13. {
  14.     uint8_t new_led_states = 0;
  15.     uint8_t new_gui_fill_states = 0;
  16.     uint8_t oled_need_refresh = 0;

  17.     // 检查第一个按键和 LED 状态
  18.     if (CAPSENSE_WIDGET_INACTIVE != Cy_CapSense_IsWidgetActive(CY_CAPSENSE_BUTTON0_WDGT_ID, &cy_capsense_context))
  19.     {
  20.         new_led_states |= 0x01;
  21.         new_gui_fill_states |= 0x01;
  22.     }
  23.     else
  24.     {
  25.         new_led_states &= ~0x01;
  26.         new_gui_fill_states &= ~0x01;
  27.     }

  28.     // 检查第二个按键和 LED 状态
  29.     if (CAPSENSE_WIDGET_INACTIVE != Cy_CapSense_IsWidgetActive(CY_CAPSENSE_BUTTON1_WDGT_ID, &cy_capsense_context))
  30.     {
  31.         new_led_states |= 0x02;
  32.         new_gui_fill_states |= 0x02;
  33.     }
  34.     else
  35.     {
  36.         new_led_states &= ~0x02;
  37.         new_gui_fill_states &= ~0x02;
  38.     }

  39.     // 判断是否需要更新第一个矩形填充
  40.     if ((new_gui_fill_states & 0x01) != (gui_fill_states & 0x01))
  41.     {
  42.         Cy_GPIO_Write(CYBSP_KEYPAD_LED1_PORT, CYBSP_KEYPAD_LED1_NUM, (new_gui_fill_states & 0x01) ? CYBSP_LED_ON : CYBSP_LED_OFF);
  43.         GUI_FillRectangle(16, 32, 48, 48, (new_gui_fill_states & 0x01) ? 1 : 0);
  44.     }

  45.     // 判断是否需要更新第二个矩形填充
  46.     if ((new_gui_fill_states & 0x02) != (gui_fill_states & 0x02))
  47.     {
  48.         Cy_GPIO_Write(CYBSP_KEYPAD_LED2_PORT, CYBSP_KEYPAD_LED2_NUM, (new_gui_fill_states & 0x02) ? CYBSP_LED_ON : CYBSP_LED_OFF);
  49.         GUI_FillRectangle(64, 32, 96, 48, (new_gui_fill_states & 0x02) ? 1 : 0);
  50.     }

  51.     // 判断是否需要刷新 OLED
  52.     if (new_led_states != led_states)
  53.     {
  54.         oled_need_refresh = 1;
  55.     }

  56.     // 更新 LED 状态和 GUI 填充状态
  57.     led_states = new_led_states;
  58.     gui_fill_states = new_gui_fill_states;

  59.     // 只有当 LED 状态变化时才刷新 OLED
  60.     if (oled_need_refresh)
  61.     {
  62.         OLED_Display();
  63.     }
  64. }
【实现效果】
当我们按下按键时,在OLED屏上显示一个白色的方块:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
Amazingxixixi 发表于 2025-4-24 16:39 | 显示全部楼层
学习一下
慢动作 发表于 2025-4-29 11:33 | 显示全部楼层
你提到的 英飞凌 PSoC 4000T 微控制器确实在嵌入式触摸应用中非常强大,集成了第五代 CAPSENSE™ 触控技术,可以实现按键、滑条、旋钮等触控感应功能。
键盘手没手 发表于 2025-4-30 22:52 | 显示全部楼层
可使用 CyDelay() 函数为每次检测添加一个小的延迟,避免重复扫描过于频繁。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

180

主题

830

帖子

12

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

180

主题

830

帖子

12

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