基于stm32、0.96寸OLED实现的俄罗斯方块小游戏(详细源码注释

发布者:静心悠然最新更新时间:2019-08-20 来源: eefocus关键字:stm32  96寸OLED  俄罗斯方块小游戏 手机看文章 扫描二维码
随时随地手机看文章

概述:本实验基于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  96寸OLED  俄罗斯方块小游戏 引用地址:基于stm32、0.96寸OLED实现的俄罗斯方块小游戏(详细源码注释

上一篇:基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)
下一篇:stm32之IIC应用实例(AT24C02芯片,硬件和软件方式驱动)

推荐阅读最新更新时间:2024-11-08 07:43

STM32的BootLoader 从SD卡更新固件
1. 前言自从几个月前接触到有Bootloader这回事,就有一种强烈的冲动,想写一个BootLoader出来。很快在飞思卡尔的Cortex-M4单片机上实现,已经是好几个月前的事情了。然后关于BootLoader的事搁在一边好久了,这次弄个STM32的BootLoader出来,Cortex-M3的,顺便发表下博客,跟大家分享一下。 又过了大半年了吧,慢慢对BootLoader的认识也有点长进啦。特别是跟网友讨论后发现BootLoader的实现还是需要靠BootLoader程序和App程序的配合才能正常使用。在这里特别感谢网友cary_yingj ,对本BootLoader的研究后发现App程序需要重定位中断向量表,才能正常工作。
[单片机]
<font color='red'>STM32</font>的BootLoader 从SD卡更新固件
基于STM32的无线通信模块设计
随着网络和现代通信技术的不断发展,远程无线通信技术经过多年的研究与实际应用,现如今在工业控制领域有了非常重要的地位,并且发挥着越来越大的作用。文中根据厂家的要求,设计的无线通信模块,主要实现了短信与数据收发功能,并且做到了模块的稳定,掉线之后能够自动重连。 1 无线通信模块整体设计方案 模块主要有电源部分、主控部分、通信部分、数据传输部分4个部分组成。通信模块采用SIM900A进行无线通信。主控模块采用STM32作为主控芯片,来控制短信的收发与数据传输的顺利进行。远程终端可以是手机或者上位机的数据中心软件,经过处理之后,储存下来,方便日后的查询。本模块具有低功耗,方便灵活,操作简单并且稳定,掉线之后可以自动连接,运行过程十分稳定,
[单片机]
基于<font color='red'>STM32</font>的无线通信模块设计
STM32基于固件库学习笔记(12)LCD5110显示
前不久使用cc2530写过LCD5110作显示,最近学习stm32就简单的写了,用stm32对lcd5110的初始化及显示功能。 还是和之前写了两种显示的方法: 万能显示(行数要/8,详细见后的数据手册) /* 这个函数可以自己设定显示的内容的大小,需用取模软件得到待显示的数据; 在取模时需注意取模方式,我这里所有的取模都设置是(纵向取模、字节倒序)方式 */ // 设置 X,Y起点; 行(/8)、列大小 数组地址名 void LCD_display(unsigned char X,unsigned char Y,unsigned char row,unsigned char col,unsigned char
[单片机]
<font color='red'>STM32</font>基于固件库学习笔记(12)LCD5110显示
STM32 做为SPI从机,读取数据
背景:有一个项目中,其中一个设备通过SPI接口发送给另外一个设备,但是我需要获取这个设备发送的SPI数据信息 STM32的SPI可以作为master,也可以作为slave,作为slave的例程比较少,今天经过几个小时的折腾,终于把数据获取出来了,经验证和元数据是一致的。现将源代码贴在这里,供有需要的人参考。 硬件连接: STM32(作为从设备) 外部设备 PB12-SPI2-NSS------------ CS PB13-SPI2-SCK------------- CLK PB14-SPI2-MISO----NC PB15_SPI2-MOSI----------- data STM32作为从设备的时候,获取
[单片机]
基于STM32的USB枚举过程学习笔记(三)
上一篇介绍到了主机上电复位USB设备,在控制传输的建立过程,发送了8个字节的数据给设备,这8个字节为0x80 0x06 0x00 0x01 0x00 0x00 0x40 0x00,该请求为USB标准设备请求中的GET_DESCRIPTOR请求。0x80表示标准设备请求,数据方向是设备到主机。0x60表示请求类型GET_DESCRIPTOR。0x01表示描述符类型是设备描述符。0x40表示描述符长度。 设备在收到该请求以后,首先进行解析,根据请求中的0x40表示该控制传输有数据过程,因此进入到Data_Setup0()函数。该函数根据请求的不同描述符,执行不同的回调函数 CopyRoutine(),并在DataStage
[单片机]
基于<font color='red'>STM32</font>的USB枚举过程学习笔记(三)
一个关于STM32定时器的CCR清零话题
今天跟大家分享一个STM32应用开发过程中操作CCR寄存器遇到的小案例,是关于STM32定时器中的捕获寄存器清零的问题。 有人用STM32做输入捕获,在捕获的回调函数里先将捕捉到的CCR值放入缓冲区,然后打算将CCR寄存器清零。结果发现根本清不了。相关代码如下【基于STM32cube库】: voidHAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim- Instance == TIM4) { if (htim- Channel == HAL_TIM_ACTIVE_CHANNEL_1) { ccr_cur =__HAL_TIM_GE
[单片机]
一个关于<font color='red'>STM32</font>定时器的CCR清零话题
stm32专题五:时钟树(二)系统配置时钟函数分析
分析stm32的系统时钟函数,对于我们实现自定义时钟配置非常重要,以下是标准库函数中的时钟配置函数。 static void SetSysClockTo72(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0; /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ /* Enable HSE */ // 使能HSE RCC- CR |= ((uint32_t)RCC_CR_HSEON); /* Wait till HSE is ready
[单片机]
STM32 PWM问题
本文不提供完整程序,仅点出要点 1:时钟配置。因为PWM输出属于复用功能,所以时钟使能必须使能RCC_APB2Periph_AFIO ; 2:IO口使能。因为PWM属于复用功能,所以IO输出设置要配置成GPIO_Mode_AF_PP;而不能配置成普通输出IO的GPIO_Mode_OUT_PP模式; 3:PWM初始化代码如下,本程序只用通道3输出,所以pwm输出只配置了通道3,TIM_OC3Init(TIM3, &TIM_OCInitStructure);需要多通道输出PWM则需要配置多个PWM输出通道,通过改变TIM_Pulse 的值可以改变pwm的占空比(可以通过直接操作寄存器TIM3- CCR3=2400来实现)。 /* Ti
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved