1、選題的意義
嵌入式課程是我最接近硬件的一次編程課,我對硬件其實特別感興趣,不過對感興趣的還是屏幕部分,真好,STM32F103 搭載了一塊TFTLCD 電阻觸摸屏,我覺得完全可以利用觸摸屏來做自己想要做的事情,之前玩過一個叫《迷盤》的手機app 那種對稱描繪的感覺我記憶尤深,趁這次機會,來做一個我自己的“迷盤”,在充分學習LCD屏幕 觸摸功能底層代碼的基礎上,實現這些對稱的美。
2、需求分析
Android應用商店下載的 《迷盤》:
一下三張結果圖,最後一張繪製過程圖,需求很簡單,製作並實現這樣一個功能
最後一張爲 繪製過程圖,可以看到有灰色的分割線將手機屏幕分割成若干塊,然後選取顏色,在一個塊中繪圖,其他塊中都會複製相同的軌跡,在上手繪製過程中,這種連續同步鏡像繪製是一種奇妙的體驗。
因爲分辨率的關係,自制的可能沒有那麼細膩,但是功能上都是儘量實現了,包括主題線條描繪功能,顏色的選擇、模式的切換等。
自制《迷盤》:
分別是
中間對稱
四部分對稱
九部分對稱(利用了高等數學知識)
上方一連串的 nine、 two 、 four、 eight RST 分別對應了
九部分、對稱、四部分、把部分、一般 的 繪圖模式。
右下角有一個顏色塊的選擇,用以選取顏色(延遲切換)
3、總體設計
3.1 系統的開發環境
(惠普暗影精靈2代)Intel®i5 6500® 4 2.0GHz,16G內存,1T硬盤 + 128G 固態
Microsoft® Windows™ 10 Professional
Keil 編輯器
3.2 系統總體功能,系統的結構,模塊圖、每個功能的詳細說明
說明: 在原有觸摸功能框架下開發,就是上課桌面上那個主要功能均在“main.c”文件內,觸屏功能、函數集中在“lcd.h”文件內,“touch.c”文件用來測試、實現觸屏功能。
3.2.1 主函數設計
“main.c” 爲主要設計模塊,包含繪圖邏輯、運算、調用繪圖、觸屏函數等。
其中
rtp_test() 函數爲整體繪圖的邏輯
Load_Drow_Dialog() 函數爲界面功能界面加載函數
Load_Color_Block()函數爲界面右下角的顏色選取區域。
其中各種子函數科學組合,形成主體功能。
“lcd.h”提供 繪圖函數
“touch.c” 提供 觸摸位置數據
提供(也就是這個LCD屏幕左上角的選擇個數——5個)
點擊即可刷新屏幕,並且繪製對應分隔線,即調用Load_Drow_Dialog()
所有模式選擇其實只是對一個flag變量的判斷
各個flag值對應的模式
上圖繪製分割線
模式加載通過flag 所以繪圖的邏輯也是根據flag 來判斷的
繪製曲線軌跡函數
其中,九部對稱繪圖 的方法有別於其他有規則角度對稱的方式,完全利用三角函數來計算,九部分軌跡座標,特附上草稿紙一張——
可以看到用了比例關係,計算每條分割線的起始點座標
利用了 一個圓上一點,旋轉40度(360/9)之後的座標,利用三角函數
具體原理——
接下來,還需要有一些輔助性的變量來構成相關功能。
其中我本來想用struct 結構體來記錄點的x,y 座標,但是這個c語言有點奇怪,不能用(。。。。)所以用了指針數組來存儲x,y像個點,其中具體騷操作像這樣
這樣,用一個temp指針循環用九次,每一次通過運算得到一次映射區域的值並進行繪製之後,再賦值給運算函數來計算下一個點。就是這樣。
這個轉40度運算座標的函數——
爲了不引入C語言的math.h庫,我直接用了cos40 和 sin40 的近似值
返回一個包含x,y 值的指針。
其他,2、4、8對稱的,其實只是座標的正負值變化,乏善可陳,直接將所有結果輸出即可
下圖分別,左右對稱、四部分對稱 全部列出即可,當然也可以用上述函數獲得旋轉角度爲90、45的座標。
接下來就是顏色的選擇
一開始我想用文字切換的方式,但當我看了lcd.h 裏的函數之後並且研究一番過後,我發現我可以使一塊指定的區域填充我想要的顏色,而且一個色塊顯示在右下角可能會更明顯一些
這個色塊的繪製函數——
可以看到,這個繪製函數的總體思路是,確定一個矩形區域的左上角、右下角座標 sx\sy\ex\ey
然後獲取這個矩形的寬度、長度 width、height
然後設置一個光標起始點 setCursor(sx,sy+i) 然後用LCD->LCD_RAM 賦值顏色常量值。
因爲,這個 選中光標後,之後的n次循環並賦值LCD_RAM緩存會自動換行,而我們的色塊是在右下角位置,所以需要一行行換,並且每次指定位置,所以每次起點是 sx,sy+i
注意上面的i !!!
然後再之後的 width長度像素點都賦值顏色常量。
這樣效果就是這樣—— 我這裏用了五種顏色可供選擇,點一次切換一次
這樣之後,發現屏幕每次刷新頻率還是挺高的,我的塊點擊換顏色切換太快了,所以用了一個延時切換下一個顏色的函數(其實就是一個while循環)
if 是用來判斷點擊是否在色塊範圍之內。
二、系統的詳細設計
1、繪圖功能的實現
在完成以上所有的交互以及內部數據關聯的運算處理後,最後要將這些數據展現到屏幕上。
圖1.7
2.2繪圖資源的載入與初始化
主要是 LCD_Init()這個函數,是在lcd.c 這個文件內部的——
可以看到這個初始化工作函數有個2000多行,這主要是它首先去判斷了這塊LCD屏幕的型號,並分別有不同的初始化設置,具體不再贅述。
初始化完屏幕,先呈現的是提示信息界面,這個我自己加了幾行。
其中,按板子(STM32F103)上右邊紅色復位鍵顯示,一開始無法顯示屏幕內容的,可能復位才能加載lcd驅動,按復位鍵上面一個key
0按鈕可以進入屏幕測試,類似手機的屏幕測試。
四、系統運行的結果
見第二部分截圖
總結
經過嵌入式系統的這次大作業學習,我對嵌入式編程有了更深入的瞭解,對硬件和軟件的聯繫在認知上又加深了一層,這次作業,又瞭解了lcd屏幕的觸摸交互的過程,和邏輯上的應用,這些其實是對自己編程知識系統的擴充,有趣。
我把資源上傳到csdn上好了
地址: