本帖最后由 lcdvision 于 2024-8-23 08:46 編輯
本文介紹使用單片機+RA8889來驅(qū)動和控制彩屏的最小方案。文章從RA8889的架構(gòu)功能、硬件電路設(shè)計及軟件設(shè)計三個方面來說明。
小編已發(fā)布多篇文章介紹了單片機+RA8889來驅(qū)動控制彩屏,但是仍有不少單片機玩家可能對驅(qū)動彩屏還不算熟悉,在此加推一個短篇介紹系列,閱讀時間不會超過半小時,定能揭開您的疑惑!
本系列文章最后一篇會有彩蛋釋放,敬請跟蹤閱讀。
一、RA8889的硬件架構(gòu)圖示
此處仍不嫌啰嗦,再作一下架構(gòu)說明,參下圖:
主要特色:
- 解碼:JPG,AVI;支持BMP,PNG圖片
- 可外接4顆FLASH,支持Q-SPI通信模式
- 圖片顯示采用DMA,不使用MCU資源
- MCU接口豐富:8080/6800,SPI-3/4,I2C
- 支持分辨率:最大1366 x [理論上不限高度]
- LQFP-100封裝
- 工作溫度-40~85℃
二、UI設(shè)計時重點
UI上所用到的圖片、自建字庫預(yù)先燒錄到FLASH中,圖片可以是整圖,也可以是小圖。
RA8889是直接從FLASH尋址讀取圖片、字庫數(shù)據(jù),并顯示到相應(yīng)的位置,可以是局部更新圖片,也可以是滿屏替換,相當(dāng)靈活高效。
MCU只發(fā)送相應(yīng)的API指令即可,提供給RA8889進行自動尋址及放置圖片,指令簡單,MCU會節(jié)約許多資源,即使使用SPI方式也可以得到十分快速度的畫面切換。
RA8889內(nèi)建繪圖函數(shù)以及圖形處理(剔除底色、文字上色、圖片疊加運算等),基礎(chǔ)圖形處理簡單快速高效。
UI界面要顯示的字母,可以調(diào)用RA8889內(nèi)建的字符,顯示數(shù)度快,內(nèi)建字符可放大1~4倍(向量放大)。
三、對FLASH容量的需求
RA8889支持JPG格式,多數(shù)UI界面可以采用JPG圖片,因此FLASH容量可以很小。
可以自建全套漢字字庫,比如24x24,32x32點,字庫不大,可以打包存入FLASH,再利用RA8889的DMA讀取,結(jié)合芯片BTE算法,可快速顯示漢字。
RA8889可外接擴展4顆FLASH,一般采用NOR。一般UI設(shè)計時使用到1~2顆是夠用,更何況支持JPG格式,圖片容量需求更小了。
注意:請將FLASH擴展到RA8889使用,才能發(fā)揮出這顆控制芯片的優(yōu)勢。而不是擴展到單片機喔!將FLASH擴展到單片機使用時會大打折扣。
四、顯存
RA8889內(nèi)建128Mbits顯存,用戶可自由規(guī)劃畫布、圖像,顯存相當(dāng)充裕,UI界面,需要疊放許多背景圖片、圖標、菜單圖片等等,預(yù)先放進緩沖層,需要時直接使用BTE Memory Copy是十分方便快速。
同時也可以直接切換主界面到其它圖層,切換效果可做到零延時,這個是緩存大的優(yōu)點。
許多單片機玩家直接驅(qū)動串口屏,反應(yīng)最大的問題是刷新慢,若用RA8889這顆芯片來驅(qū)動控制彩屏,這個問題是不存在的。
五、能做到什么效果
顯示UI,簡單的界面已無法滿足用戶群對產(chǎn)品的期待了,通過RA8889,完全可以將界面做得更加美觀、生動、大氣,同時還能加進動畫效果,這一切只要使用一顆51單片機就能做得到!
六、應(yīng)用舉例
- 咖啡機控制屏
- 汽車儀表盤
- 電力、安防儀表
- 各種醫(yī)療器械儀表盤
- 自動化控制儀表盤
- 串口屏
來吧!只要一顆51單片機,就能點亮彩色的視窗!
本帖最后由 lcdvision 于 2024-8-23 21:26 編輯
單片機驅(qū)動彩屏最簡方案:單片機_RA8889最小開發(fā)板驅(qū)動控制TFT彩屏介紹(二)硬件電路設(shè)計
本篇介紹電路設(shè)計。底部可下載參考電路。
一、硬件樣板:
該板需要外接MCU,圖示接法為SPI-4線。
可接AT043TN25和AT070TN92,及兼容接口的屏。
二、RA8889芯片引腳定義
再上一張引腳簡化圖,概覽引腳結(jié)構(gòu):
電路中沒有畫MCU,需外接,采用何種接口方式,可通過PS2~0來選擇。最簡單的話SPI-3/4線即可。
RA8889各個VCC和LDO(1.2V)引腳均需要接旁路電容進行濾波,且放置距離芯片引腳要近一些。
三、FLASH
RA8889可外接4顆FLASH,一般建議使用NOR FLASH,基本夠用了:

