單片機驅動彩屏最簡方案:單片機_RA8889最小開發板驅動控制TFT彩屏介紹(三)軟件設計
本篇介紹軟件設計,相關代碼請從本人相關文章獲取,或者至官方論壇獲取。
一、老樣子,先上一張軟件代碼導圖:
代碼三步曲:
- 設定通信方式(已寫好各種通信方式的參考代碼了);
- 初始化RA8889,如上圖所示,看似很多,代碼都是直接調用API函數;
- 調用API函數進行界面設計,對于工業上所使用的UI,這些API足夠用,也十分簡潔!
二、代碼要點:
1. 一些宏定義請先修改,在userdef.h
(1)顯存規劃:
- /* RA8889顯存和顯示配置 */
- #define canvas_image_width 1600 //畫布寬度,設定為屏寬的n倍
- #define main_image_width 1600 //圖像寬度,設定為屏寬的n倍
- #define LCD_Width 800
- #define LCD_Height 480
復制代碼
(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
復制代碼
(3)液晶屏型號定義,最終是在初始化中Set_LCD_Panel();執行,不同液晶屏配置不同,許多RD還不熟悉彩屏,這里先賣個關子,待后續文章另起新篇針對該項專門介紹。
下方為AT070TN92的液晶屏參數配置:
- #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
復制代碼
下方為AT043TN25的液晶屏參數配置:
- #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
復制代碼
參考演示程序已經預設各種分辨率的液晶屏參數配置,可以直接代入測試,再進行微調。使用上非常簡單!
(4)MCU通信方式和顯示色深定義:
- /*==== MCU接口通信位數和顯示色深定義 ====*/
- //#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
復制代碼
2. 延時函數
使用毫秒即可,請依照自己的MCU主頻調整延時長度:
- void delay_ms(unsigned int n);
復制代碼
三、進行UI界面設計
底層封裝好API函數了,存放在RA8889_API.c(51單片機請改用RA8889_API_51.c),每個函數頭均有用法說明,不明白請進函數查閱詳細參數說明。并且所有代碼透明,感興趣的話請進入函數查看底層寄存器的設定。
UI界面基礎三要素為 繪圖、顯示文字、顯示圖片, 這些都是RA8889硬件支持的功能,顯示速度很快!如下列舉主要的顯示函數:
- /* MCU直接寫點,基礎函數 */
- void putPixel(unsigned short x,unsigned short y,unsigned long color);
- /* 數據直接寫顯存 */
- 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);
- /* 繪圖:各種幾何圖形(硬件實現,高速) */
- 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);
- /* 內存操作:復制、運算、剔除底色、單色延展彩色、淡入淡出(硬件實現,快速) */
- 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);
復制代碼
四、彩蛋
我們已經開發好一款新的RA8889開發板,簡單易用,使用您的單片機,通過并口或者串口直接連接即可,外接一片AT043TN25或者AT070TN92,只要接口兼容,通通都能點!
RT8889CNN03開發板.jpg (487.19 KB, 下載次數: 43)
下載附件
2024-9-5 13:29 上傳
RA8889精簡版:RA6809,該芯片僅提供SPI接口與MCU通信,但功能上和RA8889完全一樣!更詳細信息請關注我們的產品開發進展!
以下效果使用51單片機STC8H8K64U+RA8889/RA6809開發板+1024x600/800x480彩屏進行演示:
|