国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

上海手機(jī)網(wǎng)站建設(shè)電話咨詢免費(fèi)二級(jí)域名注冊網(wǎng)站有哪些

上海手機(jī)網(wǎng)站建設(shè)電話咨詢,免費(fèi)二級(jí)域名注冊網(wǎng)站有哪些,網(wǎng)站正在建設(shè)代碼,上海高端工作室網(wǎng)站本篇文章從硬件原理以及嵌入式編程等角度完整的介紹了墨水屏驅(qū)動(dòng)過程,本例涉及的墨水屏為2.9inch e-Paper V2,它采用的是“微膠囊電泳顯示”技術(shù)進(jìn)行圖像顯示,其基本原理是懸浮在液體中的帶電納米粒子受到電場作用而產(chǎn)生遷移,從而改變顯示屏各…

本篇文章從硬件原理以及嵌入式編程等角度完整的介紹了墨水屏驅(qū)動(dòng)過程,本例涉及的墨水屏為2.9inch e-Paper V2,它采用的是“微膠囊電泳顯示”技術(shù)進(jìn)行圖像顯示,其基本原理是懸浮在液體中的帶電納米粒子受到電場作用而產(chǎn)生遷移,從而改變顯示屏各像素點(diǎn)的顏色。

墨水屏的原理決定了它具有很好的穩(wěn)定性,如果電場不改變,粒子就不再運(yùn)動(dòng),也不需要耗電,即使斷電,墨水屏的畫面也能保留,這個(gè)特性使其能作為電子銘牌或價(jià)簽等重復(fù)使用。電子紙顯示屏是靠反射環(huán)境光來顯示圖案的,不需要背光,在環(huán)境光下,電子紙顯示屏清晰可視,可視角度幾乎達(dá)到了 180°。再加上低功耗的特性,電子紙非常適合作為Kindle等電子書閱讀器的顯示屏。

目錄

概念說明

實(shí)現(xiàn)原理

嵌入式程序?

底層硬件接口

中間層墨水屏驅(qū)動(dòng)

上層接口

墨水屏EPD_2IN9_V2驅(qū)動(dòng)Demo


概念說明

我們下面從墨水瓶的產(chǎn)品特點(diǎn),SPI通信時(shí)序,以及像素與字節(jié)的關(guān)系和注意事項(xiàng)這四個(gè)角度來進(jìn)行墨水瓶驅(qū)動(dòng)前的必要概念說明。

  • 產(chǎn)品特點(diǎn):工作電壓為3.3V/5V;通信接口為SPI;分辨率為296*128;顯示顏色為黑、白;灰度等級(jí)為4級(jí);刷新功耗為26.4mW(typ.);休眠電流<0.01uA(接近0);局部刷新時(shí)間為0.6秒;全局刷新時(shí)間為3秒。
  • SPI時(shí)序:采用SPImode0,即CPHA=0,時(shí)鐘線第一個(gè)邊沿采樣;CPOL=0,時(shí)鐘線空閑時(shí)電壓為0;

  • 像素與字節(jié)的關(guān)系:對(duì)于黑白圖片,黑色我們定義成0,白色就定義成1,一個(gè)點(diǎn)在圖形上一般稱之為像素點(diǎn)(pixel),而顏色不是1就是0,也就是1個(gè)位就可以標(biāo)識(shí)顏色:1Pixel = 1bit,那么一個(gè)字節(jié)里面就包含了8個(gè)像素點(diǎn)。以16個(gè)像素點(diǎn)為例,我們假設(shè)前8個(gè)像素點(diǎn)為黑,后8個(gè)像素點(diǎn)為白色,那么可以這么認(rèn)為,像素點(diǎn)1-16,對(duì)應(yīng)這0位到15位,用數(shù)據(jù)可以表示為0x00ff(數(shù)據(jù)存儲(chǔ)若涉及字節(jié)序的問題,stm32為小端存儲(chǔ))。
  • 注意事項(xiàng):不能一直用局刷對(duì)屏幕進(jìn)行刷新,需要在做幾次局刷之后,對(duì)屏幕進(jìn)行一次全刷清屏。否則會(huì)造成屏幕顯示效果異常;屏幕不能長時(shí)間上電,在屏幕不刷新的時(shí)候,要將屏幕設(shè)置成睡眠模式,或者進(jìn)行斷電處理。否則屏幕長時(shí)間保持高電壓狀態(tài),會(huì)損壞膜片,無法修復(fù);使用墨水屏的時(shí)候,建議刷新時(shí)間間隔至少是180s, 并且至少每24小時(shí)做一次刷新,如果長期不使用墨水屏的話,要將墨水屏刷白存放;屏幕的 FPC 排線比較脆弱,請(qǐng)注意:不要沿屏幕垂直方向彎曲排線,避免排線被撕裂;不要反復(fù)過度彎曲排線,避免排線斷裂;不要往屏幕正面方向彎曲排線,避免排線與面板的連接斷開。調(diào)試研發(fā)時(shí)建議固定排線后使用;墨水屏屏幕較為脆弱,注意盡量避免跌落、碰撞、用力按壓;

