打印
[CAPSENSE™]

# 【英飞凌PSOC 4000T DIY】 PSoC 4000T与OLED12864实现SpaceTrash小游戏机

[复制链接]
84|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

[i=s] 本帖最后由 gaoshanmicai 于 2025-5-6 11:22 编辑 [/i]<br /> <br />

【英飞凌PSOC 4000T DIY】 PSoC 4000T与OLED12864实现SpaceTrash小游戏机

欢迎来观看DIY!在这个项目中,我使用PSoC 4000T开发版与2按键传感器扩展板子和OLED12864显示器来创建一个简单的SpaceTrash(太空垃圾)小游戏。这是一个适合初学者了解按键的原理的项目,它不仅能让我们更加熟悉PSoC编程环境,还能让我们了解使用psoc的I2C外设

所需材料

PSoC 4000T开发板 OLED12864显示屏 USB线缆(用于连接电脑和PSoC 4000T) 计算机(安装有Modus tools 与 Eclipse IDE等等工具)

连接准备:

我使用的是IIC 引脚的12864 ,板子上没有额外留I2C引脚的接线,所以我用线将屏幕与主板的I2C的 焊点进行焊接 。 solder.PNG

整体连接很简单

zhengtilianj.PNG

软件框图

mu.drawio.png

框图很简单

程序说明

使用modus tools 先生成2按键传感器的代码。然后基于MSCLP_Inductive_Sensing_Touch_over_Metal_Keypad-2这个Demo.我们分别添加oled1306的驱动 ,u8g2的驱动,还有按键的驱动代码

addcodes2.PNG

addcode.PNG

我们添加按键的驱动

/* 向上 */
uint8_t read_cap_bt1(void)
{
  if (CAPSENSE_WIDGET_INACTIVE != Cy_CapSense_IsWidgetActive(CY_CAPSENSE_BUTTON0_WDGT_ID, &cy_capsense_context))
    {
          Cy_GPIO_Write(CYBSP_KEYPAD_LED1_PORT, CYBSP_KEYPAD_LED1_NUM, CYBSP_LED_ON);
        //  Cy_GPIO_Write(GPIO_PRT3, 0, CYBSP_LED_ON);
      return 1;

    }
    else
    {
        Cy_GPIO_Write(CYBSP_KEYPAD_LED1_PORT, CYBSP_KEYPAD_LED1_NUM, CYBSP_LED_OFF);
        return 0;
    }

}
/* 向下 */
uint8_t read_cap_bt2(void)
{
      if (CAPSENSE_WIDGET_INACTIVE != Cy_CapSense_IsWidgetActive(CY_CAPSENSE_BUTTON1_WDGT_ID, &cy_capsense_context))
        {
          Cy_GPIO_Write(CYBSP_KEYPAD_LED2_PORT, CYBSP_KEYPAD_LED2_NUM, CYBSP_LED_ON);
              return 1;
        }
        else
        {
            Cy_GPIO_Write(CYBSP_KEYPAD_LED2_PORT, CYBSP_KEYPAD_LED2_NUM, CYBSP_LED_OFF);
              return 0;
        }

}
/* 开始按键  P1_0 */
 Cy_GPIO_Read(GPIO_PRT1, CYBSP_USER_BTN_PIN);

u8g2 部分需要添加修改的代码

uint8_t u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
  static uint8_t buffer[32];        /* u8g2/u8x8 will never send more than 32 bytes between START_TRANSFER and END_TRANSFER */
  static uint8_t buf_idx;
  uint8_t *data;

  switch(msg){

    case U8X8_MSG_BYTE_SEND:
      data = (uint8_t *)arg_ptr;
      while( arg_int > 0 ){
                buffer[buf_idx++] = *data;
                data++;
                arg_int--;
            }
    break;

    case U8X8_MSG_BYTE_INIT:
      /* add your custom code to init i2c subsystem */
    break;

    case U8X8_MSG_BYTE_START_TRANSFER:
      buf_idx = 0;
    break;

    case U8X8_MSG_BYTE_END_TRANSFER:
        WritePacketToEzI2C(buffer,buf_idx);
      //HAL_I2C_Master_Transmit(&hi2c1,u8x8_GetI2CAddress(u8x8), buffer, buf_idx,1000);

    break;

    default:
      return 0;
  }
  return 1;
}


uint8_t u8g2_gpio_and_delay_psoc(U8X8_UNUSED u8x8_t *u8x8, U8X8_UNUSED uint8_t msg, U8X8_UNUSED uint8_t arg_int, U8X8_UNUSED void *arg_ptr)
{
    switch(msg){

    case U8X8_MSG_GPIO_AND_DELAY_INIT:
        break;

    case U8X8_MSG_DELAY_MILLI:
        //HAL_Delay(arg_int);
        Cy_SysLib_Delay(arg_int);
        break;

    case U8X8_MSG_GPIO_I2C_CLOCK:
        break;

    case U8X8_MSG_GPIO_I2C_DATA:
        break;

    default:
        return 0;
    }
    return 1; // command processed successfully.
}

void u8g2Init(u8g2_t *u8g2)
{
    u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_hw_i2c, u8g2_gpio_and_delay_psoc);
    u8g2_InitDisplay(u8g2);   
    u8g2_SetPowerSave(u8g2, 0); 
    u8g2_ClearBuffer(u8g2);
}

游戏的程序借鉴了arduino的 程序代码,将CPP的代码改写成C的.然后程序中添加按键逻辑

void u8g2_game_space_trash_entry(void *parameter)
{
    st_Step(y, /* is_auto_fire */ 0, /* is_fire */Cy_GPIO_Read(GPIO_PRT1, CYBSP_USER_BTN_PIN));
    u8g2_FirstPage(&u8g2);
    do
    {
      st_Draw(0);
    } while( u8g2_NextPage(&u8g2));

    if (read_cap_bt1()) {
      y++;
    }

    if (read_cap_bt2() ) {
      y--;
    }

}

程序只需少部分修改即可实现如下效果

<iframe src="https://player.bilibili.com/player.html?isOutside=true&aid=114456164048095&bvid=BV1cuVrzvEAE&cid=29810558514&p=1&danmaku=0" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>

心得

完成以上步骤后,就可以得到一个基于PSoC 4000T和OLED12864的小型SpaceTrash游戏。这个项目让我对于按键传感器应用更加熟悉,DIY相对简单,以后可以扩展成更复杂的应用,比如增加分数统计、等级提升等功能。

使用特权

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

本版积分规则

4

主题

11

帖子

1

粉丝