基于STM32的小游戏

您所在的位置:网站首页 恐龙苹果游戏 基于STM32的小游戏

基于STM32的小游戏

2024-01-20 15:51| 来源: 网络整理| 查看: 265

        前言:使用STM32的显示屏其实可以开发出许多有趣的小项目,比如:多功能菜单,小游戏等等。其中,STM32F1XX由于Cortex-M3芯片的性能一般(计算量与内存),所以能够实现的小游戏不多,较为常见的:贪吃蛇,俄罗斯方块,飞机大战等。本文将给大家实现一款较为新颖的小游戏——谷歌小恐龙(Chrome Dino Game)。简单使用0.96寸OLED屏幕搭配STM32F1系列的MCU就可以实现,硬件要求很低。(本游戏代码基于HAL库实现,文末有代码开源)

        实验硬件:STM32F103ZET6;0.96寸OLED;2个KEY按键

        硬件实物图:

        效果图:

引脚连接:

OLED模块:

VCC --> 3.3V

GND --> GND

SCL --> PB10

SDA --> PB11

KEY按键模块:

KEY0 --> PE3

KEY1 --> PE4

注意:这里按键直接采用了正点原子精英板上的固有按键,自己打板的话,视情况下而定。

一、谷歌小恐龙(Chrome Dino Game)简介

        谷歌小恐龙(Chrome Dino Game)顾名思义是由Google公司首创出来的小游戏。其初始目的为在Google浏览器出现互联网信号丢失时,排解用户等待联网信号时的无聊难受。

        这个游戏的最大优点是它可以在没有互联网的情况下玩。这是Chrome浏览器中一款原始的无止境跑步游戏。主角是一只可爱的霸王龙,它在古老的沙漠中小跑。当然,恐龙游戏有它的目的:避免仙人掌和翼手龙。虽然游戏看起来很简单,但并不需要很长时间就能变得很难,因为游戏的速度会随着你的进步而不断提高。

        本文就以谷歌小恐龙(Chrome Dino Game)游戏为原型,使用STM32于0.96寸OLED屏幕上尽可能地复现了谷歌小恐龙游戏。

谷歌小恐龙(Chrome Dino Game)实机效果:

 原游戏网址:谷歌小恐龙在线 - 免费玩谷歌小恐龙 (dino.zone)

二、OLED简介

        关于OLED的使用与原理不熟悉的笔者欢迎去笔者另一篇文章学习,由于篇幅问题,这里就不过多讲诉。

【强烈推荐】基于stm32的OLED各种显示实现(含动态图)_混分巨兽龙某某的博客-CSDN博客_oled显示stm32icon-default.png?t=M666https://blog.csdn.net/black_sneak/article/details/125418537?spm=1001.2014.3001.5501

三、KEY按键

        开发板上除了有经典的流水灯之外,还有一个必备的练习硬件--按键(key)。

        正常地独立按键KEY其实使用很简单,就是基于GPIO引脚的读取操作。唯一需要注意的点:按键按下去之后到底时低电平还是高电平。

        笔者这里直接使用了正点原子精英版STM32上的按键KEY,按键原理图如下:

        考虑到本次小游戏只使用2个按键KEY,这里取KEY0和KEY1。KEY0和KEY1按下后为低电平有效。(这里读者朋友可以根据实际情况去设置)

四、CubeMX配置

1、RCC配置外部高速晶振(精度更高)——HSE;

2、SYS配置:Debug设置成Serial Wire(否则可能导致芯片自锁);

 3、I2C2配置:这里不直接使用CubeMX的I2C2,使用GPIO模拟(PB10:CLK;PB11:SDA)

4、KEY按键配置:PE3与PE4设置为端口输入(开发板原理图)

5、时钟树配置:

6、工程配置 

五、代码讲解 5.1 OLED驱动代码

        此部分OLED的基本驱动函数,笔者使用的是I2C驱动的0.96寸OLED屏幕。所以,首先需要使用GPIO模拟I2C通讯。随后,使用I2C通讯去驱动OLED。(此部分代码包含了屏幕驱动与基础显示,如果对OLED显示不太理解的朋友可以去看看上文提到的笔者的另一篇文章)

oled.h:

#ifndef __OLED_H #define __OLED_H #include "main.h" #define u8 uint8_t #define u32 uint32_t #define OLED_CMD 0 //写命令 #define OLED_DATA 1 //写数据 #define OLED0561_ADD 0x78 // OLED I2C地址 #define COM 0x00 // OLED #define DAT 0x40 // OLED #define OLED_MODE 0 #define SIZE 8 #define XLevelL 0x00 #define XLevelH 0x10 #define Max_Column 128 #define Max_Row 64 #define Brightness 0xFF #define X_WIDTH 128 #define Y_WIDTH 64 //-----------------OLED IIC GPIO进行模拟---------------- #define OLED_SCLK_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET) //GPIO_ResetBits(GPIOB,GPIO_Pin_10)//SCL #define OLED_SCLK_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET) //GPIO_SetBits(GPIOB,GPIO_Pin_10) #define OLED_SDIN_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_RESET) // GPIO_ResetBits(GPIOB,GPIO_Pin_11)//SDA #define OLED_SDIN_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET) // GPIO_SetBits(GPIOB,GPIO_Pin_11) //I2C GPIO模拟 void IIC_Start(); void IIC_Stop(); void IIC_WaitAck(); void IIC_WriteByte(unsigned char IIC_Byte); void IIC_WriteCommand(unsigned char IIC_Command); void IIC_WriteData(unsigned char IIC_Data); void OLED_WR_Byte(unsigned dat,unsigned cmd); //功能函数 void OLED_Init(void); void OLED_WR_Byte(unsigned dat,unsigned cmd); void OLED_FillPicture(unsigned char fill_Data); void OLED_SetPos(unsigned char x, unsigned char y); void OLED_DisplayOn(void); void OLED_DisplayOff(void); void OLED_Clear(void); void OLED_On(void); void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size); u32 oled_pow(u8 m,u8 n); void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2); void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size); #endif

oled.c:

#include "oled.h" #include "asc.h" //字库(可以自己制作) #include "main.h" /********************GPIO 模拟I2C*******************/ //注意:这里没有直接使用HAL库中的模拟I2C /********************************************** //IIC Start **********************************************/ void IIC_Start() { OLED_SCLK_Set() ; OLED_SDIN_Set(); OLED_SDIN_Clr(); OLED_SCLK_Clr(); } /********************************************** //IIC Stop **********************************************/ void IIC_Stop() { OLED_SCLK_Set() ; OLED_SDIN_Clr(); OLED_SDIN_Set(); } void IIC_WaitAck() { OLED_SCLK_Set() ; OLED_SCLK_Clr(); } /********************************************** // IIC Write byte **********************************************/ void IIC_WriteByte(unsigned char IIC_Byte) { unsigned char i; unsigned char m,da; da=IIC_Byte; OLED_SCLK_Clr(); for(i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3