此文基于stm32F429原子的例程,stm32F429自带LTDC液晶控制器,底层驱动在"ltdc.c"中配置。
1. 在不用emwin显示的情况下,如果想任意设置屏幕的显示方向,则应该更改文件"ltdc.c"中的打点函数,想怎么显示修改代码
lcdltdc.pixsize*(lcdltdc.pwidth*y+x)
lcdltdc.pixsize*(lcdltdc.pwidth*(lcdltdc.pheight-x)+y)
lcdltdc.pixsize*(lcdltdc.pwidth*(272-y)+(480-x))
lcdltdc.pixsize*(lcdltdc.pwidth*(lcdltdc.pheight-x-1)+y)
//画点函数
//x,y:坐标
//color:颜色值
void LTDC_Draw_Point(u16 x,u16 y,u32 color)
{
#if LCD_PIXFORMAT==LCD_PIXFORMAT_ARGB8888||LCD_PIXFORMAT==LCD_PIXFORMAT_RGB888
if(lcdltdc.dir) //横屏
{
*(u32*)((u32)ltdc_framebuf[lcdltdc.activelayer]+lcdltdc.pixsize*(lcdltdc.pwidth*y+x))=color;
}else //竖屏
{
*(u32*)((u32)ltdc_framebuf[lcdltdc.activelayer]+lcdltdc.pixsize*(lcdltdc.pwidth*(lcdltdc.pheight-x)+y))=color;
}
#else
if(lcdltdc.dir) //横屏
{
*(u16*)((u32)ltdc_framebuf[lcdltdc.activelayer]+lcdltdc.pixsize*(lcdltdc.pwidth*y+x))=color;
}else //竖屏
{
*(u16*)((u32)ltdc_framebuf[lcdltdc.activelayer]+lcdltdc.pixsize*(lcdltdc.pwidth*(lcdltdc.pheight-x-1)+y))=color;
}
#endif
}
2.使用emwin时,应该在emwin的相应的LCD配置文件LCDConf_中修改LCD_X_Config()函数,参考emwin5手册中的“显示驱动”一章节中的“通过函数配置显示方向”这一节,大概在800多页。
修改代码
GUI_SetOrientation(GUI_SWAP_XY|GUI_MIRROR_Y);
GUI_SetOrientation(GUI_MIRROR_X|GUI_MIRROR_Y);
//配置程序,用于创建显示驱动器件,设置颜色转换程序和显示尺寸
void LCD_X_Config(void)
{
uint32_t i;
LCD_LL_Init (); //LCD底层驱动(LTDC中断设置和DMA2D初始化)
#if (NUM_BUFFERS>1) //多缓冲
for (i=0;i<GUI_NUM_LAYERS; i++)
{
GUI_MULTIBUF_ConfigEx(i, NUM_BUFFERS);
}
#endif
//设置第一层
GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER_0,COLOR_CONVERSION_0,0,0);//创建显示驱动器件
GUI_SelectLayer(0); //选中第0层
if(lcddev.dir==0)//竖屏
{
LCD_SetSizeEx(0,lcddev.height,lcddev.width); //设置可见区尺寸
LCD_SetVSizeEx(0,lcddev.height,lcddev.width*NUM_VSCREENS); //设置虚拟显示区尺寸
GUI_SetOrientation(GUI_SWAP_XY|GUI_MIRROR_Y); //设置为竖屏
}else //横屏
{
LCD_SetSizeEx(0,lcddev.width,lcddev.height); //设置可见区尺寸
LCD_SetVSizeEx(0,lcddev.width,lcddev.height*NUM_VSCREENS); //设置虚拟显示区尺寸
GUI_SetOrientation(GUI_MIRROR_X|GUI_MIRROR_Y); //设置为反向//屏幕方向设置
}
GUI_TOUCH_Calibrate(GUI_COORD_X,0,lcddev.width,0,lcddev.width-1);
GUI_TOUCH_Calibrate(GUI_COORD_Y,0,lcddev.height,0,lcddev.height-1);
#if (GUI_NUM_LAYERS>1)
//设置第二层
GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER_1,COLOR_CONVERSION_1,0,1);
GUI_SelectLayer(1); //选中第1层
if(lcddev.dir==0)//竖屏
{
LCD_SetSizeEx(1,lcddev.height,lcddev.width); //设置可见区尺寸
LCD_SetVSizeEx(1,lcddev.height,lcddev.width*NUM_VSCREENS); //设置虚拟显示区尺寸
GUI_SetOrientation(GUI_SWAP_XY|GUI_MIRROR_Y); //设置为竖屏
}else //横屏
{
LCD_SetSizeEx(1,lcddev.width,lcddev.height); //设置可见区尺寸
LCD_SetVSizeEx(1,lcddev.width,lcddev.height*NUM_VSCREENS); //设置虚拟显示区尺寸
GUI_SetOrientation(GUI_MIRROR_X|GUI_MIRROR_Y); //设置为反向//屏幕方向设置
}
GUI_TOUCH_Calibrate(GUI_COORD_X,0,lcddev.width,0,lcddev.width-1);
GUI_TOUCH_Calibrate(GUI_COORD_Y,0,lcddev.height,0,lcddev.height-1);
#endif
layer_prop[0].address=LCD_LAYER0_FRAME_BUFFER; //缓冲区
#if (GUI_NUM_LAYERS>1)
layer_prop[1].address=LCD_LAYER1_FRAME_BUFFER;
#endif
for (i=0;i<GUI_NUM_LAYERS;i++)
{
layer_prop[i].pColorConvAPI=(LCD_API_COLOR_CONV *)apColorConvAPI[i];
layer_prop[i].pending_buffer=-1;
LCD_SetVRAMAddrEx(i,(void *)(layer_prop[i].address));
layer_prop[i].BytesPerPixel=LCD_GetBitsPerPixelEx(i) >> 3;
LCD_SetDevFunc(i,LCD_DEVFUNC_COPYBUFFER,(void(*)(void))CUSTOM_CopyBuffer);
LCD_SetDevFunc(i,LCD_DEVFUNC_COPYRECT,(void(*)(void))CUSTOM_CopyRect);
if (LCD_LL_GetPixelformat(i)<=LTDC_PIXEL_FORMAT_ARGB4444)
{
LCD_SetDevFunc(i,LCD_DEVFUNC_FILLRECT,(void(*)(void))CUSTOM_FillRect);
LCD_SetDevFunc(i,LCD_DEVFUNC_DRAWBMP_8BPP,(void(*)(void))LCD_DrawBitmap8bpp);
}
if(LCD_LL_GetPixelformat(i)==LTDC_PIXEL_FORMAT_RGB565)
{
LCD_SetDevFunc(i,LCD_DEVFUNC_DRAWBMP_16BPP,(void(*)(void))LCD_DrawBitmap16bpp);
}
GUICC_M1555I_SetCustColorConv(Color2IndexBulk_M1555IDMA2D,Index2ColorBulk_M1555IDMA2D);
//GUICC_M565_SetCustColorConv(Color2IndexBulk_M565DMA2D,Index2ColorBulk_M565DMA2D);
GUICC_M4444I_SetCustColorConv(Color2IndexBulk_M4444IDMA2D,Index2ColorBulk_M4444IDMA2D);
GUICC_M888_SetCustColorConv(Color2IndexBulk_M888DMA2D,Index2ColorBulk_M888DMA2D);
GUICC_M8888I_SetCustColorConv(Color2IndexBulk_M8888IDMA2D,Index2ColorBulk_M8888IDMA2D);
GUI_SetFuncAlphaBlending(DMA2D_AlphaBlending);
GUI_SetFuncGetpPalConvTable(_LCD_GetpPalConvTable);
GUI_SetFuncMixColors(DMA2D_MixColors);
GUI_SetFuncMixColorsBulk(LCD_MixColorsBulk);
}
}