RA6807是RA8876M的缩小版,具备RA8876M的所有功能,只将MCU控制接口进行缩减,仅保留SPI-3和I2C接口,其它功能基本相同。
该芯片最大可控制854x600 的分辨率,内建64Mbits显存,多个图层,使用起来相当灵活!
继续讲解软件代码,我们使用SPI-3进行演示。参考代码请使用PC端浏览器访问本贴,在标题下方找到下载链接。
10. 让PNG图片动起来
上篇已经解释了如何显示PNG图片,接下来我们要做一个有趣的效果!让PNG图片动起来!先看实际效果:
实现代码:
c
unsigned short n,x,y,dir_x,dir_y;
//显示PNG只能在16位色深方可
Select_Main_Window_16bpp(); //[10h]Set main window color depth
Memory_16bpp_Mode(); //[5Eh]Set active memory color depth
DMA_24bit(CS1,0,0,480*0,800,480,BINARY_INFO[5].img_width,BINARY_INFO[5].start_addr); //Layer0:主画面
DMA_24bit(CS1,0,0,480*1,800,480,BINARY_INFO[5].img_width,BINARY_INFO[5].start_addr); //Layer1:主画面组合PNG用
DMA_24bit(CS1,0,0,480*2,800,480,BINARY_INFO[5].img_width,BINARY_INFO[5].start_addr); //Layer2:主画面备份用
DMA_24bit(CS1,0,0,480*3,400,100,BINARY_INFO[6].img_width,BINARY_INFO[6].start_addr); //Layer3:读取PNG(ARGB:4444)数据放到该图层
x=300;
y=300;
dir_x=1; //PNG移动方向:0:递减,1:递进
dir_y=1; //PNG移动方向:0:递减,1:递进
for(n=0;n<400;n++)
{
BTE_Alpha_Blending_Pixel_PNG_16bpp(Layer1,canvas_image_width,x,y,Layer3,canvas_image_width,0,0,Layer1,canvas_image_width,x,y,400,100); //将PNG数据延展为图片,贴到Layer1上
BTE_Memory_Copy(Layer1,canvas_image_width,0,0,0,canvas_image_width,0,0,Layer0,canvas_image_width,0,0,0x0C,800,480); //将Layer1复制到Layer0,主画面叠加了PNG图片后复制
BTE_Memory_Copy(Layer2,canvas_image_width,0,0,0,canvas_image_width,0,0,Layer1,canvas_image_width,0,0,0x0C,800,480); //将Layer2复制到Layer1,恢复底图
//x向递增和递减
if(dir_x==1 && x<800-400)
{
x++;
if(x==800-400-1) dir_x=0;
}
else if(dir_x==0 && x>0)
{
x--;
if(x==0) dir_x=1;
}
//y向递增和递减
if(dir_y==1 && y<480-100)
{
y++;
if(y==480-100-1) dir_y=0;
}
else if(dir_y==0 && y>0)
{
y--;
if(y==0) dir_y=1;
}
}
上例中,我们将显存规划出来Layer0~3共4个图层,这几个层用宏定义了相应地址了,范例的代码在UserDef.h中:
c
/* RA6807 图层定义 16位色 */
#define Layer0 384000*2*0 //图层0地址(canvas_image_width*LCD_Height*16/8)
#define Layer1 384000*2*1 //图层1地址
#define Layer2 384000*2*2 //图层2地址
#define Layer3 384000*2*3 //图层3地址
#define Layer4 384000*2*4 //图层4地址
补充一下,显存是用户自由规划的,这里我们规划出来画布的宽度是800,即屏宽,那么每个图层的大小是:
800 x 480 x16bpp / 8bit=384000 x 2
Layer0绝对坐标:(0,480 * 0)
Layer1绝对坐标:(0,480 * 1)
Layer2绝对坐标:(0,480 * 2)
Layer3绝对坐标:(0,480 * 3)
上面的代码,参考下方流程图:
可能有些细心的R&D会注意到,范例中是将PNG先贴到Layer1,然后再将Layer1复制到Layer0,那为何不直接将PNG贴到Layer0呢?何必多此一举?这里卖个关子,先不细说,等您来探索!
至此,RA6807的参考程序全部介绍完毕!
如您还有兴趣,可访问论坛:https://bbs.lcdvision.com.cn