畢設中我使用了奇耘的4.2寸墨水屏,官方的範例代碼給出了一些局部刷新的例子,但是我認爲官方給的代碼太過於簡單實現的功能也不是我想要的,所以對先有的官方的代碼進行了一些改進,讓這一套代碼更適合於我自己的畢業設計。
以下的只有程序思路, 程序還沒有完全的完善,就不放出來 誤導別人了(代碼太爛了)。而且作爲畢業設計的一部分 至少要等我畢業了再開源
首先先分享一下這塊屏幕的特性
這款屏幕的分辨率是400*300 的 DPI是120 看起來顆粒感還行不是那麼的強烈。
屏幕的刷新方式定義成這樣, 我用的是側方向用的屏幕 屏幕的方向設置貌似比較麻煩,我也沒太過深入的瞭解,參數都是一個個實驗找到的、、、、、
這是我的屏幕的方位定義,我的程序的邏輯是這樣的
第一 整個顯示得數據都是在內存中保存的,我在內存中開闢了一個15000(300*400/8)byte的數組,這個數組用於保存各個點的bit信息,在進行 字符顯示的時候我就向指定的內存地址寫入新的數據,然後執行全屏刷新操作(這裏是針對全屏刷新)
當進行局部刷新的時候,我們的墨水屏驅動器需要我們輸入以前的數據然後再輸入最新的數據以此來達到局部刷新的目的。
(我猜測是需要前後的數據去進行對比,決定翻轉哪一些墨水顆粒)
在這種背景下,我設計了兩個函數
這兩個函數的作用很簡單,就是設置一個點的 bit值到指定的位置或者是獲取一個點的bit值(這裏提一嘴,這個算法肯定有更優化的辦法,比如一次操作8個bit 但是我爲了減少邏輯複雜度就直接採用了這個笨的辦法,一次只讀或者寫一個bit ),這兩個函數就是整個系統的一個對外的接口,我們可以很輕易的把以前的 OLED顯示函數遷移過來(其實我就是這麼幹的),一次只設置一個點的值
通過這樣的操作 我可以很簡單的寫出我自己的墨水屏相關的顯示函數,畢竟各種字符 圖片本質都是一個個點陣。
相比較於OLED的程序而言,墨水屏的程序上面添加了一個全局刷新和局部刷新的概念, 而又因爲局部刷新我需要向墨水屏的驅動芯片提供先前的顯示內容所以操作有有了一點點的不同
這一部分我的操作是這樣的 : 第一步: 聲明一個數組 然後將你要修改的區域 的數據讀到一個數組(p_Before[xxx])裏面去(數據其實是保存在內部的內存 數組中, 就是數據從數組搬到另一個數組) 這裏用到get point 函數 而且爲了程序儘可能簡單 我還對 Y座標進行了 對8取整 ,
然後修改顯示內容,這一步還是set point函數, 使用Set_point() 函數 我們直接對內部的顯存進行修改, 然後再次調用 EPD_COPY_AREA() 這個函數,將最新的數據數組提取出來
;然後 設置好參數 主要是刷新的區域的起始點座標 然後就是 兩次提取出來的數組的信息
void EPD_partial_display(u16 x_start,u16 x_end,u16 y_start,u16 y_end ,const unsigned char *old_data,const unsigned char *new_data,unsigned char mode)
這樣就可以完成局部的刷新了。
我們現在可以實現以上的兩個功能之後就可以進行 應用層的代碼的開發了。比如我們需要顯示 字符,那麼就是將以前的 OLED的畫點的操作轉移到 EPD上面來實現,至於是全局刷新還是局部刷新就是上面哪兩個函數來負責的全局刷新就直接等所有的數據更新完 在向 EPD 發送一次數據, 如果是局部刷新就先提取刷新區域的數據,在更新顯存,再次提取,然後就將兩次的數據發送給EPD。 有了字符顯示函數 那麼數字顯示也就不是問題了
這是OLED的數字顯示,本質就是 將數字轉化成字符串,然後調用字符串顯示函數。
顯示中文的話需要有中文的字庫支持,方法也是大同小異 判斷文字是什麼,找字庫數據,對應數據去進行畫點
代碼我就暫時不分享了,寫的太爛了,而且對很多的原理也做不到真正的理解 望見諒。 如果您剛好也在開發這款屏幕可以留言交流一下