STM32課程設(shè)計貪吃蛇_第1頁
STM32課程設(shè)計貪吃蛇_第2頁
STM32課程設(shè)計貪吃蛇_第3頁
STM32課程設(shè)計貪吃蛇_第4頁
STM32課程設(shè)計貪吃蛇_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

STM32課程設(shè)計貪吃蛇D第第課程設(shè)計任務(wù)要求本次的課程設(shè)計目的是實現(xiàn)一個經(jīng)典的貪吃蛇游戲,整個游戲?qū)崿F(xiàn)功能分別為:1、初始化程序。2、隨機紅點、左轉(zhuǎn)、右轉(zhuǎn)、判斷邊框。系統(tǒng)硬件設(shè)計硬件設(shè)計原理圖根據(jù)此硬件設(shè)計圖再結(jié)合軟件設(shè)計就能做出此游戲。系統(tǒng)軟件實現(xiàn)此次的課程設(shè)計在于開發(fā)個貪吃蛇游戲,其流程圖如下圖所示。程序流程圖為方便介紹,此軟件實現(xiàn)只給出主要程序部分:1、本例程提供了硬件平臺的初始化GPIO是常規(guī)輸入/輸出端口,STM32F103RCT6有PA、PB、PC、PD、PE共5個16位的GPIO。STM32的GPIO都可編程,具有很多復(fù)用功能。GPIO可以配置為很多總模式,這些模式有:輸入浮空、輸入上拉、輸入下拉、模擬輸入、開漏輸入、推挽輸出、推挽復(fù)用、開漏復(fù)用。通過對GPIO寄存器編程,可以設(shè)置每個端口的工作模式。24C02EEPROM是開發(fā)板板載的2Kbit(256個字節(jié))EEPROM,型號為:24C02,用于掉電數(shù)據(jù)保存。因為STM32內(nèi)部沒有EEPROM,所開發(fā)板外擴了24C02,用于存儲重要數(shù)據(jù),用來做IIC實驗,該芯片直接掛在STM32的IO口上。IIC(Inter-IntegratedCircuit)總線是一種由PHILIPS公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。它是由數(shù)據(jù)線SDA和時鐘SCL構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù)。在CPU與被控IC之間、IC與IC之間進行雙向傳送,高速IIC總線一般可達400kbps以上。IIC總線在傳送數(shù)據(jù)過程中共有三種類型信號,它們分別是:開始信號、結(jié)束信號和應(yīng)答信號。開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。結(jié)束信號:SCL為高電平時,SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。應(yīng)答信號:接收數(shù)據(jù)的IC在接收到8bit數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的IC發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù)。CPU向受控單元發(fā)出一個信號后,等待受控單元發(fā)出一個應(yīng)答信號,CPU接收到應(yīng)答信號后,根據(jù)實際情況作出是否繼續(xù)傳遞信號的判斷。若未收到應(yīng)答信號,由判斷為受控單元出現(xiàn)故障。/*********************************************************************名稱:AT24CXX_Init(void)*功能:初始化IIC接口********************************************************************///初始化IIC接口voidAT24CXX_Init(void){ IIC_Init();}voidIIC_Init(void){ GPIO_InitTypeDefGPIO_InitStructure; //RCC->APB2ENR|=1<<4;//先使能外設(shè)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;//設(shè)置成推免輸出 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是串行外設(shè)端口,是一種同步串行外設(shè)端口,它可以使MCU與各種外圍設(shè)備以串行方式進行通信、交換信息。STM32的SPI支持全雙工同步傳輸,可選擇以8或16位傳輸幀格式進行傳輸,支持多種模式。USART為STM32的同步異步接收器。它提供了一種靈活的方法與使用異步串行數(shù)據(jù)格式的外部設(shè)備之間進行全雙工數(shù)據(jù)交換。USART利用分?jǐn)?shù)波特率發(fā)生器提供寬范圍的波特率選擇。另外,它還允許多處理器通信。USART也可以使用DMA方式直接將接受的數(shù)據(jù)存儲到內(nèi)存或從內(nèi)存中批量發(fā)送數(shù)據(jù),也支持多種中斷方式。TFT-LCD即薄膜晶體管液晶顯示器。其英文全稱為:ThinFilmTransistor-LiquidCrystalDisplay。TFT-LCD與無源TN-LCD、STN-LCD的簡單矩陣不同,它在液晶顯示屏的每一個象素上都設(shè)置有一個薄膜晶體管(TFT),可有效地克服非選通時的串?dāng)_,使顯示液晶屏的靜態(tài)特性與掃描線數(shù)無關(guān),因此大大提高了圖像質(zhì)量。TFT-LCD也被叫做真彩液晶顯示器。ALIENTEK提供的2.8寸TFTLCD模塊,其驅(qū)動芯片有很多種類型,比如有:ILI9341/ILI9325/RM68042/RM68021/ILI9320/ILI9328/LGDP4531/LGDP4535/SPFD5408/SSD1289/1505/B505/C505/NT35310/NT35510等。LED(DS0和DS1)。其電路在ALIENTEKMiniSTM32開發(fā)板上默認(rèn)是已經(jīng)連接好了的。DS0接PA8,DS1接PD2。/*********************************************************************名稱:intmain(void)*功能:主函數(shù)********************************************************************/#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"http://畫一個大點(2*2的點) //x,y:坐標(biāo)//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(); //延時函數(shù)初始化 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();//校準(zhǔn)成功就保存參數(shù) LCD_ShowString(40,40,100,16,16,"SUCCESSFUL!"); } else { LCD_ShowString(40,40,100,16,16,"NOSUCCESSFUL!"); } } TABCHISHE_Init(); while(1) { delay_ms(500);//產(chǎn)生隨機坐標(biāo) 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);//關(guān)中斷防止中斷服務(wù)函數(shù)對顯示坐標(biāo)的影響 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);//轉(zhuǎn)向數(shù)組初始化 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])*功能:貪吃蛇移動尾部消失格子********************************************************************///新消失的一格//參數(shù):往左消失,往右消失voiddisappear(u8d,u16turn[MAX][3]){ inti=0; if(d==0)//默認(rèn)方向為從左到右 { 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++)//先判斷是否是轉(zhuǎn)方向點 { if(snake.X1==turn[i][0]&&snake.Y1==turn[i][1]) { snake.d2=turn[i][2]; turn[i][0]=400; //轉(zhuǎn)向完畢清除記錄的坐標(biāo)(將坐標(biāo)變?yōu)長CD以外區(qū)域) turn[i][1]=400; break; } } }/********************************************************************名稱:u8show(u8d)*功能:貪吃蛇移動前部新增格子********************************************************************///新顯示的一格//參數(shù):往左顯示,往右顯示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)//默認(rèn)方向為從左到右 { 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()*功能:觸摸屏掃描函數(shù)********************************************************************/voidCM_Scan(){ staticu8times=0; staticu8i=0; if(TPEN==0&&!times) { times=1; if(CMLCD_GetLCD())//取坐標(biāo)成功后再選擇是否轉(zhuǎn)向 { 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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論