實(shí)現(xiàn)原理

墨水屏參考電路如下圖,SPI通信以及其他控制引腳與MCU相連,實(shí)現(xiàn)驅(qū)動(dòng)。

涉及的引腳定義如下表。

Pin腳序號(hào)標(biāo)號(hào)名稱功能描述
2GDRN-Channel MOSFET Gate Drive Control
3RESECurrent Sense Input for the Control Loop
8BS1Bus selection pin
9BUSYBusy state output pin
10RES #Reset
11D/C #Data /Command control pin
12CS #Chip Select input pin
13SCLserial clock pin (SPI)
14SDAserial data pin (SPI)

我們常常需要使用墨水屏來顯示既有圖片,我們首先講圖片根據(jù)我們屏幕的像素調(diào)整大小,我們的為296*128,然后我們使用Image2Lc對(duì)圖片進(jìn)行取模,生成圖片數(shù)組,在生成的之前我們需要根據(jù)屏幕分辨率配置最大寬度和高度,根據(jù)微雪示例代碼配置掃描模式為垂直掃描,并配置字節(jié)序等信息,Image2Lc軟件截圖如下。


嵌入式程序?

下面介紹一下微雪提供的例程,了解驅(qū)動(dòng)墨水屏的嵌入式程序邏輯與結(jié)構(gòu)。


底層硬件接口

我們進(jìn)行了底層的封裝,如果需要了解內(nèi)部實(shí)現(xiàn)可以去對(duì)應(yīng)的目錄中查看。在DEV_Config.c(.h)可以看到很多定義,在目錄:Pico_ePaper_Code\c\lib\Config

  • 數(shù)據(jù)類型定義如下:
    #define UBYTE   uint8_t
    #define UWORD   uint16_t
    #define UDOUBLE uint32_t
  • ?模塊初始化與退出處理:
    void DEV_Module_Init(void);
    void DEV_Module_Exit(void);
    //注意:
    //1.這里是處理使用墨水屏前與使用完之后一些GPIO的處理。
  • ?GPIO讀寫:
    void DEV_Digital_Write(UWORD Pin, UBYTE Value);
    UBYTE DEV_Digital_Read(UWORD Pin);
  • ?SPI寫數(shù)據(jù):
    void DEV_SPI_WriteByte(UBYTE Value);

中間層墨水屏驅(qū)動(dòng)

e-paper驅(qū)動(dòng)代碼文件,在目錄:Pico_ePaper_Code\c\lib\e-Paper。

  • 墨水屏初始化,再屏幕開始工作時(shí)和退出睡眠模式之后調(diào)用。其中xxx表示,墨水屏型號(hào)。如是是2.13D,全屏初始化那么是EPD_2IN13D_Init(0),局部刷新初始化EPD_2IN13D_Init(1)。
    //2.13inch e-Paper、2.13inch e-Paper  V2、2.13inch e-Paper (D)、2.9inch e-Paper、2.9inch e-Paper (D)
    void EPD_xxx_Init(UBYTE Mode); // Mode = 0 全局刷新初始化、Mode = 1 局部刷新初始化
    //其他型號(hào)
    void EPD_xxx_Init(void);
  • 清屏,把墨水屏刷成白色。其中xxx表示,墨水屏型號(hào)。如是是2.13D,那么是EPD_2IN9D_Clear()。
    void EPD_xxx_Clear(void);
  • 全局刷新,傳入的圖像為利用上層接口畫圖預(yù)存的圖像。
    //黑白雙色墨水屏
    void EPD_xxx_Display(UBYTE *Image);
    //黑白紅或黑白黃墨水屏
    void EPD_xxx_Display(const UBYTE *blackimage, const UBYTE *ryimage);
  • 進(jìn)入睡眠模式。注意進(jìn)入了睡眠模式,只有兩個(gè)方式能夠重新工作:第一種硬件復(fù)位,第二種重新調(diào)用初始化函數(shù),其中xxx表示,墨水屏型號(hào)。
    void EPD_xxx_Sleep(void);

