概述:
本项目基于 正点原子mini(stm32f103RCT6) 2.8 寸的 ALIENTEK TFTLCD 模块 二轴摇杆模块 的俄罗斯方块小游戏。(学习过程中的项目自测)
我的问题总结:
1.随机数生成我是用RTC的时钟自己写的,用srand+rand 只能生成一次。
2.并行程序(有什么更好的方法)。
3.觉得我哪里需要改进或者有什么见解可以评论私信。
4.需要全部程序联系我吧(不知道咋上传)。
硬件方面:
二轴摇杆模块:由两个变阻器和一个弹性按键组成,通过2个模拟输入和1个数字输入来判断摇杆的状态。
LCD 模块:TLCD 模块采用 16 位的并方式与外部连接。
单片机内核:stm32f103RCT6(正点原子的mini)。
硬件确定后,摇杆模块用杜邦线连接(因为是借的弹性按键没用了所以只用了ROX,ROY),LCD模块插在对应位置(因为都是正点原子的模块)。下图是相关引脚说明
软件方面:
分成三部分:摇杆模块模拟输入的状态获取 lcd的显示 俄罗斯方块运行的部分
随机数部分:
获取RTC的时钟再进行随机数的生成。(处理的不好待优化)
摇杆模块模拟输入的状态获取 :
如上图的通过ADC1获取PA3,PA4的ROX与ROY的姿态。
lcd的显示:
主要分成两块:icd的初始化(驱动器ILI9241初始化) icd画点
初始化:对LCD用到的引脚初始化:PC6-PC10 PB0-PB15
ILI9341:通过对其写命令设定LCD的相关参数~参考ILI9341的使用手册
icd画点:
完成画点后再对其进行扩展:我用到画矩形和画⚪。
俄罗斯方块运行的部分:
在俄罗斯方块部分流程图如下:
在LCD和摇杆部分则是之前两个部分的扩展,主要分析后面4个部分。
移动部分:以下是生成和清除一个块并在数组中置位。
void Display_1Block(u16 x,u16 y,u8 r){ //生成一个块 两个之间x,y相差11 内存置位
POINT_COLOR=BLACK;
LCD_Draw_Circle(x,y,r);
LCD_Draw_Circle(x,y,r-1);
LCD_Draw_Circle(x,y,r-2);
LCD_Draw_Circle(x,y,r-3);
LCD_DrawLine(x-(u16)r,y-(u16)r,x-(u16)r,y+(u16)r);
LCD_DrawLine(x-(u16)r,y-(u16)r,x+(u16)r,y-(u16)r);
LCD_DrawLine(x+(u16)r,y+(u16)r,x-(u16)r,y+(u16)r);
LCD_DrawLine(x+(u16)r,y+(u16)r,x+(u16)r,y-(u16)r);
Save_Set_thedata(x,y);
}
void Display_1Block_Reset(u16 x,u16 y,u8 r){ //生成一个块 两个之间x,y相差11 内存复位
POINT_COLOR=WHITE;
LCD_Draw_Circle(x,y,r);
LCD_Draw_Circle(x,y,r-1);
LCD_Draw_Circle(x,y,r-2);
LCD_Draw_Circle(x,y,r-3);
LCD_DrawLine(x-(u16)r,y-(u16)r,x-(u16)r,y+(u16)r);
LCD_DrawLine(x-(u16)r,y-(u16)r,x+(u16)r,y-(u16)r);
LCD_DrawLine(x+(u16)r,y+(u16)r,x-(u16)r,y+(u16)r);
LCD_DrawLine(x+(u16)r,y+(u16)r,x+(u16)r,y-(u16)r);
Save_Reset_thedata(x,y);
}
在完成一个块的生成与清除后,移动和翻转则是同理(需要确定number~块的种类 state~块的翻转):
之后则要实时确定块的状态(stopway)
确定完mode~块的种类 state~块的翻转 stopway~块的状态 hand~摇杆状态开始移动:
特殊状态检测(满行清除回补与越界退出):
在每一次生成下一个随即块前,检前测数组的每一行是否满
在每一次生成随机块后,检测警戒线行上是否有被置位
u8 Check_One_Line(u8 y){ //判断一行是否满 return:1~~~满了
u8 i;
for(i=1;i<=18;i++){
if(State_Block[y][i] == 1){
continue;
}
else{
return 0;
}
}
return 1;
}
u8 Check_Line_Fail(void){ //判断是否超出警戒线 return : 1~~~没超过 0~~~超过fail
u8 i;
for(i=1;i<=18;i++){
if(State_Block[5][i] == 1){
return 0;
}
else{
continue;
}
}
return 1;
}
综合运行:
将之前的整合在一起
最终结果展示:
文章来源:https://www.toymoban.com/news/detail-479139.html
俄罗斯方块视频文章来源地址https://www.toymoban.com/news/detail-479139.html
到了这里,关于基于STM32 LCD屏实现的俄罗斯方块小游戏(20220522完成 第一个综合类项目)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!