在线时间435 小时
UID271205
注册时间2016-10-4
NXP金币5385
TA的每日心情 | 开心 3 小时前 |
---|
签到天数: 946 天 连续签到: 4 天 [LV.10]以坛为家III
金牌会员
 
- 积分
- 7531
- 最后登录
- 2025-7-31
|
开发板上按键不多,又想移植游戏,找到了一个只需要一个按键控制的游戏 —— flappy bird
源码是使用I2C接口的OLED,基于STM32F0系列
一、新建工程,并打开设置I2C1和SW2设置
把源码中相关文件拷入工程,边编译边看看哪些是多余文档,删除。
二、
三、修改OLED关于I2C接口驱动部分
在user_hal_oled.c文件中
- void OLED_WR_Byte(uint8_t dat, uint8_t cmd)
- {
- i2c_master_transfer_t masterXfer;
- masterXfer.slaveAddress = OLED_ADDRESS>>1;
- masterXfer.direction = kI2C_Write;
- masterXfer.subaddress = cmd;
- masterXfer.subaddressSize = 1;
- masterXfer.data = &dat;
- masterXfer.dataSize = 1;
- masterXfer.flags = kI2C_TransferDefaultFlag;
- I2C_MasterSendBlocking(BOARD_I2C_BASEADDR, &masterXfer);
- }
复制代码 这里说明一下I2C_MasterSendBlocking修改自SDK中I2C_MasterTransferBlocking
原函数需要对从设备NAK信号检测,但我的OLED不会响应,需要把检查部分去掉。
四、按键的设置
只保留一个按键,多余的设置全删除
我这里选择UP键,并根据SDK修改接口函数
- uint8_t Get_Key_Up_Level(void)
- {
- return GPIO_PinRead(BOARD_SW2_GPIO, BOARD_SW2_GPIO_PIN);
- }
复制代码 按键响应也进行修改,在user_app_gameFunction.c
- static void BUTTON_CALLBACK(void *para)
- {
- Button *btn = (Button *)para;
- if (GetButtonEvent(btn) == SINGLE_CLICK)
- {
- if ((g_game_state == GAME_OVER) || (g_game_state == GAME_PAUSE))
- {
- g_game_state = GAME_RUN;
- BirdInit();
- PillarInit();
- g_bird_obj.down_hight = 0;
- g_bird_obj.down_time = 0;
- g_game_score = 0;
- GameRun();
- }
- else
- {
- g_bird_obj.y -= BIRD_JUMP_HIGHT;
- g_bird_obj.down_hight = 0;
- g_bird_obj.down_time = 0;
- }
- }
- }
复制代码
五、时间中断
在main.c中增加SysTick,并在中间增加游戏过程定时刷新项
- volatile uint32_t uwTick; // 定义一个记录Tick数的全局变量
- void SysTick_Handler(void) // 中断Handler程序
- {
- if (uwTick != 0U)
- {
- uwTick--; // 每次中断Tick数自减1
- }
- <font color="#ff0000"> Button_Run();
- SoftTimer_Run();
- g_system_ticks ++;</font>
- }
- void SysTick_Delay(uint32_t ms) // 延时函数主体
- {
- uwTick = ms;
- while (uwTick != 0U) // 直到Tick为0时退出
- {
- }
- }
复制代码
六、启动游戏
在main函数主循环前加入GameInit();
七、因为MCU不同,运行速度不同,各种时间也要进行调整,只做了演示,没进行调整。
附上原始代码,有兴趣的可以移植玩玩。
运行效果
|
|