| 本帖最后由 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屏上显示一个白色的方块:
 
 |