




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
STM32课程设计贪吃蛇D第第课程设计任务要求本次的课程设计目的是实现一个经典的贪吃蛇游戏,整个游戏实现功能分别为:1、初始化程序。2、随机红点、左转、右转、判断边框。系统硬件设计硬件设计原理图根据此硬件设计图再结合软件设计就能做出此游戏。系统软件实现此次的课程设计在于开发个贪吃蛇游戏,其流程图如下图所示。程序流程图为方便介绍,此软件实现只给出主要程序部分:1、本例程提供了硬件平台的初始化GPIO是常规输入/输出端口,STM32F103RCT6有PA、PB、PC、PD、PE共5个16位的GPIO。STM32的GPIO都可编程,具有很多复用功能。GPIO可以配置为很多总模式,这些模式有:输入浮空、输入上拉、输入下拉、模拟输入、开漏输入、推挽输出、推挽复用、开漏复用。通过对GPIO寄存器编程,可以设置每个端口的工作模式。24C02EEPROM是开发板板载的2Kbit(256个字节)EEPROM,型号为:24C02,用于掉电数据保存。因为STM32内部没有EEPROM,所开发板外扩了24C02,用于存储重要数据,用来做IIC实验,该芯片直接挂在STM32的IO口上。IIC(Inter-IntegratedCircuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。IIC总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。/*********************************************************************名称:AT24CXX_Init(void)*功能:初始化IIC接口********************************************************************///初始化IIC接口voidAT24CXX_Init(void){ IIC_Init();}voidIIC_Init(void){ GPIO_InitTypeDefGPIO_InitStructure; //RCC->APB2ENR|=1<<4;//先使能外设IOPORTC时钟 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStructure); IIC_SCL=1; IIC_SDA=1;}/********************************************************************名称:voidCMLCD_Init(void)*功能:初始化触摸屏的硬件接口********************************************************************/voidCMLCD_Init(void){ GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能PORTC时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_3|GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//设置成推免输出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStructure);//初始化GPIOC0313 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_1;//初始化GPIOC21 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStructure); TPEN=1;}2、贪吃蛇功能控制SPI是串行外设端口,是一种同步串行外设端口,它可以使MCU与各种外围设备以串行方式进行通信、交换信息。STM32的SPI支持全双工同步传输,可选择以8或16位传输帧格式进行传输,支持多种模式。USART为STM32的同步异步接收器。它提供了一种灵活的方法与使用异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。另外,它还允许多处理器通信。USART也可以使用DMA方式直接将接受的数据存储到内存或从内存中批量发送数据,也支持多种中断方式。TFT-LCD即薄膜晶体管液晶显示器。其英文全称为:ThinFilmTransistor-LiquidCrystalDisplay。TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD也被叫做真彩液晶显示器。ALIENTEK提供的2.8寸TFTLCD模块,其驱动芯片有很多种类型,比如有:ILI9341/ILI9325/RM68042/RM68021/ILI9320/ILI9328/LGDP4531/LGDP4535/SPFD5408/SSD1289/1505/B505/C505/NT35310/NT35510等。LED(DS0和DS1)。其电路在ALIENTEKMiniSTM32开发板上默认是已经连接好了的。DS0接PA8,DS1接PD2。/*********************************************************************名称:intmain(void)*功能:主函数********************************************************************/#include"led.h"#include"delay.h"#include"sys.h"#include"usart.h"#include"lcd.h"#include"tanchishe.h"#include"cmlcd.h"#include"timeit.h"#include"stdlib.h"//画一个大点(2*2的点) //x,y:坐标//color:颜色voidTP_Draw_Big_Point(u16x,u16y,u16color){ POINT_COLOR=color; LCD_DrawPoint(x,y);//中心点 LCD_DrawPoint(x+1,y); LCD_DrawPoint(x,y+1); LCD_DrawPoint(x+1,y+1); } intmain(void){ u8sta,sta1; u16rand_color; delay_init(); //延时函数初始化 uart_init(9600); //串口初始化为9600 LED_Init(); //初始化与LED连接的硬件接口 LCD_Init(); time_init(); CMLCD_Init();//触摸屏初始化 AT24CXX_Init();//eeprom初始化 sta1=TP_Get_Adjdata(); if(!sta1) { sta=CMLCD_Adjust(); if(sta) { TP_Save_Adjdata();//校准成功就保存参数 LCD_ShowString(40,40,100,16,16,"SUCCESSFUL!"); } else { LCD_ShowString(40,40,100,16,16,"NOSUCCESSFUL!"); } } TABCHISHE_Init(); while(1) { delay_ms(500);//产生随机坐标 if(snake.eat_sta) { snake.eat_sta=0; snake.rand_x=8*(1+(int)(29.0*rand()/(RAND_MAX+1.0))); snake.rand_y=8*(1+(int)(34.0*rand()/(RAND_MAX+1.0))); rand_color=LCD_ReadPoint(snake.rand_x,snake.rand_y); while(rand_color==BLUE)//随机点不能是蛇身上的点 { snake.rand_x=8*(1+(int)(29.0*rand()/(RAND_MAX+1.0))); snake.rand_y=8*(1+(int)(34.0*rand()/(RAND_MAX+1.0))); rand_color=LCD_ReadPoint(snake.rand_x,snake.rand_y); }LCD_Fill(snake.rand_x,snake.rand_y,snake.rand_x+snake.size,snake.rand_y+snake.size,RED); } LED0=!LED0; TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);//关中断防止中断服务函数对显示坐标的影响 snake.eat_sta=show(snake.d1); disappear(snake.d2,turn); TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//开中断 }}/********************************************************************名称:voidTABCHISHE_Init(void)*功能:贪吃蛇初始化********************************************************************/voidTABCHISHE_Init(void){ Shuzu_Init(turn);//转向数组初始化 LCD_Clear(WHITE); POINT_COLOR=RED; LCD_DrawLine(0,282,240,282); LCD_DrawLine(120,280,120,320); LCD_ShowString(20,290,72,12,12,"left/down"); LCD_ShowString(20,303,36,12,12,"score:"); LCD_ShowString(140,290,64,12,12,"right/up"); //以下为贪吃蛇程序初始化 LCD_Fill(120,160,136,168,BLUE);//一开始蛇长度为2个SIZE snake.eat_sta=0; snake.length=2; LCD_ShowxNum(56,303,snake.length,3,12,0x80); snake.max=MAX; snake.size=8; snake.d1=0; snake.d2=0; snake.x1=128;snake.x2=snake.x1+snake.size;snake.y1=160;snake.y2=snake.y1+snake.size;snake.X1=112;snake.X2=snake.X1+snake.size;snake.Y1=160;snake.Y2=snake.Y1+snake.size; snake.rand_x=8*(1+(int)(29.0*rand()/(RAND_MAX+1.0))); snake.rand_y=8*(1+(int)(34.0*rand()/(RAND_MAX+1.0)));LCD_Fill(snake.rand_x,snake.rand_y,snake.rand_x+snake.size,snake.rand_y+snake.size,RED);}/********************************************************************名称:voiddisappear(u8d,u16turn[MAX][3])*功能:贪吃蛇移动尾部消失格子********************************************************************///新消失的一格//参数:往左消失,往右消失voiddisappear(u8d,u16turn[MAX][3]){ inti=0; if(d==0)//默认方向为从左到右 { snake.X1=snake.X1+snake.size;snake.X2=snake.X2+snake.size; LCD_Fill(snake.X1,snake.Y1,snake.X2,snake.Y2,WHITE);//新显示的一格 } elseif(d==1)//方向为下到上 { snake.Y1=snake.Y1-snake.size;snake.Y2=snake.Y2-snake.size; LCD_Fill(snake.X1,snake.Y1,snake.X2,snake.Y2,WHITE);//新显示的一格 } elseif(d==2)//方向为右到左 { snake.X1=snake.X1-snake.size;snake.X2=snake.X2-snake.size; LCD_Fill(snake.X1,snake.Y1,snake.X2,snake.Y2,WHITE);//新显示的一格 } elseif(d==3)//方向为上到下 { snake.Y1=snake.Y1+snake.size;snake.Y2=snake.Y2+snake.size; LCD_Fill(snake.X1,snake.Y1,snake.X2,snake.Y2,WHITE);//新显示的一格 } for(i=0;i<MAX;i++)//先判断是否是转方向点 { if(snake.X1==turn[i][0]&&snake.Y1==turn[i][1]) { snake.d2=turn[i][2]; turn[i][0]=400; //转向完毕清除记录的坐标(将坐标变为LCD以外区域) turn[i][1]=400; break; } } }/********************************************************************名称:u8show(u8d)*功能:贪吃蛇移动前部新增格子********************************************************************///新显示的一格//参数:往左显示,往右显示u8show(u8d){ staticu8i=0; u16color,color1; //判断是否撞到自己的身体 if(d==0) { color=LCD_ReadPoint(snake.x2+4,snake.y2-4); color1=LCD_ReadPoint(snake.x2+3,snake.y2-3); if(color==BLUE&&color1==BLUE) { LCD_ShowString(40,40,100,16,16,"NOSUCCESSFUL!"); printf("color%xcolor1%x\r\n",color,color1); printf("shezhuangziji0\r\n"); delay_ms(5000); TABCHISHE_Init(); d=snake.d1; } } elseif(d==1) { color=LCD_ReadPoint(snake.x1+4,snake.y1-4); color1=LCD_ReadPoint(snake.x1+3,snake.y1-3); if(color==BLUE&&color1==BLUE) { LCD_ShowString(40,40,100,16,16,"NOSUCCESSFUL!"); printf("color%xcolor1%x\r\n",color,color1); printf("shezhuangziji1%d%d%d\r\n",snake.d1,snake.d2,d); delay_ms(5000); TABCHISHE_Init(); d=snake.d1; printf("%d%d%d\r\n",snake.d1,snake.d2,d); } } elseif(d==2) { color=LCD_ReadPoint(snake.x1-4,snake.y1+4); color1=LCD_ReadPoint(snake.x1-3,snake.y1+3); if(color==BLUE&&color1==BLUE) { LCD_ShowString(40,40,100,16,16,"NOSUCCESSFUL!"); printf("color%xcolor1%x\r\n",color,color1); printf("shezhuangziji2\r\n"); delay_ms(5000); TABCHISHE_Init(); d=snake.d1; } } elseif(d==3) { color=LCD_ReadPoint(snake.x2-4,snake.y2+4); color1=LCD_ReadPoint(snake.x2-3,snake.y2+3); if(color==BLUE&&color1==BLUE) { LCD_ShowString(40,40,100,16,16,"NOSUCCESSFUL!"); printf("color%xcolor1%x\r\n",color,color1); printf("shezhuangziji3\r\n"); delay_ms(5000); TABCHISHE_Init(); d=snake.d1; } } if((snake.y1==0&&d==1)||(snake.x1==0&&d==2)||(snake.y2==280&&d==3)||(snake.x2==240&&d==0))//蛇撞到墙了 { LCD_ShowString(40,40,100,16,16,"NOSUCCESSFUL!"); printf("shezhuangqiang\r\n"); delay_ms(5000); TABCHISHE_Init(); d=snake.d1; } if(snake.rand_x==snake.x1&&snake.rand_y==snake.y1)//判断是否增加长度即碰到随机点 { i=1; if(snake.d2==0) {snake.X1-=16;snake.X2-=16;}//在尾端增加一格 elseif(snake.d2==1) {snake.Y1+=16;snake.Y2+=16;} elseif(snake.d2==2) {snake.X1+=16;snake.X2+=16;} elseif(snake.d2==3) {snake.Y1-=16;snake.Y2-=16;} snake.length++; LCD_ShowxNum(56,303,snake.length,3,12,0x80); } if(d==0)//默认方向为从左到右 { snake.x1=snake.x1+snake.size;snake.x2=snake.x2+snake.size; LCD_Fill(snake.x1,snake.y1,snake.x2,snake.y2,BLUE);//新显示的一格 } elseif(d==1)//方向为下到上 { snake.y1=snake.y1-snake.size;snake.y2=snake.y2-snake.size; LCD_Fill(snake.x1,snake.y1,snake.x2,snake.y2,BLUE);//新显示的一格 } elseif(d==2)//方向为右到左 { snake.x1=snake.x1-snake.size;snake.x2=snake.x2-snake.size; LCD_Fill(snake.x1,snake.y1,snake.x2,snake.y2,BLUE);//新显示的一格 } elseif(d==3)//方向为上到下 { snake.y1=snake.y1+snake.size;snake.y2=snake.y2+snake.size; LCD_Fill(snake.x1,snake.y1,snake.x2,snake.y2,BLUE);//新显示的一格 } if(i==1) { i=0;return1;} return0;} /********************************************************************名称:voidCM_Scan()*功能:触摸屏扫描函数********************************************************************/voidCM_Scan(){ staticu8times=0; staticu8i=0; if(TPEN==0&&!times) { times=1; if(CMLCD_GetLCD())//取坐标成功后再选择是否转向 { if(cmlcdxy.X>=0&&cmlcdxy.X<=120&&cmlcdxy.Y>=280&&cmlcdxy.Y<=320) { if(snake.d1==0||snake.d1==2) snake.d1=3; elseif(snake.d1==1||snake.d1==3)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025太阳能槽式复合抛物面聚光集热土壤储热技术
- 个人劳动法权益保障合同
- 个人抵押借款担保合同
- 分期付款购买机动车合同书
- 医疗器械药品购销合同
- 医院场地租赁合同书样本
- 五金电器销售合同6篇
- 2025年红河b2货运上岗证模拟考试
- 合同范本销售人员聘用合同7篇
- 面板自动检测机竞争策略分析报告
- 中建分供方资源管理办法
- (人教PEP2024版)英语一年级上册Unit 3 教学课件(新教材)
- 小小演说家演讲技巧教学设计
- 住院患者跌倒、坠床、压力性损伤的风险评估及管理
- 2024移动电源车运维管理技术规范柴油机类
- 2024年中国端侧大模型行业研究:算力优化与效率革命+如何重塑行业生态-22正式版
- 学校临聘人员规范管理自查报告
- (高清版)DB37T 5271-2024 建设工程造价指标采集与发布标准
- 投诉法官枉法裁判范本
- 食材配送服务方案投标方案(技术方案)
- 新能源充电桩安全管理与防护
评论
0/150
提交评论