該設(shè)計中僅接出兩顆FLASH,RA8889有兩路BUS總線,每路總線可擴展2個片選,故總共可外接4顆FLASH。
FLASH是用于存放UI界面的圖資,可以采用JPG格式存入,支持BMP、JPG、PNG、AVI影片,用戶根據(jù)需要選擇。
FLASH引腳需要上拉,一是擴展比較多顆負載重,二是在燒錄時會吃多一些電流。
四、液晶屏接口

輸出的TTL串聯(lián)22歐姆電阻,是為了降低EMC而加。
輸出配置兩種接口,40PIN和50PIN,常用的4.3寸采用40PIN,7寸采用50PIN。
五、FLASH燒錄口的設(shè)計

FLASH外接線進行燒錄,燒錄器采用CH341A即可,便宜易買。該接口引出2路BUS總線,燒錄時TEST1跳線至3.3V,正常工作時取下跳線。
另外將PS2~0跳線口也放置到該連接器,通過跳線帽便于改變MCU的通信方式。
六、5V轉(zhuǎn)3.3V電路

采用通用的1117-3.3芯片即可,注意芯片周圍的覆銅,以便散熱。
七、5V轉(zhuǎn)LED背光

背光是整個電路功耗最大的一塊,注意電感L2和肖特基二極管D1的覆銅,便以散熱。適當(dāng)調(diào)整反饋電阻R11//R12,以防電流過大,零件過熱。
可以接上R9,通過RA8889的PWM0輸出方波調(diào)整背光亮度。
八、LCD驅(qū)動電壓

