当前位置:首页 > 单片机 > 单片机
[导读]很多的嵌入式系统都需要人机交互,对于输出设备,LCD以其显示质量高、画面效果好等优点得到了极其广泛的应用。s3c2416包含了一个LCD控制器,笔者此处就s3c2416的LCD应用作一个简单的介绍。1、LCD控制器概述1.1. 接口

很多的嵌入式系统都需要人机交互,对于输出设备,LCD以其显示质量高、画面效果好等优点得到了极其广泛的应用。s3c2416包含了一个LCD控制器,笔者此处就s3c2416的LCD应用作一个简单的介绍。

1、LCD控制器概述1.1. 接口

s3c2416的LCD控制器包含了一系列的逻辑单元用以支持把图像数据从系统主存储中的帧缓存传输到外部的LCD驱动接口中。LCD的驱动接口支持RGB和i80总线的显示设备。i80是intel提出的标准总线,如目前还在大量使用的8位51单片机,其存储器接口即为i8080接口。这种接口的显示屏内置LCD驱动芯片,有自己的帧缓存,能够自刷新,因此,处理器可以仅在需要修改屏幕显示时传输显示数据到LCD接口中。这种屏需解码处理器过来的命令数据,写屏速度较慢,适用于小尺寸的LCD屏。RGB显示屏显存由系统内存充当,处理器只要把显示的数据写入到相应的帧缓存中,启动显示后,LCD控制器通过专用DMA自动把显存的数据经接口传输到LCD屏中。因此,RGB屏的显示速度可以很快,常用于大尺寸的LCD屏中。笔者采用的是800*480像素点、16位RGB接口屏,因此以RGB接口屏作为讲解。

1.2. 虚拟屏幕

s3c2416 LCD控制器支持虚拟屏幕,可以设置一个较大的帧缓存,用来作为显示数据的缓冲池,屏幕大小是有限的,显示的数据也是有限的,可能只能显示帧缓存的一部分,所以将屏幕要显示的那部分内容叫做帧视口(View Port)。当需要水平或垂直滚屏时,只需更改帧视口相应的地址寄存器即可显示帧缓存中这部分的内容。例如,我们手机的地图应用,手机屏幕能看到的地图只是其中一部分,可以来回拖动看地图的相邻部分,而无需处理器在拖动时更改帧缓存的数据,提高系统性能。

图1-1. 虚拟屏幕滚动实例

1.3. 窗口混合

s3c2416 LCD控制器具有二层窗口,窗口0数据与窗口1对应数据经过alpha混合后再实际输出到屏接口中,其作用就是实现一种半透明(透明度0~1)的效果。可以选择平面混合,也可以选择像素混合,平面混合就是对窗口0与窗口1的所有像素点进行alpha混合,像素混合就是可以定义一种基色值,当窗口中的相应像素色值匹配到设定的基色时,可设定为完全透明,即直接看到背景窗口,窗口未匹配到基色的部分可以设定为原样显示。如果读者了解photoshop的话,窗口混合就像两个图层可以设置不同的透明度混合显示,或上一图层删除选区外的图像(透明基色),实现选中的物体贴合在背景图片上。这种特性可以在我们鼠标光标、不规则按钮的实现等应用中。这种特性可以减少系统总的数据速率,增强系统性能。

图1-2 alpha混合以及基色应用

2. 驱动实现2.1. RGB驱动编写要点

LCD在使用前需要根据所用屏的参数进行初始化设置,之后上层即可正确调用模块提供的底层驱动函数,实现相应的显示。

设置信号线,RGB接口需用到RGB_HSYNC、RGB_VSYNC、RGB_VCLK、RGB_VDEN、RGB_VD[23:0],从引脚配置寄存器GPCCON、GPDCON中选择相应引脚功能。

设置RGB的数据格式,如设置屏的色深,像素在帧缓存中存放方式是高位在前还是低位在前,笔者使用的是16bpp (non-palletized, R: 5-G:6-B:5 ),像素数据在帧缓存存放方式需半字交换,在WINCON0、WINCON1中进行相应的设置。

设置数据传输时钟,LCD需要一个同步时钟来接收数据,这个参数也决定LCD屏刷新频率。通常LCD屏的刷新频率在60HZ~100HZ之间,低于60HZ,显示可能会闪烁,刷新频率过高也将造成LCD控制器数据传输率大大增加,虽然LCD控制器有LCD-DMA,数据传输时不占用cpu,但需占用系统总线,总线负载大,系统的性能受到影响。通常这个参数根据屏spec进行设置,笔者设置为33M(屏要求26.4M~46.8M)。

