[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的 焊点进行焊接 。

整体连接很简单

软件框图

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


我们添加按键的驱动
/* 向上 */
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相对简单,以后可以扩展成更复杂的应用,比如增加分数统计、等级提升等功能。