上層接口

對(duì)于屏幕而言,如果需要進(jìn)行畫圖、顯示中英文字符、顯示圖片等怎么辦,這些都是上層應(yīng)用做的。這有很多小伙伴有問到一些圖形的處理,我們這里提供了一些基本的功能 在如下的目錄中可以找到GUI,在目錄:RaspberryPi_JetsonNano\c\lib\GUI\GUI_Paint.c(.h)。

  • 新建圖像屬性:新建一個(gè)圖像屬性,這個(gè)屬性包括圖像緩存的名稱、寬度、高度、翻轉(zhuǎn)角度、顏色。
    void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color)
    參數(shù):image : 圖像緩存的名稱,實(shí)際上是一個(gè)指向圖像緩存首地址的指針;Width : 圖像緩存的寬度;Height: 圖像緩存的高度;Rotate:圖像的翻轉(zhuǎn)的角度Color :圖像的初始顏色;
  • 選擇圖像緩存:選擇圖像緩存,選擇的目的是你可以創(chuàng)建多個(gè)圖像屬性,圖像緩存可以存在多個(gè),你可以選擇你所創(chuàng)建的每一張圖像。
    void Paint_SelectImage(UBYTE *image)
    參數(shù):image: 圖像緩存的名稱,實(shí)際上是一個(gè)指向圖像緩存首地址的指針;
  • 圖像旋轉(zhuǎn):設(shè)置選擇好的圖像的旋轉(zhuǎn)角度,最好使用在Paint_SelectImage()后,可以選擇旋轉(zhuǎn)0、90、180、270。不同選擇角度下,坐標(biāo)對(duì)應(yīng)起始像素點(diǎn)不同,這里以1.54B為例,四張圖,按順序?yàn)?°, 90°, 180°, 270°。
    void Paint_SetRotate(UWORD Rotate)
    參數(shù):Rotate: 圖像選擇角度,可以選擇ROTATE_0、ROTATE_90、ROTATE_180、ROTATE_270分別對(duì)應(yīng)0、90、180、270度
  • 圖像鏡像翻轉(zhuǎn):設(shè)置選擇好的圖像的鏡像翻轉(zhuǎn),可以選擇不鏡像、關(guān)于水平鏡像、關(guān)于垂直鏡像、關(guān)于圖像中心鏡像。
    void Paint_SetMirroring(UBYTE mirror)
    參數(shù):mirror: 圖像的鏡像方式,可以選擇MIRROR_NONE、MIRROR_HORIZONTAL、MIRROR_VERTICAL、MIRROR_ORIGIN分別對(duì)應(yīng)不鏡像、關(guān)于水平鏡像、關(guān)于垂直鏡像、關(guān)于圖像中心鏡像
  • 設(shè)置點(diǎn)在緩存中顯示位置和顏色:這里是GUI最核心的一個(gè)函數(shù)、處理點(diǎn)在緩存中顯示位置和顏色。
    void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color)
    參數(shù):Xpoint: 點(diǎn)在圖像緩存中X位置Ypoint: 點(diǎn)在圖像緩存中Y位置Color : 點(diǎn)顯示的顏色
  • 圖像緩存填充顏色:把圖像緩存填充為某顏色,一般作為屏幕刷白的作用。
    void Paint_Clear(UWORD Color)
    參數(shù):Color: 填充的顏色
  • 圖像緩存部分窗口填充顏色:把圖像緩存的某部分窗口填充為某顏色,一般作為窗口刷白的作用,常用于時(shí)間的顯示,刷白上一秒。
    void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color)
    參數(shù):Xstart: 窗口的X起點(diǎn)坐標(biāo)Ystart: 窗口的Y起點(diǎn)坐標(biāo)Xend: 窗口的X終點(diǎn)坐標(biāo)Yend: 窗口的Y終點(diǎn)坐標(biāo)Color: 填充的顏色
  • 畫點(diǎn):在圖像緩存中,在(Xpoint, Ypoint)上畫點(diǎn),可以選擇顏色,點(diǎn)的大小,點(diǎn)的風(fēng)格。
    void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_Style)
    參數(shù):Xpoint: 點(diǎn)的X坐標(biāo)Ypoint: 點(diǎn)的Y坐標(biāo)Color: 填充的顏色Dot_Pixel: 點(diǎn)的大小,提供默認(rèn)的8種大小點(diǎn)typedef enum {DOT_PIXEL_1X1  = 1,	// 1 x 1DOT_PIXEL_2X2  , 		// 2 X 2DOT_PIXEL_3X3  , 	 	// 3 X 3DOT_PIXEL_4X4  , 	 	// 4 X 4DOT_PIXEL_5X5  , 		// 5 X 5DOT_PIXEL_6X6  , 		// 6 X 6DOT_PIXEL_7X7  , 		// 7 X 7DOT_PIXEL_8X8  , 		// 8 X 8} DOT_PIXEL;Dot_Style: 點(diǎn)的風(fēng)格,大小擴(kuò)充方式是以點(diǎn)為中心擴(kuò)大還是以點(diǎn)為左下角往右上擴(kuò)大typedef enum {DOT_FILL_AROUND  = 1,		DOT_FILL_RIGHTUP,} DOT_STYLE;
  • 畫線:在圖像緩存中,從 (Xstart, Ystart) 到 (Xend, Yend) 畫線,可以選擇顏色,線的寬度,線的風(fēng)格。
    void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, LINE_STYLE Line_Style , LINE_STYLE Line_Style)
    參數(shù):Xstart: 線的X起點(diǎn)坐標(biāo)Ystart: 線的Y起點(diǎn)坐標(biāo)Xend: 線的X終點(diǎn)坐標(biāo)Yend: 線的Y終點(diǎn)坐標(biāo)Color: 填充的顏色Line_width: 線的寬度,提供默認(rèn)的8種寬度typedef enum {DOT_PIXEL_1X1  = 1,	// 1 x 1DOT_PIXEL_2X2  , 		// 2 X 2DOT_PIXEL_3X3  ,		// 3 X 3DOT_PIXEL_4X4  ,		// 4 X 4DOT_PIXEL_5X5  , 		// 5 X 5DOT_PIXEL_6X6  , 		// 6 X 6DOT_PIXEL_7X7  , 		// 7 X 7DOT_PIXEL_8X8  , 		// 8 X 8} DOT_PIXEL;Line_Style: 線的風(fēng)格,選擇線是以直線連接還是以虛線的方式連接typedef enum {LINE_STYLE_SOLID = 0,LINE_STYLE_DOTTED,} LINE_STYLE;
  • 畫矩形:在圖像緩存中,從 (Xstart, Ystart) 到 (Xend, Yend) 畫一個(gè)矩形,可以選擇顏色,線的寬度,是否填充矩形內(nèi)部。
    void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)
    參數(shù):Xstart: 矩形的X起點(diǎn)坐標(biāo)Ystart: 矩形的Y起點(diǎn)坐標(biāo)Xend: 矩形的X終點(diǎn)坐標(biāo)Yend: 矩形的Y終點(diǎn)坐標(biāo)Color: 填充的顏色Line_width: 矩形四邊的寬度,提供默認(rèn)的8種寬度typedef enum {DOT_PIXEL_1X1  = 1,	// 1 x 1DOT_PIXEL_2X2  , 		// 2 X 2DOT_PIXEL_3X3  ,		// 3 X 3DOT_PIXEL_4X4  ,		// 4 X 4DOT_PIXEL_5X5  , 		// 5 X 5DOT_PIXEL_6X6  , 		// 6 X 6DOT_PIXEL_7X7  , 		// 7 X 7DOT_PIXEL_8X8  , 		// 8 X 8} DOT_PIXEL;Draw_Fill: 填充,是否填充矩形的內(nèi)部typedef enum {DRAW_FILL_EMPTY = 0,DRAW_FILL_FULL,} DRAW_FILL;
  • 畫圓:在圖像緩存中,以 (X_Center Y_Center) 為圓心,畫一個(gè)半徑為Radius的圓,可以選擇顏色,線的寬度,是否填充圓內(nèi)部。
    void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)
    參數(shù):X_Center: 圓心的X坐標(biāo)Y_Center: 圓心的Y坐標(biāo)Radius:圓的半徑Color: 填充的顏色Line_width: 圓弧的寬度,提供默認(rèn)的8種寬度typedef enum {DOT_PIXEL_1X1  = 1,	// 1 x 1DOT_PIXEL_2X2  , 		// 2 X 2DOT_PIXEL_3X3  ,		// 3 X 3DOT_PIXEL_4X4  ,		// 4 X 4DOT_PIXEL_5X5  , 		// 5 X 5DOT_PIXEL_6X6  , 		// 6 X 6DOT_PIXEL_7X7  , 		// 7 X 7DOT_PIXEL_8X8  , 		// 8 X 8} DOT_PIXEL;Draw_Fill: 填充,是否填充圓的內(nèi)部typedef enum {DRAW_FILL_EMPTY = 0,DRAW_FILL_FULL,} DRAW_FILL;
  • 寫Ascii字符:在圖像緩存中,在 (Xstart Ystart) 為左頂點(diǎn),寫一個(gè)Ascii字符,可以選擇Ascii碼可視字符字庫、字體前景色、字體背景色。
    void Paint_DrawChar(UWORD Xstart, UWORD Ystart, const char Ascii_Char, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
    參數(shù):Xstart: 字符的左頂點(diǎn)X坐標(biāo)Ystart: 字體的左頂點(diǎn)Y坐標(biāo)Ascii_Char:Ascii字符Font: Ascii碼可視字符字庫,在Fonts文件夾中提供了以下字體:font8:5*8的字體font12:7*12的字體font16:11*16的字體font20:14*20的字體font24:17*24的字體Color_Foreground: 字體顏色Color_Background: 背景顏色
  • 寫英文字符串:在圖像緩存中,在 (Xstart Ystart) 為左頂點(diǎn),寫一串英文字符,可以選擇Ascii碼可視字符字庫、字體前景色、字體背景色。
    void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
    參數(shù):Xstart: 字符的左頂點(diǎn)X坐標(biāo)Ystart: 字體的左頂點(diǎn)Y坐標(biāo)pString:字符串,字符串是一個(gè)指針Font: Ascii碼可視字符字庫,在Fonts文件夾中提供了以下字體:font8:5*8的字體font12:7*12的字體font16:11*16的字體font20:14*20的字體font24:17*24的字體Color_Foreground: 字體顏色Color_Background: 背景顏色
  • 寫中文字符串:在圖像緩存中,在 (Xstart Ystart) 為左頂點(diǎn),寫一串中文字符,可以選擇GB2312編碼字符字庫、字體前景色、字體背景色。
    void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, UWORD Color_Foreground, UWORD Color_Background)
    參數(shù):Xstart: 字符的左頂點(diǎn)X坐標(biāo)Ystart: 字體的左頂點(diǎn)Y坐標(biāo)pString:字符串,字符串是一個(gè)指針Font: GB2312編碼字符字庫,在Fonts文件夾中提供了以下字體:font12CN:ascii字符字體11*21,中文字體16*21font24CN:ascii字符字體24*41,中文字體32*41Color_Foreground: 字體顏色Color_Background: 背景顏色
  • 寫數(shù)字:在圖像緩存中,在 (Xstart Ystart) 為左頂點(diǎn),寫一串?dāng)?shù)字,可以選擇Ascii碼可視字符字庫、字體前景色、字體背景色。
    void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, int32_t Nummber, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
    參數(shù):Xstart: 字符的左頂點(diǎn)X坐標(biāo)Ystart: 字體的左頂點(diǎn)Y坐標(biāo)Nummber:顯示的數(shù)字,這里使用的是32位長的int型保存,可以最大顯示到2147483647Font: Ascii碼可視字符字庫,在Fonts文件夾中提供了以下字體:font8:5*8的字體font12:7*12的字體font16:11*16的字體font20:14*20的字體font24:17*24的字體Color_Foreground: 字體顏色Color_Background: 背景顏色
  • 顯示時(shí)間:在圖像緩存中,在 (Xstart Ystart) 為左頂點(diǎn),顯示一段時(shí)間,可以選擇Ascii碼可視字符字庫、字體前景色、字體背景色;這里是方便測試局部刷新而寫的,因?yàn)榫植克⑿滦枰臅r(shí)間為0.3S,整體顯示少于1S加上數(shù)據(jù)的傳輸,可以做到1S刷新一次。
    void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, UWORD Color_Background, UWORD Color_Foreground)
    參數(shù):Xstart: 字符的左頂點(diǎn)X坐標(biāo)Ystart: 字體的左頂點(diǎn)Y坐標(biāo)pTime:顯示的時(shí)間,這里定義好了一個(gè)時(shí)間的結(jié)構(gòu)體,只要把時(shí)分秒各位數(shù)傳給參數(shù);Font: Ascii碼可視字符字庫,在Fonts文件夾中提供了以下字體:font8:5*8的字體font12:7*12的字體font16:11*16的字體font20:14*20的字體font24:17*24的字體Color_Foreground: 字體顏色Color_Background: 背景顏色