时序控制参数设置,根据屏的spec设定VBPD、VFPD、VSPW、HBPD、HFPD、HSPW,这些参数设置均有一定的裕度。VBPD(verticalbackporch)表示在一帧图像开始时,垂直同步信号以后的无效的行数;VFBD(verticalfrontporch)表示在一帧图像结束后,垂直同步信号以前的无效的行数;VSPW(verticalsyncpulsewidth)表示垂直同步脉冲的宽度,用行数计算;HBPD(horizontalbackporch)表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数;HFPD(horizontalfrontporth)表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数;HSPW(horizontalsyncpulsewidth)表示水平同步信号的宽度,用VCLK计算。

屏像素大小设置,屏实际水平像素点减1值(HOZVAL),垂直像素点减1值(LINEVAL)写入到VIDTCON2寄存器中。

帧缓存的地址设置,在窗口0与窗口1中相应的帧缓存地址寄存器中写入帧起启地址以及结束地址。

启用相应的显示窗口、启动LCD控制逻辑进行数据传输并开启背光。

2.2. 编程实现

LCD正确初始化完后,还需各种功能调用实现对屏的驱动显示。如最基本的画点、画线、清屏、显示字符、显示图形等功能。这些功能在各种GUI中均有实现,因此,笔者此处只给出GUI移植时最基本的设置某个像素、读取某个像素的函数实现,其余屏操作实现不再重述。在main.c测试代码中将给出双窗口显示,字体在背景中水平滚动的实例,以让读者对s3c2416 LCD控制器双窗口、alpha混合有一个了解,这种特性在一些应用中是非常有作用的。

模块lcd_rgb.c驱动实现如下:

#include"s3c2416.h"

#include "lcd_rgb.h"

#define VBPD 15

#define VFPD 5

#define VSPW 5

#define HBPD 25

#define HFPD 88

#define HSPW 20

static unsigned shortFrameBuffer[HSize*VSize];

unsigned short*GetFrameBuffer()

{

return FrameBuffer;

}

void LCD_Enable(intEnable)

{

if (Enable) {

rVIDCON0 "= (0x03 << 0);

} else {

rVIDCON0 &= ~(0x03 << 0);

}

}

voidLCD_BackLight(int On)

{

rGPBCON &= ~(0x3 << 0);

rGPBCON |= (0x1 << 0);

if (On) {

rGPBDAT |= (0x1 << 0);

} else {

rGPBDAT &= ~(0x1 << 0);

}

}

void LCD_RGB_Init()

{

rGPCCON = 0xaaaa02aa; // GPC配置为RGB数据[7:0]、控制功能

rGPDCON = 0xaaaaaaaa; // GPD配置为RGB[23:8]

LCD_Enable(0);

// 16bpp (R5-G6-B5),第一像素在内存低地址,选择buffer0

rWINCON0 = (5<<2) | (1<<16) |(0<<23);

rWINCON1 = (5<<2) | (1<<16) |(1<<6);

// 选择HCLK=100M,3分频得到VCLK=33.3M,RGB并口格式(RGB),暂不启动控制逻辑

rVIDCON0 = (0<<22) |(0<<13) | (0<<12) | (2<<6) |

(1<<5) | (1<<4) | (0<<2) |(0<<0);

// VCLK下降沿锁存数据,行场同步信号低激活,数据使能高有效

rVIDCON1 = (0<<7) |(1<<6) | (1<<5) | (0<<4); //设置时序控制参数

rVIDTCON0 =((VBPD-1)<<16) | ((VFPD-1)<<8) | ((VSPW-1)<<0);

rVIDTCON1 =((HBPD-1)<<16) | ((HFPD-1)<<8) | ((HSPW-1)<<0);

// 设置屏幕像素尺寸

rVIDTCON2 =((VSize-1)<<11) | ((HSize-1)<<0);

// 设置OSD图像与屏幕尺寸一致

rVIDOSD0A = (0<<11) |(0<<0);

rVIDOSD0B = ((HSize-1)<<11)| ((VSize-1)<<0);

rVIDOSD1A =(0<<11) | (0<0);

rVIDOSD1B = ((HSize-1)<<11) |((VSize-1)<<0);

// alpha混合方式,基色匹配时全透明,未匹配部分完全不透明

rVIDOSD1C = 0xfff000;

// 设置帧缓存的地址

rVIDW00ADD0B0 = (unsigned int)FrameBuffer;

rVIDW00ADD1B0 = ((unsigned int)(FrameBuffer+ HSize*VSize) & 0xffffff);

// 不使用虚拟屏幕

rVIDW00ADD2B0 = (00<<13) |((HSize*2)<<0);

// 窗口0使用

rWINCON0 |= (1 << 0);

LCD_Enable(1);

LCD_BackLight(1);

}

