gaoshanmicai 发表于 2025-5-6 00:32

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

本帖最后由 gaoshanmicai 于 2025-5-6 11:22 编辑


# 【英飞凌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的 焊点进行焊接 。
!(data/attachment/forum/202505/06/002458r7tyhv796p12h98x.png "solder.PNG")

整体连接很简单

!(data/attachment/forum/202505/06/002520swbvssz9ndowwdtv.png "zhengtilianj.PNG")

### 软件框图

!(data/attachment/forum/202505/06/002532a2rhxwnyw2hzbeox.png "mu.drawio.png")

框图很简单

### 程序说明

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

!(data/attachment/forum/202505/06/002554mffjnzggyf48knl6.png "addcodes2.PNG")

!(data/attachment/forum/202505/06/002554iit345hz67jiww6s.png "addcode.PNG")

我们添加按键的驱动

```c
/* 向上 */
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 部分需要添加修改的代码

```c
uint8_t u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
static uint8_t buffer;                /* 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 = *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的.然后程序中添加按键逻辑

```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相对简单,以后可以扩展成更复杂的应用,比如增加分数统计、等级提升等功能。

页: [1]
查看完整版本: # 【英飞凌PSOC 4000T DIY】 PSoC 4000T与OLED12864实现SpaceTrash小游戏机