墨水屏EPD_2IN9_V2驅(qū)動(dòng)Demo

下面是使用墨水瓶驅(qū)動(dòng)完成顯示預(yù)存的圖片數(shù)組,在圖像上畫圖并顯示以及局部刷新(顯示當(dāng)前時(shí)間)功能,最后展示了四級(jí)的灰度,下面是完成的操作流程。

/*****************************************************************************
* | File      	:   EPD_2IN9_V2_test.c
* | Author      :   Waveshare team
* | Function    :   2.9inch e-paper V2 test demo
* | Info        :
*----------------
* |	This version:   V1.0
* | Date        :   2020-10-20
* | Info        :
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documnetation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to  whom the Software is
# furished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
******************************************************************************/
#include "EPD_Test.h"
#include "EPD_2in9_V2.h"int EPD_2in9_V2_test(void)
{printf("EPD_2IN9_V2_test Demo\r\n");if(DEV_Module_Init()!=0){return -1;}printf("e-Paper Init and Clear...\r\n");EPD_2IN9_V2_Init();EPD_2IN9_V2_Clear();//Create a new image cacheUBYTE *BlackImage;// Additional `*2` on the end to account for four-colour imagesUWORD Imagesize = ((EPD_2IN9_V2_WIDTH % 8 == 0)? (EPD_2IN9_V2_WIDTH / 8 ): (EPD_2IN9_V2_WIDTH / 8 + 1)) * EPD_2IN9_V2_HEIGHT * 2;if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) {printf("Failed to apply for black memory...\r\n");return -1;}printf("Paint_NewImage\r\n");Paint_NewImage(BlackImage, EPD_2IN9_V2_WIDTH, EPD_2IN9_V2_HEIGHT, 90, WHITE);Paint_SetScale(2); // b&wPaint_Clear(WHITE);#if 1  //show image for array  Paint_NewImage(BlackImage, EPD_2IN9_V2_WIDTH, EPD_2IN9_V2_HEIGHT, 90, WHITE);Paint_SetScale(2); // b&wprintf("show image for array\r\n");Paint_SelectImage(BlackImage);Paint_Clear(WHITE);Paint_DrawBitMap(gImage_2in9);EPD_2IN9_V2_Display(BlackImage);DEV_Delay_ms(3000);
#endif#if 1  // Drawing on the imagePaint_NewImage(BlackImage, EPD_2IN9_V2_WIDTH, EPD_2IN9_V2_HEIGHT, 90, WHITE);Paint_SetScale(2); // b&wprintf("Drawing\r\n");//1.Select ImagePaint_SelectImage(BlackImage);Paint_Clear(WHITE);// 2.Drawing on the imageprintf("Drawing:BlackImage\r\n");Paint_DrawPoint(10, 80, BLACK, DOT_PIXEL_1X1, DOT_STYLE_DFT);Paint_DrawPoint(10, 90, BLACK, DOT_PIXEL_2X2, DOT_STYLE_DFT);Paint_DrawPoint(10, 100, BLACK, DOT_PIXEL_3X3, DOT_STYLE_DFT);Paint_DrawLine(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID);Paint_DrawLine(70, 70, 20, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID);Paint_DrawRectangle(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);Paint_DrawRectangle(80, 70, 130, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL);Paint_DrawCircle(45, 95, 20, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);Paint_DrawCircle(105, 95, 20, WHITE, DOT_PIXEL_1X1, DRAW_FILL_FULL);Paint_DrawLine(85, 95, 125, 95, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);Paint_DrawLine(105, 75, 105, 115, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);Paint_DrawString_EN(10, 0, "waveshare", &Font16, BLACK, WHITE);Paint_DrawString_EN(10, 20, "hello world", &Font12, WHITE, BLACK);Paint_DrawNum(10, 33, 123456789, &Font12, BLACK, WHITE);Paint_DrawNum(10, 50, 987654321, &Font16, WHITE, BLACK);Paint_DrawString_CN(130, 0,"���abc", &Font12CN, BLACK, WHITE);Paint_DrawString_CN(130, 20, "??����", &Font24CN, WHITE, BLACK);EPD_2IN9_V2_Display_Base(BlackImage);DEV_Delay_ms(3000);
#endif#if 1   //Partial refresh, example shows time    		Paint_NewImage(BlackImage, EPD_2IN9_V2_WIDTH, EPD_2IN9_V2_HEIGHT, 90, WHITE);  printf("Partial refresh\r\n");Paint_SelectImage(BlackImage);PAINT_TIME sPaint_time;sPaint_time.Hour = 12;sPaint_time.Min = 34;sPaint_time.Sec = 56;UBYTE num = 10;for (;;) {sPaint_time.Sec = sPaint_time.Sec + 1;if (sPaint_time.Sec == 60) {sPaint_time.Min = sPaint_time.Min + 1;sPaint_time.Sec = 0;if (sPaint_time.Min == 60) {sPaint_time.Hour =  sPaint_time.Hour + 1;sPaint_time.Min = 0;if (sPaint_time.Hour == 24) {sPaint_time.Hour = 0;sPaint_time.Min = 0;sPaint_time.Sec = 0;}}}Paint_ClearWindows(150, 80, 150 + Font20.Width * 7, 80 + Font20.Height, WHITE);Paint_DrawTime(150, 80, &sPaint_time, &Font20, WHITE, BLACK);num = num - 1;if(num == 0) {break;}EPD_2IN9_V2_Display_Partial(BlackImage);DEV_Delay_ms(500);//Analog clock 1s}
#endif#if 1 //show 4colour image for arrayfree(BlackImage);printf("show Gray------------------------\r\n");Imagesize = ((EPD_2IN9_V2_WIDTH % 4 == 0)? (EPD_2IN9_V2_WIDTH / 4 ): (EPD_2IN9_V2_WIDTH / 4 + 1)) * EPD_2IN9_V2_HEIGHT;if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) {printf("Failed to apply for black memory...\r\n");return -1;}EPD_2IN9_V2_Gray4_Init();printf("4 grayscale display\r\n");Paint_NewImage(BlackImage, EPD_2IN9_V2_WIDTH, EPD_2IN9_V2_HEIGHT, 90, WHITE);Paint_SetScale(4);Paint_Clear(0xff);Paint_DrawPoint(10, 80, GRAY4, DOT_PIXEL_1X1, DOT_STYLE_DFT);Paint_DrawPoint(10, 90, GRAY4, DOT_PIXEL_2X2, DOT_STYLE_DFT);Paint_DrawPoint(10, 100, GRAY4, DOT_PIXEL_3X3, DOT_STYLE_DFT);Paint_DrawLine(20, 70, 70, 120, GRAY4, DOT_PIXEL_1X1, LINE_STYLE_SOLID);Paint_DrawLine(70, 70, 20, 120, GRAY4, DOT_PIXEL_1X1, LINE_STYLE_SOLID);Paint_DrawRectangle(20, 70, 70, 120, GRAY4, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);Paint_DrawRectangle(80, 70, 130, 120, GRAY4, DOT_PIXEL_1X1, DRAW_FILL_FULL);Paint_DrawCircle(45, 95, 20, GRAY4, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);Paint_DrawCircle(105, 95, 20, GRAY2, DOT_PIXEL_1X1, DRAW_FILL_FULL);Paint_DrawLine(85, 95, 125, 95, GRAY4, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);Paint_DrawLine(105, 75, 105, 115, GRAY4, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);Paint_DrawString_EN(10, 0, "waveshare", &Font16, GRAY4, GRAY1);Paint_DrawString_EN(10, 20, "hello world", &Font12, GRAY3, GRAY1);Paint_DrawNum(10, 33, 123456789, &Font12, GRAY4, GRAY2);Paint_DrawNum(10, 50, 987654321, &Font16, GRAY1, GRAY4);Paint_DrawString_CN(150, 0,"���abc", &Font12CN, GRAY4, GRAY1);Paint_DrawString_CN(150, 20,"���abc", &Font12CN, GRAY3, GRAY2);Paint_DrawString_CN(150, 40,"���abc", &Font12CN, GRAY2, GRAY3);Paint_DrawString_CN(150, 60,"���abc", &Font12CN, GRAY1, GRAY4);Paint_DrawString_CN(150, 80, "??����", &Font24CN, GRAY1, GRAY4);EPD_2IN9_V2_4GrayDisplay(BlackImage);DEV_Delay_ms(3000);Paint_NewImage(BlackImage, EPD_2IN9_V2_WIDTH, EPD_2IN9_V2_HEIGHT, 0, WHITE);Paint_SetScale(4);Paint_Clear(WHITE);Paint_DrawBitMap(gImage_2in9_4gray);EPD_2IN9_V2_4GrayDisplay(BlackImage);DEV_Delay_ms(3000);#endifprintf("Clear...\r\n");EPD_2IN9_V2_Init();EPD_2IN9_V2_Clear();printf("Goto Sleep...\r\n");EPD_2IN9_V2_Sleep();free(BlackImage);BlackImage = NULL;DEV_Delay_ms(2000);//important, at least 2s// close 5Vprintf("close 5V, Module enters 0 power consumption ...\r\n");DEV_Module_Exit();return 0;
}

