历史上的今天
返回首页

历史上的今天

今天是: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

推荐阅读

史海拾趣

Electronic公司的发展小趣事

特斯拉,虽然是一家电动汽车公司,但其在电子行业的发展中也展现出了强大的跨界创新能力。特斯拉通过自主研发和生产电池、电机等核心零部件,成功将电动汽车的性能和品质提升到了新的高度。同时,特斯拉还积极探索自动驾驶、智能交通等前沿技术,不断推动电动汽车行业的变革和发展。特斯拉的跨界创新不仅颠覆了传统汽车行业的格局,也为电子行业带来了新的机遇和挑战。

请注意,以上故事框架仅供参考,具体细节和数据可能需要根据实际情况进行调整和补充。同时,由于篇幅限制,每个故事的字数可能无法满足500字以上的要求。

Horizon Electronics Enterprises Group公司的发展小趣事

随着工业互联网和智能制造技术的快速发展,Horizon紧跟时代步伐,积极推进数字化转型和智能制造升级。公司引入先进的自动化生产线和智能管理系统,实现生产过程的智能化和精细化管理。通过数字化转型,Horizon不仅提高了生产效率和产品质量,还降低了运营成本和市场风险。同时,公司还积极探索智能制造的新模式和新应用,为电子行业的未来发展贡献智慧和力量。

Hilscher Gesellschaft für Systemautomation mbH公司的发展小趣事

随着在高压电源领域的深入发展,HVPSI逐渐参与到行业标准的制定工作中。公司凭借其在技术上的深厚积累和市场经验,为行业标准的制定提供了宝贵的建议和数据支持。这些标准的出台不仅规范了市场秩序,也进一步巩固了HVPSI在行业内的领先地位。

ALTERA(阿尔特拉)公司的发展小趣事

随着在高压电源领域的深入发展,HVPSI逐渐参与到行业标准的制定工作中。公司凭借其在技术上的深厚积累和市场经验,为行业标准的制定提供了宝贵的建议和数据支持。这些标准的出台不仅规范了市场秩序,也进一步巩固了HVPSI在行业内的领先地位。

富瀚(Fullhan)公司的发展小趣事
设计紧凑合理,安装简便快捷;同时提供清晰的故障指示和便捷的维护接口,方便用户进行日常维护和故障排除。
亿宝科技(CNIBAO)公司的发展小趣事

亿宝科技深知人才是企业发展的关键因素。因此,公司高度重视人才引进和培养工作。通过校园招聘、社会招聘等方式,亿宝科技吸引了一批具有丰富经验和专业技能的人才加入公司。同时,公司还建立了完善的培训体系,为员工提供持续的技能提升和职业发展机会。在人才的共同努力下,亿宝科技不断取得新的突破和成就。

问答坊 | AI 解惑

ADC与DAC专题学习之四——ADC和DAC的静态传输函数

对于DAC和ADC这两者来说,最重要的是记住输入或输出都是数字信号,所以,信号是被量化的。也就是说,N比特字代表2的N次方个可能状态之一,因此,N比特DAC(具有一个固定参考)只能有2的N次方可能的模拟输出,而N比特ADC只能有2的N次方个数字输出。模 ...…

查看全部问答>

汽车电子的公司和汽车电子工程师

转自yulzhu 在EDN的帖子 谈这个话题主要是由我们那唯一的实习生引起的,周四的时候找经理和人力资源谈是否可以留在公司,得到了一个否定的答案,感叹今年虽是名义大年,但是汽车电子零部件的行业终是寒意撩人。 在中国的汽车电子,本土的零配件企 ...…

查看全部问答>

uclinux的内核 大家一般都裁剪到多小?

今天一个家伙对我说 他同事 裁剪带有网络功能的uclinux 到 300多KB. 不带网络功能的 170多KB. 来自EEWORLD合作群:arm linux fpga 嵌入0(49900581) 群主:wangkj…

查看全部问答>

示波器开发,不知如何下手?

我想做个示波器 里面要保存大概500个波形,显示采用液晶显示器 时间采样单位是微秒级别的。 采用什么芯片啊? 板子我们公司没人做? 能找到外协么? 我对嵌入式不是太熟悉 高手们指点下, 怎么开始做啊? 要自己买个开发板么?…

查看全部问答>

JR45代替串口

我想用JR45代替串口 意思是两块板,板间通信做成串口,接线的话用网线接,但是不连网络,只是用网线来代替串口 请问这样可以吗? 是不是在MAX232后面本来是接串口的座,把串口座改成网口那样的水晶座?…

查看全部问答>

请教一个windml初始化的问题,和一个网络传输速度与CPU时钟的问题

首先我想求一个WINDML支持SPI设备的DEMO,多简单都行,关键是初始化的部分.手上的DEMO全都是PCI设备的,PCI设备我没有作过,初始化有一小块看不懂 以EPSON目录下的一个direct 16bit设备,好象是什么806什么的那套DEMO 在xxxDevCreate程序中会调用uglGr ...…

查看全部问答>

讨论:如何在FPGA内实现一个小延时,比如0.5ns?

1. 用组合逻辑搭的话,有什么综合和布线策略可以保证延时的精度呢?2. 另外,刚刚看到说明文档,说pll输出时钟的最小相移是VCO周期除以8,这个时间是可以满足的。不过我自己做了个实验如下:10M输入,输出三个100M,相移分别为c0:0.31ns,c1:0.62ns ...…

查看全部问答>

IAR FOR MSP430数据类型

数据类型 字节 数据范围 说明 sfrb 1 字节类型的特殊功能寄存器或外围模块 sfrw 1 字类型的特殊功能寄存器或外围模块 unsigned char 1 0~255 ...…

查看全部问答>

国际高手请进――我的IO是怎么回事?

我的IO口置高以后,用示波器一测量,才1.4V~1.5V,不知道是怎么回事? 我的IO是接在一个10K电阻上,再经过一个10K电阻的分压,给一个SC1815做开关信号控制,SC1815又控制着一个小继电器,上电后,继电器老是来回熄合,“啪啪”来回开关,真是郁闷 ...…

查看全部问答>