显示字符
LCD_ShowStr(50,60,16,"STM32F746NGH6 ^_^",1,LCD_COLOR_WHITE,NULL);
/*******************************************************************************
* Function Name : LCD_ShowStr
* Description : 显示字符串
* Input : x,y :起点坐标
width,height:区域大小
size:字体大小
*p:字符串起始地址
mode 0 不叠加显示 1 叠加显示
point_color 字体前景色
bk_color 字体背景色
* Output : None
* Return : None
* Note : None
*******************************************************************************/
void LCD_ShowStr(u16 x,u16 y,u8 size,char *p,u8 mode, u32 point_color, u32 bk_color)
{
while(*p != '\0')
{
if((x + size/2) >= LCD_WIDTH)//换行
{
x = 0;
y += size;
}
if((y + size) >= LCD_HEIGHT) //越界
{
break; //退出
}
LCD_ShowChar(x,y,*p,size,mode,point_color,bk_color);
x += size/2;
p++;
}
}
*******************************************************************************/
/*******************************************************************************
* Function Name : LCD_ShowChar
* Description : 在指定位置显示一个字符
* Input : x,y:起始坐标
num:要显示的字符:" "--->"~"
size:字体大小 16
mode:叠加方式(1)还是非叠加方式(0)
point_color 字体前景色
bk_color 字体背景色
* Output : None
* Return : None
* Note : 横向扫描
*******************************************************************************/
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode,u32 point_color, u32 bk_color)
{
u8 temp,t1,t;
u16 x0 = x;
u32 colortemp; //暂存前景色
//设置窗口
num = num-' ';//得到偏移后的值
if(!mode) //非叠加方式
{
for(t = 0; t < size; t++)
{
if(size == 16)
temp = asc2_1608[num][t]; //调用1608字体
for(t1 = 0; t1 < size/2; t1++)
{
if(temp & 0x01) //前景色
{
colortemp = point_color;
}
else //背景色
{
colortemp = bk_color;
}
LCD_DrawPixel(x,y,colortemp);
temp >>= 1;
x++;
}
x = x0;
y++;
}
}
else //叠加方式
{
for(t = 0;t < size;t++)
{
if(size == 16)
temp = asc2_1608[num][t]; //调用1608字体
for(t1 = 0; t1 < size/2; t1++)
{
if(temp & 0x01)
{
LCD_DrawPixel(x,y,point_color);
}
temp >>= 1;
x++;
}
x = x0;
y++;
}
}
}
/*******************************以下为扩展部分******************************************/
//画点
void LCD_DrawPixel(uint16_t Xpos, uint16_t Ypos, uint32_t RGB_Code)
{
/* Write data value to all SDRAM memory */
if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565)
{ /* RGB565 format */
*(__IO uint16_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (2*(Ypos*LCD_GetXSize() + Xpos))) = (uint16_t)RGB_Code;
}
else
{ /* ARGB8888 format */
*(__IO uint32_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (4*(Ypos*LCD_GetXSize() + Xpos))) = RGB_Code;
}
}
可以发现,下面这条代码是最底层的代码,可以直接操作sdram了。
/* Write data value to all SDRAM memory */
*(__IO uint16_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (2*(Ypos*LCD_GetXSize() + Xpos))) = (uint16_t)RGB_Code;
这里是将(hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (2(YposLCD_GetXSize() + Xpos))) 强制转换为u16的指针 然后取这个指针指向地址的值。那么这个值在内存中是多少位呢? 16位,32位都可以设置!
/ RGB565 format /是16位来表示。
/ ARGB8888 format /是32位来表示的。
A:透明度(Alpha)
R:红色(Red)
G:绿(Green)
B:蓝(Blue)
Bitmap.Config ARGB_8888:由4个8位组成,即A=8,R=8,G=8,B=8,那么一个像素点占8+8+8+8=32位(4字节)
Bitmap.Config ARGB_4444:由4个4位组成,即A=4,R=4,G=4,B=4,那么一个像素点占4+4+4+4=16位 (2字节)
Bitmap.Config RGB_565:没有透明度,R=5,G=6,B=5,,那么一个像素点占5+6+5=16位(2字节)
Bitmap.Config ALPHA_8:每个像素占8位,只有透明度,没有颜色。
一般情况下我们使用的色彩模式为ARGB_8888,这种模式下一个像素所占的大小为4字节,一个像素的位数总和越高,图像也就越逼真。假设有一张480x800的图片,在色彩模式为ARGB_8888的情况下,会占用 4808004/1024KB=1500KB 的内存;而在RGB_565的情况下,占用的内存为:480800*2/1024KB=750KB。**
还有一个疑问!!!
为什么要在sdram 中写入值?
和写入寄存器一样,可以直接控制外设?如果我写入一个字符,那么屏幕上就能显示一个字符?
本文探讨了在LCD显示实验中如何直接操作SDRAM来显示字符。通过介绍RGB565和ARGB8888等不同的色彩模式,解释了不同模式下像素点的位数和内存占用。在ARGB_8888模式下,一个像素点占32位,而RGB_565模式则占16位。此外,文章提出疑问,关于在SDRAM中写入值是否能像控制寄存器那样直接影响外设,特别是对于字符显示的效果。

4209

被折叠的 条评论
为什么被折叠?



