jz2440-----裸板lcd学习(显示图片)

详细讲解:https://blog.csdn.net/thisway_diy/article/details/79397999

算了,讲解的话还是看韦老师的吧。

学习呢,当然要有成果吧,我将自己的成果分享出来。

首先先上图再说:

jz2440-----裸板lcd学习(显示图片)_第1张图片         

下面是lcd初始化(没有什么特别的,按照老师所讲就可以了)   

void lcd_init(void)
{


	GPBCON &= ~0x3;
	GPBCON |= 0x01;

		/* LCD专用引脚 */
	GPCCON = 0xaaaaaaaa;
	GPDCON = 0xaaaaaaaa;

		/* PWREN */
	GPGCON |= (3<<8);


/*
	*[27:18]为只读数据位,不需要设置;
	*[17:8]用于设置CLKVAL(像素时钟频率),我们使用的是TFT屏,因此采用的公式是VCLK = HCLK / [(CLKVAL+1) x 2],
		其中HCLK为100M。LCD手册里面Clock cycle的要求范围为5-12MHz即可,
		即假设VCLK=9,根据公式9=100/[(CLKVAL+1)x2],算出CLKVAL≈4.5=5。
		VCLK为plcdparams->time_seq.vclk,则clkval = HCLK/plcdparams->time_seq.vclk/2-1+0.5;
	*[7]不用管,默认即可;
	*[6:5]TFT lcd配置为0b11; 11为TFT LCD面板
	*[4:1]设置bpp模式,根据传入的plcdparams->bpp配置为相应的数值;这里0b1100 = TFT的16bpp
	*[0]LCD输出使能,先暂时关闭不输出;
*/
	LCDCON1 |= ((4<<8)|(3<<5)|(12<<1));

	/*这是垂直方向的
	 * 对比2440LCD部分时序图和LCD时序图,得出两者之间关系,以后就可通过plcdparams传参数进来设置相关寄存器。
		按照lcd手册推荐
		[31:24] : VBPD = tvb - 1---------2

		[23:14] : LINEVAL = line - 1-----272

		[13:6] : VFPD = tvf - 1	---------2

		[5:0] : VSPW = tvp - 1-----------10
	 *
	 */
	LCDCON2 |= (((2-1)<<24)|((272-1)<<14)|((2-1)<<6)|((10-1)<<0));

	/*
	[25:19] : HBPD = thb - 1------2

	[18:8] : HOZVAL = 列 - 1------480

	[7:0] : HFPD = thf - 1--------2
	*/
	LCDCON3 |=(((2-1)<<19)|((480-1)<<8)|((2-1)<<0));

	/*[7:0] : HSPW = thp - 1*/

	LCDCON4 |=((41-1)<<0);

	/*
	 * 用来设置引脚极性, 设置16bpp, 设置内存中象素存放的格式
			这些位值要与lcd手册的时序和s3c2440的lcd控制器的时序相结合
			[12] : BPP24BL
			[11] : FRM565, 1-565-------0B1
			[10] : INVVCLK, 0 = The video data is fetched at VCLK falling edge----0B0
			[9] : HSYNC是否反转
			[8] : VSYNC是否反转
			[7] : INVVD, rgb是否反转
			[6] : INVVDEN
			[5] : INVPWREN
			[4] : INVLEND
			[3] : PWREN, LCD_PWREN output signal enable/disable
			[2] : ENLEND
			[1] : BSWP
			[0] : HWSWP
	 */
	LCDCON5 |= ((1<<11)|(0<<10)|(1<<9)|(1<<8)|(0<<7)|(0<<6)|(0<<5)|(1<<0));

	/*
	 * 	[29:21] : LCDBANK, A[30:22] of fb

		[20:0] : LCDBASEU, A[21:1] of fb

		即用[29:0]表示起始地址的[30:1]。
	 */
	LCDSADDR1 =	((0x33c00000&(~(1<<31)))>>1);


	/*
		 * [20:0] : LCDBASEL, A[21:1] of end addr

			即framebuffer的结束地址。
	 */

	LCDSADDR2 = (((0x33c00000+480*272*16/8)>>1)&0x1fffff);
}


void s3c2440_lcd_controller_enalbe(void)
{
	GPBDAT |= (1<<0);

	LCDCON5 |= (1<<3);

	LCDCON1 |= (1<<0);
}

void s3c2440_lcd_controller_disable(void)
{
	GPBDAT &= ~(1<<0);

	LCDCON5 &= ~(1<<3);

	
	LCDCON1 &= ~(1<<0);


}

 实现显示图片代码

unsigned short tajiong;

p = 0x33c00000;
for (x = 0; x < 480*270*2; )
							//for (y = 0; y < 272; y++)
{

	tajiong = (gImage_my[x]<<8)|gImage_my[x+1];
	*p++ = tajiong;
	x = x+2;
}

将图片转为.h或.c文件(可以通过Img2Lcd这个软件转换)

如果有人用这个软件,会知道图片的像素以8位来转换成.h或.c文件。如果是LCD设置为16bpp(上面的480*270*2而不是480*270的原因),可以用上面的函数。其他bpp类似。

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(jz2440,lcd)