历史上的今天
今天是:2025年04月17日(星期四)
2020年04月17日 | JZ2440开发板-TFT LCD实验
2020-04-17 来源:eefocus
本实验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
史海拾趣
|
对于DAC和ADC这两者来说,最重要的是记住输入或输出都是数字信号,所以,信号是被量化的。也就是说,N比特字代表2的N次方个可能状态之一,因此,N比特DAC(具有一个固定参考)只能有2的N次方可能的模拟输出,而N比特ADC只能有2的N次方个数字输出。模 ...… 查看全部问答> |
|
转自yulzhu 在EDN的帖子 谈这个话题主要是由我们那唯一的实习生引起的,周四的时候找经理和人力资源谈是否可以留在公司,得到了一个否定的答案,感叹今年虽是名义大年,但是汽车电子零部件的行业终是寒意撩人。 在中国的汽车电子,本土的零配件企 ...… 查看全部问答> |
|
今天一个家伙对我说 他同事 裁剪带有网络功能的uclinux 到 300多KB. 不带网络功能的 170多KB. 来自EEWORLD合作群:arm linux fpga 嵌入0(49900581) 群主:wangkj… 查看全部问答> |
|
我想做个示波器 里面要保存大概500个波形,显示采用液晶显示器 时间采样单位是微秒级别的。 采用什么芯片啊? 板子我们公司没人做? 能找到外协么? 我对嵌入式不是太熟悉 高手们指点下, 怎么开始做啊? 要自己买个开发板么?… 查看全部问答> |
|
请教一个windml初始化的问题,和一个网络传输速度与CPU时钟的问题 首先我想求一个WINDML支持SPI设备的DEMO,多简单都行,关键是初始化的部分.手上的DEMO全都是PCI设备的,PCI设备我没有作过,初始化有一小块看不懂 以EPSON目录下的一个direct 16bit设备,好象是什么806什么的那套DEMO 在xxxDevCreate程序中会调用uglGr ...… 查看全部问答> |
|
1. 用组合逻辑搭的话,有什么综合和布线策略可以保证延时的精度呢?2. 另外,刚刚看到说明文档,说pll输出时钟的最小相移是VCO周期除以8,这个时间是可以满足的。不过我自己做了个实验如下:10M输入,输出三个100M,相移分别为c0:0.31ns,c1:0.62ns ...… 查看全部问答> |
|
数据类型 字节 数据范围 说明 sfrb 1 字节类型的特殊功能寄存器或外围模块 sfrw 1 字类型的特殊功能寄存器或外围模块 unsigned char 1 0~255 ...… 查看全部问答> |
|
我的IO口置高以后,用示波器一测量,才1.4V~1.5V,不知道是怎么回事? 我的IO是接在一个10K电阻上,再经过一个10K电阻的分压,给一个SC1815做开关信号控制,SC1815又控制着一个小继电器,上电后,继电器老是来回熄合,“啪啪”来回开关,真是郁闷 ...… 查看全部问答> |




