9.lcd显示实验

本文探讨了在LCD显示实验中如何直接操作SDRAM来显示字符。通过介绍RGB565和ARGB8888等不同的色彩模式,解释了不同模式下像素点的位数和内存占用。在ARGB_8888模式下,一个像素点占32位,而RGB_565模式则占16位。此外,文章提出疑问,关于在SDRAM中写入值是否能像控制寄存器那样直接影响外设,特别是对于字符显示的效果。

显示字符

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的情况下,会占用 480
8004/1024KB=1500KB 的内存;而在RGB_565的情况下,占用的内存为:480800*2/1024KB=750KB。**

还有一个疑问!!!
为什么要在sdram 中写入值?
和写入寄存器一样,可以直接控制外设?如果我写入一个字符,那么屏幕上就能显示一个字符?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值