本实验CPU:s3c2440
LCD: 4.3寸 分辨率(Resolution) 480*272 TFT-LCD 型号AT043TN24 V.1
s3c2440 LCD控制器支持:
①1/2/4/8bpp调色板显示模式,16bpp/24bpp非调色板显示模式
当选定了LCD型号后,硬件工程师做出电路板后,LCD模块接线确定,显示模式就确定了,如本实验使用8bpp调色板显示模式和16bpp非调色板显示模式,两种模式均为565像素格式
NOTE:
①24bpp表示24bit per pixel 即每像素用24位表示,正好对应RRGGBB颜色值
24bpp内存数据格式为:
P1是位于内存地址000H的高位或地位的颜色值X,lcd控制器取像素值往数据线VD[0-23]发,其中RR->VD[16-23], GG->VD[8-15],BB->VD[0-7],然后可以第一个像素显示此颜色值X
②16bpp
显示器上像素由三部分红(R)/绿(G)/蓝(B)组成,称为三原色,每个颜色由8位表示,即每个颜色有256级,可以由此三原色构成其它的颜色,比如RGB(255,255,255)合成白色, color(AARRGGBB(AA表示透明度))为UINT32型,因此需要取出16位构成像素颜色值(如何取代码有介绍),然后将16位颜色值存到Framebuffer中
③8bpp调色板模式
其中P1表示索引值index,范围为00H-FFH(15-4表也可看出),
16bpp/8bpp程序 结构:
Ⅰ.main.c提供菜单选择8bpp或16bpp显示模式:
main.c:
int main()
{
char c;
uart0_init(); // 波特率115200,8N1(8个数据位,无校验位,1个停止位)
while (1)
{
printf("rn##### Test TFT LCD #####rn");
printf("[1] TFT240320 8Bitnr");
printf("[2] TFT240320 16Bitnr");
/*
* author:xyc 添加支持480272 8Bit/16Bit
*/
printf("[3] TFT480272 8Bitnr");
printf("[4] TFT480272 16Bitnr");
printf("Enter your selection: ");
c = getc();
printf("%cnr", c);
switch (c)
{
case '1':
{
Test_Lcd_Tft_8Bit_240320();
break;
}
case '2':
{
Test_Lcd_Tft_16Bit_240320();
break;
}
case '3':
{
Test_Lcd_Tft_8Bit_480272();
break;
}
case '4':
{
Test_Lcd_Tft_16Bit_480272();
break;
}
default:
break;
}
}
return 0;
}
Ⅱ.lcdlib.c调用lcddrv.c中的 Lcd_Port_Init()
Tft_Lcd_Init(MODE_TFT_8BIT_480272)
Lcd_PowerEnable(0, 1)
Lcd_EnvidOnOff(1)
ClearScr(0x0)
DrawLine(0 , 0 , 479, 0 , 0)
ClearScr(128)
ClearScrWithTmpPlt(0x0000ff)
等等用于初始化LCD引脚,初始化LCD控制器,打开电源,视频数据输出使能和背光等
lcdlib.c:
❶16bpp:
/*
* author:xyc 添加480272屏幕16bpp支持
* 以480x272,16bpp的显示模式测试TFT LCD
*/
void Test_Lcd_Tft_16Bit_480272(void)
{
Lcd_Port_Init(); // 设置LCD引脚
Tft_Lcd_Init(MODE_TFT_16BIT_480272); // 初始化LCD控制器
Lcd_PowerEnable(0, 1); // 设置LCD_PWREN有效,它用于打开LCD的电源
Lcd_EnvidOnOff(1); // 使能LCD控制器输出信号
ClearScr(0x0); // 清屏,黑色
printf("[TFT 64K COLOR(16bpp) LCD TEST]n");
printf("1. Press any key to draw linen");
getc();
DrawLine(0 , 0 , 479, 0 , 0xff0000); // 红色
DrawLine(0 , 0 , 0 , 271, 0x00ff00); // 绿色
DrawLine(479, 0 , 479, 271, 0x0000ff); // 蓝色
DrawLine(0 , 271, 479, 271, 0xffffff); // 白色
DrawLine(0 , 0 , 479, 271, 0xffff00); // 黄色
DrawLine(479, 0 , 0 , 271, 0x8000ff); // 紫色
DrawLine(240, 0 , 240, 319, 0xe6e8fa); // 银色
DrawLine(0 , 136, 479, 136, 0xcd7f32); // 金色
printf("2. Press any key to draw circlesn");
getc();
Mire();
printf("3. Press any key to fill the screem with one colorn");
getc();
ClearScr(0xff0000); // 红色
printf("4. Press any key to fill the screem by temporary paletten");
getc();
ClearScrWithTmpPlt(0x0000ff); // 蓝色
printf("5. Press any key stop the testingn");
getc();
Lcd_EnvidOnOff(0);
}
❷8bpp:
/*
* author:xyc 添加480272屏幕支持
* 以480x272,8bpp的显示模式测试TFT LCD
*/
void Test_Lcd_Tft_8Bit_480272(void)
{
Lcd_Port_Init(); // 设置LCD引脚
Tft_Lcd_Init(MODE_TFT_8BIT_480272); // 初始化LCD控制器
Lcd_PowerEnable(0, 1); // 设置LCD_PWREN有效,它用于打开LCD的电源
Lcd_EnvidOnOff(1); // 使能LCD控制器输出信号,背光打开
Lcd_Palette8Bit_Init(); // 初始化调色板
ClearScr(0x0); // 清屏
printf("[TFT 64K COLOR(16bpp) LCD TEST]n");
printf("1. Press any key to draw linen");
getc();
#if 0
DrawLine(0 , 0 , 239, 0 , 0); // 颜色为DEMO256pal[0]
DrawLine(0 , 0 , 0 , 319, 1); // 颜色为DEMO256pal[1]
DrawLine(239, 0 , 239, 319, 2); // ……
DrawLine(0 , 319, 239, 319, 4);
DrawLine(0 , 0 , 239, 319, 8);
DrawLine(239, 0 , 0 , 319, 16);
DrawLine(120, 0 , 120, 319, 32);
DrawLine(0 , 160, 239, 160, 64);
#endif
DrawLine(0 , 0 , 479, 0 , 0); // 颜色为DEMO256pal[0]
DrawLine(0 , 0 , 0 , 271, 1); // 颜色为DEMO256pal[1]
DrawLine(479, 0 , 479, 271, 2);
DrawLine(0 , 271, 479, 271, 4);
DrawLine(0 , 0 , 479, 271, 8);
DrawLine(479, 0 , 0 , 271, 16);
DrawLine(240, 0 , 240, 319, 32);
DrawLine(0 , 136, 479, 136, 64);
printf("2. Press any key to draw circlesn");
getc();
Mire();
printf("3. Press any key to fill the screem with one colorn");
getc();
ClearScr(128); // 输出单色图像,颜色为DEMO256pal[128]
printf("4. Press any key to fill the screem by temporary paletten");
getc();
ClearScrWithTmpPlt(0x0000ff); // 输出单色图像,颜色为蓝色
printf("5. Press any key to fill the screem by paletten");
getc();
DisableTmpPlt(); // 关闭临时调色板寄存器
ChangePalette(0xffff00); // 改变整个调色板为黄色,输出单色图像
printf("6. Press any key stop the testingn");
getc();
Lcd_EnvidOnOff(0);
}
1.1 lcddrv.c包含Lcd_Port_Init(),Tft_Lcd_Init(),Lcd_PowerEnable(),Lcd_EnvidOnOff(),Lcd_Palette8Bit_Init()函数的定义实现:
1.1.1 Lcd_Port_Init()设置GPC GPD端口为LCD控制信号和LCD视频数据等端口:
/*
* 初始化用于LCD的引脚
*/
void Lcd_Port_Init(void)
{
GPCUP = 0xffffffff; // 禁止内部上拉
GPCCON = 0xaaaaaaaa; // GPIO管脚用于VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND
GPDUP = 0xffffffff; // 禁止内部上拉
GPDCON = 0xaaaaaaaa; // GPIO管脚用于VD[23:8]
/*author:xyc 背光关闭GPB0端口为LED背光口,而不是电源,所以注释有误*/
GPBCON &= ~(GPB0_MSK); // Power enable pin
GPBCON |= GPB0_out;
GPBDAT &= ~(1<<0); // Power off
printf("Initializing GPIO ports..........n");
}
1.1.2 Tft_Lcd_Init()设置LCD控制器时序,帧内存地址等等:
/*
* 初始化LCD控制器
* 输入参数:
* type: 显示模式
* MODE_TFT_8BIT_240320 : 240*320 8bpp的TFT LCD
* MODE_TFT_16BIT_240320 : 240*320 16bpp的TFT LCD
* MODE_TFT_8BIT_480272 : 480*272 8bpp的TFT LCD
* MODE_TFT_16BIT_480272 : 480*272 16bpp的TFT LCD
*/
void Tft_Lcd_Init(int type)
{
switch(type)
{
/*
* author: xyc 添加480x272屏幕8Bpp支持
*/
case MODE_TFT_8BIT_480272:
/*
* 设置LCD控制器的控制寄存器LCDCON1~5
* 1. LCDCON1:
* 设置VCLK的频率:VCLK(Hz) = HCLK/[(CLKVAL+1)x2]
* 选择LCD类型: TFT LCD
* 设置显示模式: 8BPP
上一篇:02-JZ2440裸机学习之系统时钟和UART串口实验
下一篇:JZ2440开发板直连电脑实现三者互PING
推荐阅读最新更新时间:2024-11-12 10:36
设计资源 培训 开发板 精华推荐
- 逛工业自动化展TE Connectivity网上展厅,答题赢好礼!
- 【说出你的故事】跨平台转换——你做?还是不做?
- 有奖直播|相约Keysight World 2019“汽车电子及新能源汽车测试”论坛
- 有奖活动|TE无线连接,释放物联网无限潜能!
- 有奖直播|罗彻斯特电子半导体全周期解决方案 助您应对供应链中断和元器件停产的挑战
- 2023 Digikey KOL 视频系列第一期
- 有奖直播:英飞凌针对电动工具的高功率、高效率以及高可靠性解决方案
- 4月TI两场EP直播,都挺好:超声气体流量计量创新方案+SimpleLink平台小鲜肉CC13X2/CC26X2专场
- ublox无线开发板EVK-NINA-B400免费申请
- 一起哇:基于国产芯、便携烙铁系统IronOS(FreeRTOS)的智能烙铁