STM32F103 嵌入式系統 LCD 電阻液晶顯示屏應用 《迷盤》 程序實現講解 創意繪圖

一、系統分析與總體設計

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” 提供 觸摸位置數據

 

3.2.2 模式設計

提供(也就是這個LCD屏幕左上角的選擇個數——5個)

點擊即可刷新屏幕,並且繪製對應分隔線,即調用Load_Drow_Dialog()

所有模式選擇其實只是對一個flag變量的判斷

各個flag值對應的模式

上圖繪製分割線

模式加載通過flag 所以繪圖的邏輯也是根據flag 來判斷的

繪製曲線軌跡函數

其中,九部對稱繪圖 的方法有別於其他有規則角度對稱的方式,完全利用三角函數來計算,九部分軌跡座標,特附上草稿紙一張——

可以看到用了比例關係,計算每條分割線的起始點座標

利用了  一個圓上一點,旋轉40度(360/9)之後的座標,利用三角函數

具體原理——

 

3.2.3數據的初始化工作

  接下來,還需要有一些輔助性的變量來構成相關功能。

其中我本來想用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上好了

地址:

迷盤,對稱的美,學習觸摸、顯示的好教學代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章