這部份功耗不大,主要是提供LCD的驅(qū)動電壓,不太吃電流。
4.3寸的話不需要加這部分電路;AT070TN92則需要外加驅(qū)動電壓,看是繁瑣,其實和LED的升壓電路大同小異。
焊接時要注意齊納二極管D3和D6的方向,一個負壓,一個正壓。
九、關(guān)于地線
Layout走線時,注意電源的地單獨走線、覆銅,主要是升壓、和降壓電路,數(shù)字地單獨走線、覆銅,最終在濾波電容附近收到一起。這樣做可極大地預(yù)防電源雜訊對數(shù)字電路的干擾。
本章完
單片機驅(qū)動彩屏最簡方案:單片機_RA8889最小開發(fā)板驅(qū)動控制TFT彩屏介紹(三)軟件設(shè)計
本篇介紹軟件設(shè)計,相關(guān)代碼請從本人相關(guān)文章獲取,或者至官方論壇獲取。
一、老樣子,先上一張軟件代碼導(dǎo)圖:
代碼三步曲:
- 設(shè)定通信方式(已寫好各種通信方式的參考代碼了);
- 初始化RA8889,如上圖所示,看似很多,代碼都是直接調(diào)用API函數(shù);
- 調(diào)用API函數(shù)進行界面設(shè)計,對于工業(yè)上所使用的UI,這些API足夠用,也十分簡潔!
二、代碼要點:
1. 一些宏定義請先修改,在userdef.h
(1)顯存規(guī)劃:
- /* RA8889顯存和顯示配置 */
- #define canvas_image_width 1600 //畫布寬度,設(shè)定為屏寬的n倍
- #define main_image_width 1600 //圖像寬度,設(shè)定為屏寬的n倍
- #define LCD_Width 800
- #define LCD_Height 480
復(fù)制代碼
(2)主頻配置,一般只修改SCAN_FREQ即可
- /* RA8889頻率配置 */
- #define OSC_FREQ 10 //晶振頻率,外接晶振請使用10MHz
- #define DRAM_FREQ 133 //SDRAM刷新頻率,最高166MHz
- #define CORE_FREQ 120 //RA8889核心頻率,最高133MHz
- #define SCAN_FREQ 30 //PCLK液晶掃描頻率,最高100MHz
復(fù)制代碼
(3)液晶屏型號定義,最終是在初始化中Set_LCD_Panel();執(zhí)行,不同液晶屏配置不同,許多RD還不熟悉彩屏,這里先賣個關(guān)子,待后續(xù)文章另起新篇針對該項專門介紹。
下方為AT070TN92的液晶屏參數(shù)配置:
- #ifdef L80480R70
- //**[10h]**//
- Select_LCD_Sync_Mode(); // Enable XVSYNC, XHSYNC, XDE.
- // Select_LCD_DE_Mode(); // XVSYNC & XHSYNC in idle state.
-
- PCLK_Falling();
- // PCLK_Rising();
- VSCAN_T_to_B();
- PDATA_Set_RGB();
- HSYNC_Low_Active();
- VSYNC_Low_Active();
- DE_High_Active();
- // DE_Low_Active();
- LCD_HorizontalWidth_VerticalHeight(800,480);
- LCD_Horizontal_Non_Display(64);
- LCD_HSYNC_Start_Position(208);
- LCD_HSYNC_Pulse_Width(24);
- LCD_Vertical_Non_Display(16);
- LCD_VSYNC_Start_Position(22);
- LCD_VSYNC_Pulse_Width(16);
- #endif
復(fù)制代碼
下方為AT043TN25的液晶屏參數(shù)配置:
- #ifdef AT043TN25
- //**[10h]**//
- //Select_LCD_Sync_Mode(); // Enable XVSYNC, XHSYNC, XDE.
- Select_LCD_DE_Mode(); // XVSYNC & XHSYNC in idle state.
- // PCLK_Rising();
- PCLK_Falling();
- VSCAN_T_to_B();
- PDATA_Set_RGB();
- //**[13h]**//
- HSYNC_Low_Active();
- VSYNC_Low_Active();
- DE_High_Active();
- // DE_Low_Active();
- //------------------------------------
- //**[14h][15h][1Ah][1Bh]**//
- LCD_HorizontalWidth_VerticalHeight(480, 272); // LCD Resolution 480x272。
- //**[16h][17h]**//
- LCD_Horizontal_Non_Display(38); // 480x272,HSYNC Back Porch=38。
- //**[18h]**//
- LCD_HSYNC_Start_Position(20); // 480x272 HSYNC Front Porch = 20。
- //**[19h]**//
- LCD_HSYNC_Pulse_Width(20); // 480x272,HSYNC Pulse Width=5~30,set 20。
- //**[1Ch][1Dh]**//
- LCD_Vertical_Non_Display(4); // 480x272,VSYNC Back Porch =4。
- //**[1Eh]**//
- LCD_VSYNC_Start_Position(15); // 480x272,VSYNC Front Porch =15。
- //**[1Fh]**//
- LCD_VSYNC_Pulse_Width(3); // 480x272,VSYNC Pulse Width =3。
- #endif
復(fù)制代碼
參考演示程序已經(jīng)預(yù)設(shè)各種分辨率的液晶屏參數(shù)配置,可以直接代入測試,再進行微調(diào)。使用上非常簡單!
(4)MCU通信方式和顯示色深定義:
- /*==== MCU接口通信位數(shù)和顯示色深定義 ====*/
- //#define MCU_8bit_ColorDepth_8bpp
- //#define MCU_8bit_ColorDepth_16bpp
- #define MCU_8bit_ColorDepth_24bpp
- //#define MCU_16bit_ColorDepth_16bpp
- //#define MCU_16bit_ColorDepth_24bpp_Mode_1
- //#define MCU_16bit_ColorDepth_24bpp_Mode_2
復(fù)制代碼
2. 延時函數(shù)
使用毫秒即可,請依照自己的MCU主頻調(diào)整延時長度:
- void delay_ms(unsigned int n);
復(fù)制代碼
三、進行UI界面設(shè)計
底層封裝好API函數(shù)了,存放在RA8889_API.c(51單片機請改用RA8889_API_51.c),每個函數(shù)頭均有用法說明,不明白請進函數(shù)查閱詳細參數(shù)說明。并且所有代碼透明,感興趣的話請進入函數(shù)查看底層寄存器的設(shè)定。
UI界面基礎(chǔ)三要素為 繪圖、顯示文字、顯示圖片, 這些都是RA8889硬件支持的功能,顯示速度很快!如下列舉主要的顯示函數(shù):
- /* MCU直接寫點,基礎(chǔ)函數(shù) */
- void putPixel(unsigned short x,unsigned short y,unsigned long color);
- /* 數(shù)據(jù)直接寫顯存 */
- void MPU8_8bpp_Memory_Write (unsigned short x,unsigned short y,unsigned short w ,unsigned short h ,const unsigned char *data_array);
- void MPU8_16bpp_Memory_Write (unsigned short x,unsigned short y,unsigned short w ,unsigned short h ,const unsigned char *data_array);
- void MPU8_24bpp_Memory_Write (unsigned short x,unsigned short y,unsigned short w ,unsigned short h ,const unsigned char *data_array);
- void MPU16_16bpp_Memory_Write (unsigned short x,unsigned short y,unsigned short w ,unsigned short h ,const unsigned short *data_array);
- void MPU16_24bpp_Mode1_Memory_Write (unsigned short x,unsigned short y,unsigned short w ,unsigned short h ,const unsigned short *data_array);
- void MPU16_24bpp_Mode2_Memory_Write (unsigned short x,unsigned short y,unsigned short w ,unsigned short h ,const unsigned short *data_array);
- /* 繪圖:各種幾何圖形(硬件實現(xiàn),高速) */
- void Draw_Line(unsigned long LineColor,unsigned short X1,unsigned short Y1,unsigned short X2,unsigned short Y2);
- void Draw_Triangle(unsigned long ForegroundColor,unsigned short X1,unsigned short Y1,unsigned short X2,unsigned short Y2,unsigned short X3,unsigned short Y3);
- void Draw_Triangle_Fill(unsigned long ForegroundColor,unsigned short X1,unsigned short Y1,unsigned short X2,unsigned short Y2,unsigned short X3,unsigned short Y3);
- void Draw_Circle(unsigned long ForegroundColor,unsigned short XCenter,unsigned short YCenter,unsigned short R);
- void Draw_Circle_Fill(unsigned long ForegroundColor,unsigned short XCenter,unsigned short YCenter,unsigned short R);
- void Draw_Ellipse(unsigned long ForegroundColor,unsigned short XCenter,unsigned short YCenter,unsigned short X_R,unsigned short Y_R);
- void Draw_Ellipse_Fill(unsigned long ForegroundColor,unsigned short XCenter,unsigned short YCenter,unsigned short X_R,unsigned short Y_R);
- void Draw_Left_Up_Curve(unsigned long ForegroundColor,unsigned short XCenter,unsigned short YCenter,unsigned short X_R,unsigned short Y_R);
- void Draw_Left_Up_Curve_Fill(unsigned long ForegroundColor,unsigned short XCenter,unsigned short YCenter,unsigned short X_R,unsigned short Y_R);
- void Draw_Right_Down_Curve(unsigned long ForegroundColor,unsigned short XCenter,unsigned short YCenter,unsigned short X_R,unsigned short Y_R);
- void Draw_Right_Down_Curve_Fill(unsigned long ForegroundColor,unsigned short XCenter,unsigned short YCenter,unsigned short X_R,unsigned short Y_R);
- void Draw_Right_Up_Curve(unsigned long ForegroundColor,unsigned short XCenter,unsigned short YCenter,unsigned short X_R,unsigned short Y_R);
- void Draw_Right_Up_Curve_Fill(unsigned long ForegroundColor,unsigned short XCenter,unsigned short YCenter,unsigned short X_R,unsigned short Y_R);
- void Draw_Left_Down_Curve(unsigned long ForegroundColor,unsigned short XCenter,unsigned short YCenter,unsigned short X_R,unsigned short Y_R);
- void Draw_Left_Down_Curve_Fill(unsigned long ForegroundColor,unsigned short XCenter,unsigned short YCenter,unsigned short X_R,unsigned short Y_R);
- void Draw_Square(unsigned long ForegroundColor,unsigned short X1,unsigned short Y1,unsigned short X2,unsigned short Y2);
- void Draw_Square_Fill(unsigned long ForegroundColor,unsigned short X1,unsigned short Y1,unsigned short X2,unsigned short Y2);
- void Draw_Circle_Square(unsigned long ForegroundColor,unsigned short X1,unsigned short Y1,unsigned short X2,unsigned short Y2,unsigned short R,unsigned short Y_R);
- /* 內(nèi)存操作:復(fù)制、運算、剔除底色、單色延展彩色、淡入淡出(硬件實現(xiàn),快速) */
- void BTE_Memory_Copy(unsigned long S0_Addr,unsigned short S0_W,unsigned short XS0,unsigned short YS0,unsigned long S1_Addr,unsigned short S1_W,unsigned short XS1,unsigned short YS1,unsigned long Des_Addr,unsigned short Des_W, unsigned short XDes,unsigned short YDes,unsigned int ROP_Code,unsigned short X_W,unsigned short Y_H);
- void BTE_Memory_Copy_Chroma_key(unsigned long S0_Addr,unsigned short S0_W,unsigned short XS0,unsigned short YS0,unsigned long Des_Addr,unsigned short Des_W, unsigned short XDes,unsigned short YDes,unsigned long Background_color,unsigned short X_W,unsigned short Y_H);
- void BTE_MCU_Write_MCU_8bit(unsigned long S1_Addr,unsigned short S1_W,unsigned short XS1,unsigned short YS1,unsigned long Des_Addr,unsigned short Des_W, unsigned short XDes,unsigned short YDes,unsigned int ROP_Code,unsigned short X_W,unsigned short Y_H,const unsigned char *data_array);
- void BTE_MCU_Write_MCU_16bit(unsigned long S1_Addr,unsigned short S1_W,unsigned short XS1,unsigned short YS1,unsigned long Des_Addr,unsigned short Des_W, unsigned short XDes,unsigned short YDes,unsigned int ROP_Code,unsigned short X_W,unsigned short Y_H,const unsigned short *data_array);
- /* DMA功能,快速顯示圖片(JPG,BMP),播放AVI影片 */
- void DMA_24bit(unsigned char Clk ,unsigned short X1,unsigned short Y1,unsigned short X_W,unsigned short Y_H ,unsigned short P_W ,unsigned long Addr);
- void DMA_32bit(unsigned char Clk ,unsigned short X1,unsigned short Y1,unsigned short X_W,unsigned short Y_H ,unsigned short P_W,unsigned long Addr);
- void JPG_NOR (unsigned long addr,unsigned long JPGsize,unsigned long IDEC_canvas_width,unsigned short x,unsigned short y);
- void AVI_NOR(unsigned long addr,unsigned long videosize,unsigned long shadow_buffer_addr,unsigned long PIP_buffer_addr,unsigned long x,unsigned long y,unsigned long height,unsigned long width,unsigned long PIP_width);
復(fù)制代碼
四、彩蛋
我們已經(jīng)開發(fā)好一款新的RA8889開發(fā)板,簡單易用,使用您的單片機,通過并口或者串口直接連接即可,外接一片AT043TN25或者AT070TN92,只要接口兼容,通通都能點!
RA8889精簡版:RA6809,該芯片僅提供SPI接口與MCU通信,但功能上和RA8889完全一樣!更詳細信息請關(guān)注我們的產(chǎn)品開發(fā)進展!
以下效果使用51單片機STC8H8K64U+RA8889/RA6809開發(fā)板+1024x600/800x480彩屏進行演示:
https://www.bilibili.com/video/BV19SHhexE8r/?share_source=copy_web&vd_source=c0cd4c87f6dcc19bcebab2f4cf3c40db