使用STM32和freeRTOS實現《貪吃蛇》

2021-10-01 17:25:13 字數 1593 閱讀 3291

本專案使用stm32cubemx生成基本配置**,再編寫實現功能的**。最終實現的貪吃蛇功能有:按鍵控制方向,隨機食物重新整理,撞牆結束,吃食物加分並變長。效果如下圖:

使用的硬體為正點原子戰艦v3開發板,晶元為stm32f103zet6,顯示屏為2.8寸lcd螢幕,驅動晶元為ili9431。

按鍵任務:讀取按鍵值,將對應值寫入佇列。

void startkeytask(void *argument)

keystate=hal_gpio_readpin(gpioe, key_down_pin); //pe3=keydown, 上拉

if (keystate==gpio_pin_reset) //keydown 是低輸入有效

keystate=hal_gpio_readpin(gpioe, key_left_pin); //pe4=keyleft, 上拉

if (keystate==gpio_pin_reset) //keyleft 是低輸入有效

keystate=hal_gpio_readpin(gpioa, key_up_pin); //pa0=keyup, 下拉

if (keystate==gpio_pin_set) //keyup 是高輸入有效

// flag++;

vtaskdelay(pdms_to_ticks(10)); //進入阻塞狀態

} /* user code end startkeytask */

}

顯示任務:從佇列中讀按鍵值,由按鍵值控制「蛇」的動作,程式控制,顯示「食物」和「蛇」。

建立兩個陣列,乙個用於存放「食物」座標,另乙個用於存放「蛇頭」座標,任務執行週期為100ms,每次執行任務時,首先擦除上次所畫的「蛇」,然後根據按鍵值確定的方向確定這個週期所畫的「蛇頭」位置,最後更新「蛇頭」位置,本次「蛇頭」位置為下次「蛇身」第二塊位置。

void startdisplaytask(void *argument)

else if(task_mode==2)

else

}switch(dir)

if((x[0]==foodx[node])&&(y[0]==foody[node]))

else

lcd_fill(foodx[node]-10,foody[node]-10,foodx[node]+10,foody[node]+10,red);

}else if((x[0]<=10)||(x[0]>=240-10)||(y[0]<=10)||(y[0]>=320-50))

for(int j=0;j=0;i--)

}vtaskdelay(pdms_to_ticks(100));

} /* user code end startdisplaytask */

}

完整的工程檔案在我的資源中,有需要的可取。

STM32使用小結

1 韌體庫函式組織規則 stm32韌體庫使用手冊的中文翻譯版 系統 源程式檔案和標頭檔案命名都以 stm32f10x 作為開頭,例如 stm32f10x conf.h。常量僅被應用於乙個檔案的,定義於該檔案中 被應用於多個檔案的,在對應標頭檔案中定義。所有常量都由英文本母大寫書寫。暫存器作為常量處理...

STM32開發 patch生成和使用

領導給我乙個.patc 件,去打一下patch!emmmm,有點懵。不是說不知道,其實在linux下有用到過的。參看 如何製作linux的patc 件及如何打patch but,那麼該如何通過git命令生成patch和打patch?開始講解!首先你的了解一下什麼時候patch?參看 維基百科 pat...

預熱2 什麼是STM32?認識STM32

1 什麼是stm32 stm32是由arm公司設計,意法半導體 st 公司生產的基於 arm cortex m 核心的32 位的mcu 系列。2 stm32能做什麼?stm32 屬於乙個微控制器,適用於控制類,自帶了各種常用通訊介面,比如 usart i2c spi 等,可接非常多的感測器,可以控制...