打印
[PSOC™]

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

[复制链接]
35|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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显示函数:
/*******************************************************************************
* Function Name: led_control
********************************************************************************
* Summary:
*  Control the LEDs one the expansion board to show the button status:
*    No touch - LEDs == OFF
*    Touch - Corresponding LED == ON
*******************************************************************************/
// 定义全局标志位
static uint8_t led_states = 0;
static uint8_t gui_fill_states = 0;

void led_control()
{
    uint8_t new_led_states = 0;
    uint8_t new_gui_fill_states = 0;
    uint8_t oled_need_refresh = 0;

    // 检查第一个按键和 LED 状态
    if (CAPSENSE_WIDGET_INACTIVE != Cy_CapSense_IsWidgetActive(CY_CAPSENSE_BUTTON0_WDGT_ID, &cy_capsense_context))
    {
        new_led_states |= 0x01;
        new_gui_fill_states |= 0x01;
    }
    else
    {
        new_led_states &= ~0x01;
        new_gui_fill_states &= ~0x01;
    }

    // 检查第二个按键和 LED 状态
    if (CAPSENSE_WIDGET_INACTIVE != Cy_CapSense_IsWidgetActive(CY_CAPSENSE_BUTTON1_WDGT_ID, &cy_capsense_context))
    {
        new_led_states |= 0x02;
        new_gui_fill_states |= 0x02;
    }
    else
    {
        new_led_states &= ~0x02;
        new_gui_fill_states &= ~0x02;
    }

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

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

    // 判断是否需要刷新 OLED
    if (new_led_states != led_states)
    {
        oled_need_refresh = 1;
    }

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

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

170

主题

782

帖子

10

粉丝