STM32 LCD屏实现俄罗斯方块小游戏——第一个综合类项目(20220522完成)

概述:

本项目基于 正点原子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;

}

综合运行:
将之前的整合在一起

 最终结果展示:

俄罗斯方块视频

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 LCD屏实现俄罗斯方块小游戏——第一个综合类项目(20220522完成)

发表评论