voidLCD_ClearScreen(unsigned short BackColor)

{

unsigned int i;

for (i=0; i

FrameBuffer[i] = BackColor;

}

}

voidLCD_SetPixel(unsigned int x, unsigned int y, unsigned short Color)

{

/* if ((x >= HSize) || (y >= VSize)) {

return;

}

*/

FrameBuffer[y*HSize+x] = Color;

}

unsigned shortLCD_GetPixel(unsigned int x, unsigned int y)

{

/*

if ((x >= HSize) || (y >= VSize)) {

return 0;

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

IIC是Philips推出的芯片间串行传输总线,它以二根连线实现完善的全双工同步数据传送,可以极方便地构成多机系统和外围器件扩展系统。由于其接口简单灵活,很多外围器件均提供了IIC接口,如手机、平板常用的重力传感器

关键字: s3c2416 裸机开发 iic驱动

现在主要讲解一下在GCC移植UCGUI,Makefile工程如何加入目录,加入源码,c标准库,编译选项的设置。笔者的Makefile模板提取自uboot,工程中加入目录,加入源码都是很简单的,详细的介绍请参考前面章节”...

关键字: gcc s3c2416 ucgui 移植 裸机开发

jpeg格式是一种针对相片影像而广泛使用的一种失真压缩标准,其压缩技术十分先进,用有损压缩方式去除冗余的图像数据,在获得极高压缩率的同时,能展现十分丰富生动的图像,能用最少的磁盘空间得到较好的图像品质。由

关键字: s3c2416 移植 裸机开发 libjpeg

在消费电子产品中,往往都会用到音频系统来播放音乐、进行通话等多媒体应用,此外,对于一些需语音提示的产品,音频部分都是不可或缺的功能。笔者此处就s3c2416的音频驱动实现作一个简单的介绍。1. IIS音频总线s3c24

关键字: s3c2416 裸机开发 音频驱动

S3C2416裸机开发系列十八_音频驱动实现(2)标签:WM8960IIS音频驱动s3c2416裸机开发2014-06-10 09:50853人阅读评论(0)收藏举报分类:s3c2416裸机开发(24)版权声明:本文为博...

关键字: s3c2416 裸机开发 音频驱动

在嵌入式设计中,由于Nand Flash具有大容量,擦写次数高,接口简单等优点,常用作固化存储器。S3C2416支持Nand启动,因此Nand存储器可以直接保存固化代码以及其它的数据。笔者在此简单的介绍Nand flas...

关键字: nand驱动 s3c2416 裸机开发 nand启动

笔者前面章节简单介绍了s3c2416启动代码的实现过程,启动代码就是用来处理cpu体系结构中一些底层内容,一个功能强大的启动代码是可以当作bootloader(如uboot)来用的。有了启动代码,用户就可以专注于用c来作...

关键字: mdk s3c2416 启动代码 裸机开发

启动代码是处理器上电复位后最先运行的一段代码。主要是用来把处理器初始化到一个确定的状态,为c运行环境作好准备。如设置异常向量表,初始化系统时钟,初始化外部内存,把用户代码拷贝到外部内存,初始化栈,清0全

关键字: s3c2416 启动代码 流水灯 裸机开发

S3C2416裸机开发系列十九_Fatfs下播放录音wav音频文件标签:wavfatfs音频播放s3c2416sd驱动2014-06-11 09:551938人阅读评论(0)收藏举报分类:s3c2416裸机开发(24)版...

关键字: s3c2416 裸机开发 播放录音 音频文件

对于处理器来说,都不可能内置过大的内存,只保留一小块SRAM作为芯片启动用。例如S3C2416内部SRAM只有64k,其中8k是作为SteppingStone,用来做一些基本的初始化,并进一步引导用户的代码启动。用户的代...

关键字: s3c2416 初始化 裸机开发 外部内存 代码搬移
关闭
关闭