十六宿舍 原創(chuàng)作品,轉(zhuǎn)載必須標(biāo)注原文鏈接。

?2023 Yang Li. All rights reserved.

歡迎關(guān)注?『十六宿舍』,大家喜歡的話,給個(gè)👍,更多關(guān)于嵌入式相關(guān)技術(shù)的內(nèi)容持續(xù)更新中。

http://m.aloenet.com.cn/news/42662.html

相關(guān)文章:

  • 西部數(shù)碼網(wǎng)站管理助手 破解版seo查詢seo優(yōu)化
  • 赤峰微網(wǎng)站建設(shè)廈門關(guān)鍵詞優(yōu)化企業(yè)
  • 專業(yè)定制網(wǎng)站制作公司百度廣告怎么投放多少錢
  • jquery 的網(wǎng)站模板下載地址今天的新聞最新消息
  • 學(xué)院網(wǎng)站建設(shè)規(guī)劃網(wǎng)絡(luò)服務(wù)是什么
  • ecs搭建多個(gè)wordpress南寧seo主管
  • 自制網(wǎng)站地圖怎么做品牌策劃書
  • 社區(qū)網(wǎng)站如何做內(nèi)容運(yùn)營全網(wǎng)推廣費(fèi)用
  • 大理微網(wǎng)站建設(shè)網(wǎng)絡(luò)推廣公司簡介
  • 網(wǎng)站做抽獎(jiǎng)活動(dòng)快排seo排名軟件
  • 駐馬店市網(wǎng)站建設(shè)外貿(mào)網(wǎng)站推廣
  • 長春做網(wǎng)站新格公司南京seo
  • 正宗營銷型網(wǎng)站建設(shè)網(wǎng)頁一鍵生成app軟件
  • app網(wǎng)站制作下載網(wǎng)站推廣和優(yōu)化系統(tǒng)
  • 安徽設(shè)計(jì)網(wǎng)站建設(shè)南寧百度推廣seo
  • 投資網(wǎng)站網(wǎng)站源碼談?wù)勀銓?duì)互聯(lián)網(wǎng)營銷的認(rèn)識(shí)
  • 視頻網(wǎng)站建設(shè)公司廣告引流推廣平臺(tái)
  • 電商設(shè)計(jì)網(wǎng)站模板合肥優(yōu)化推廣公司
  • 網(wǎng)站常用特效國家職業(yè)技能培訓(xùn)官網(wǎng)
  • 資金盤網(wǎng)站開發(fā)價(jià)格國外比較開放的社交軟件
  • 開發(fā)邦app優(yōu)化營商環(huán)境條例心得體會(huì)
  • 武漢網(wǎng)站推廣怎么做株洲網(wǎng)絡(luò)推廣
  • 做網(wǎng)站的優(yōu)勢seo平臺(tái)代理
  • 做視頻up主視頻網(wǎng)站免費(fèi)推廣論壇
  • 德宏網(wǎng)站建設(shè)在線識(shí)別圖片來源
  • 創(chuàng)建網(wǎng)站的準(zhǔn)備網(wǎng)頁鏈接
  • wordpress css代碼背景色如何優(yōu)化標(biāo)題關(guān)鍵詞
  • 用java做電商網(wǎng)站廈門百度代理
  • 新余網(wǎng)站建設(shè)外鏈發(fā)布的平臺(tái)最好是
  • 怎么免費(fèi)自己做網(wǎng)站精準(zhǔn)信息300099