概述:本实验基于stm32最小系统、0.96寸OLED(68*128)和摇杆实现一个经典的俄罗斯方块小游戏。
硬件要求:
普通摇杆,两个电位器和一个开关组成,左右摇动控制一个电位的电压,上下摇动控制另一个电位的电压,并可垂直按下实现一个普通的按键。
0.96寸OLED 单色屏幕,通过spi协议与单片机通信。
stc32f103c8t6最小系统开发板。
上面所用到的器件都可以在淘宝上买到,价格不贵。
器件齐全后,用杜邦线将摇杆和oled正确地连接到stm32开发板上,注意各个器件的电源需要接到同一电压,下图是接线说明:
接好线之后,将源码编译下载,进入调试,正常运行如下图所示,如果屏幕出现花屏,那么将res引脚接到GND进行复位,再重新进行调试或单片机复位:
接着按下摇杆的中键就可以进入游戏:
屏幕的上方显示得分,通过按上键可以将下落方块顺时针旋转90度。
游戏失败后可按下摇杆中键重新开始游戏。
源码文件:
源码下载后用keil4打开,每个文件的作用如下所示:
下面说明main函数:
int main(void)
{
RCC_PCLK1Config(RCC_HCLK_Div4);
USART1_Configuration(); //初始化串口
TIME_Configuration(); //初始化定时器
ADC_Configuration(); //初始化摇杆的ad采集
OLED_Init(); //oled初始化默认参数
GameReady(); //进入游戏准备界面
Tick_Updata(&sysms);
while (1){
event=JoyState(); //获取摇杆的状态
if(If_TimeOut(&sysms,500)){ //500ms自动下移一格
Tick_Updata(&sysms);
event=3;
}
ret=Game_InputHandle(event);//进行方块运动
if(ret){ //ret=1 表示屏幕需刷新
GameMapToLcdCache(); //将像素从游戏图像gamemap位图经过放大后写进LcdCache显存
OLED_Updata();//将LcdCache[8][128]显存的数据发送到屏幕进行显示
sprintf(str,"Score=%d",GameScore);
OLED_DispString(0,0,str); //屏幕上方显示分数
}
}
}
event代表摇杆输入的事件,然后键事件传给GAME函数进行游戏的操作,如果没有摇杆可以用按键代替,一个按键代表一种事件,改写JoyState函数就行了。
这里的GameMapToLcdCache()函数,起到像素放大的作用。
像上图的正方形方块,每一个字节代表一个像素的话会显得很小,所以将其放大,每一个字节代表4*4个像素。
Game_InpueHandle函数的部分截图:
源
源码附带了很多注释以便理解游戏实现的原理。实验还启用了串口1用来输出调试信息,需要的话可以将开发板串口接出来,把上图的PrintfBlock函数注释去掉,在PC上查看串口输出的信息。当然大量的信息输出会影响游戏的响应速度。
串口打印的数据是gamemap数组里的数据,里面的1对应lcd的4*4个像素为1。这样的好处是减少游戏操作时对数据的处理时间,当数据处理完成后再进行放大显示;同时将显示和游戏的实现分离开,有利于提高代码的移植性和可读性。
希望这个简单的实验能给你带来些许乐趣,如果对源码有疑问可以提出来。
上一篇:基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)
下一篇:stm32之IIC应用实例(AT24C02芯片,硬件和软件方式驱动)
推荐阅读最新更新时间:2024-11-08 07:43
设计资源 培训 开发板 精华推荐
- MIKROE-3329,基于 SE97B 温度传感器的 Temp-Log 4 Click Board,带有集成 EEPROM
- 电路显示了在非常快速的 12 位 SAR 转换器中使用的分立前置放大器
- AD8615AUJZ-R2 二阶低通滤波器运算放大器的典型应用电路
- LTC3638EMSE 5V 至 140V 输入至 5V 输出、250mA 降压型稳压器的典型应用电路
- 蓝牙协议分析工具nRF52840 MDK USB Dongle
- REP014: CDMA PA输出功率+28.5dBm时提供-45dBc ACPR
- SiP7818BA 三端固定正电压稳压器的典型应用
- 【物联网】鸿蒙开关
- 具有板载 ADC 和 I2C 的 LTC2945HMS 功率监视器的典型应用
- 使用 Semtech 的 SC1541 的参考设计