基于uCGUI的数据显示系统

本文详细介绍了uc/gui在arm 内核s3c44b0x的移植。实践证明uc/gui具有良好的实时性和稳定性以及广泛的应用前景。
1 硬件连接与液晶显示原理
本设计使用的硬件采用arm7开发板,液晶模块为l78c64,它是7.8in 256色stn型lcd显示屏,分辨率为640×480。
lcd控制器外部接口信号的定义及其与lcd模块各信号之间的对应关系如下:
(1)vframe:lcd控制器与lcd驱动器之间的帧同步信号。该信号负责指出lcd屏新的一帧开始的时间。lcd控制器在一个完整帧显示完成后立即插入一个vframe信号,并开始新一帧的显示。该信号与lcd模块的yd信号相对应;
(2)vline:lcd控制器和lcd驱动器之间的线同步脉冲信号。该信号用于将lcd驱动器水平线(行)移位寄存器的内容传送给lcd屏显示。lcd控制器在整个水平线(整行)数据移入lcd控制器后,插入一个vline信号。该信号与lcd模块的lp信号相对应;
(3)vclk:lcd控制器和lcd驱动器之间的像素时钟信号。由lcd控制器送出的数据在vclk的上升沿处送出,在vclk的下降沿被lcd驱动器采样。该信号与lcd模块的xck信号相对应;
(4)vm:lcd驱动器的ac信号。vm信号被lcd驱动器用于改变行和列的电压极性,从而控制像素点的显示和熄灭。vm信号可以与每个帧同步,也可以与可变数量的vline信号同步;
(5)vd3~0 lcd:像素点的数据输入端口。与lcd模块的d3~0相对应:
(6)vd7~4 lcd:像素点的数据输入端口。与lcd模块的d7~4相对应。
液晶显示原理:写满整个屏的数据称为1个“帧”数据,yd是帧同步信号,该信号启动lcd屏的新一帧数据。两个yd脉冲之间的时间长度称为帧周期。根据lcd模块的特性,刷新时间为12~14ms,频率为70~80hz。每一帧包括480个lp脉冲。lp为行(共480行)数据输入锁存信号,也就是行同步脉冲信号。该信号启动lcd屏的新一行数据。xck为行数据输入信号,也就是每1行中像素点数据传输的时钟信号。每组8位的数据在xck的下降沿被输入锁存,因此,每1行包括640×3/8个xck脉冲信号。d0~d7是8位的显示数据输入信号。
2 驱动程序设计
下面分三步完成液晶的初始化。
(1)i/o口的初始化
由于采用s3c44b0x的pc接口和pd接口作为lcd驱动接口,因此,需要设置pc接口工作在第3功能状态和pd接口工作在第2功能状态。
(2)相应控制寄存器的设置方法
s3c44b0x包括一个lcd控制器时序发生器timegen, 由它来产生vfram,vline,vclk和vm 控制时序。这些控制信号由寄存器lcocon1和lcdcon2进行配置。通过对寄存器种配置项目的设置,timegen就可以产生适应于各种lcd屏的控制信号了。
vfram 和vline脉冲的产生是通过对lcdcon2寄存器的hozval和lineval进行配置来完成的。每个域都与lcd的尺寸和显示模式有关。
其中,hozval=(显示宽度/vd数据线位数)-1。
在彩色模式下,显示宽度=3×每行的像素点数。
对所选的液晶模块,hozval=(640×3/8)-1;lineval=(显示宽度)-1。
对所选的液晶模块,llneval=480-1。
vclk信号的频率可以通过lcdcon1寄存器的clkval域来确定,即
vclk=mclk/(clkval×2)
lcd控制器的最大vclk频率为16.5mhz,几乎支持所有已有的lcd驱动器。由于上述关系,clkval的值决定了vclk的频率。为了确定clkval的值,应该计算一下lcd控制器向vd端口传输数据的速率,以便使vclk的值大于数据传输的速率。
数据传输速率的公式为:
数据传输速率=hs×vs×fr×mv
其中,hs—lcd的行像素值;vs—lcd的列像素值:fr—帧速率;mv—模式值,这里取8位单扫描,彩色。
对于所选用的液晶模块:hs=640;vs=480;fr=70hz:mv=3/8。因此,数据传输速率=640×480×70×3/8=8,064,000hz。
vclk值应该大于8mhz而小于16mhz,因此,clkval可以取9~15。
(3)完整的液晶初始化程序
void lcd_init_controler()
{rlcdcon1=(0)|(2<<5)|(mval_used<<7)|(0x3<<8)|(0x3<<10)|(clkval_color<<12);
//disable,8b_sngl_scan,wdly=8clk,wlh=8clk,rlcdcon2=
(lineval)|(hozval_color<<10)|(10<<21);
//lineblank=10(without any calculation)
rlcdsaddr1= (0x322)1);
//256-color,lcdbank,lcdbaseu
rlcdsaddr2=m5d((((u32)framebuffer256+(scr_xsize*lcd_ysize))>>1))|(mval<<21);
rlcdsaddr3= (lcd_xsize/2) | (((scr_xsize-lcd_xsize)/2)<<9);
//the following value has to be changed forbetter display.
rredlut =0xfdb96420;
rgreenlut=0xfdb96420;
rbluelut=0xfb40;
rdithmode=0x0;
rdp1_2=0xa5a5;
rdp4_7=0xba5da65;
rdp3_5=0xa5a5f;
rdp2_3=0xd6b;
rdp5_7=0xeb7b5ed:
rdp3_4=0x7dbe;
rdp4_5=0x7ebdf;
rdp6_7=0x7fdfbfe;
rlcdcon1= (1)|(2<<5)|(0<<7)|(0x3<<8)|(0x3<<10)|(4<<12);
经过以上几步,就完成了液晶的硬件驱动,下面就是移植软件包,调用底层驱动,完成复杂的显示任务。
3 uc/gui软件包的移植
3.1 uc/gui特点
(1)支持任何8位、16位和32位的cpu,只要求cpu具有相应的ansi-c编译器即可;
(2)所有硬件接口定义都使用可配置的宏;
(3)字符、位图可显示与lcd的任意点,并不限制与字节长度的整数倍数地址;
(4)所有程序在长度和速度方面都进行了优化,结构清晰;
(5)对于慢速的lcd控制器,可以使用缓冲存储器减少访问时间,提高显示速度。
3.2 uc/gul移植步骤
在使用uc/gui时,可以按照以下几个步骤来进行:
(1)按照需要,定制uc/gui;
(2)指定硬件设备的地址,编写接口驱动代码;
(3)编译、链接、调试例子程序;
(4)修改例子程序,并测试增加需要的功能;
(5)编写自己的应用程序。
3.3 具体实现
(1)首先介绍uc/gui的目录结构和基本配置。
uc/gui主要目录如下:
gui/convertmono 使用黑白显示设备时,所要使用的灰度转换函数
gui/convertcolor 使用彩色显示设备时,使用的色彩转换函数
gui/config 包含了对uc/gui进行配置的一些文件
gui/core uc/gui核心代码
gui/font uc/gui与字体相关的代码文件
gui/lcddriver lcd驱动代码文件
gui/memdev 内存设备支持文件代码
gui/touch 输入设备支持的文件代码
gui/widget uc/gu1支持的控件代码,包括编辑框、列表框、按钮和选择框等
gui/wm uc/gui窗口管理部分代码
(2)修改uc/gui,使之适于移植。
在ads环境中新建一个工程,将上述gui文件夹下的所有文件加入工程。
将config文件夹下的3个文件guiconf.h、
guitouchconf.h和lcdconf.h加入新工程,如下修改lcdconf.h的内容:
/*lcdconf.h*/
#ifndef lcdconf_h
#define lcdconf_h
#define lcdg4 //lcd颜色数,必须定义,lcdmono(单色),lcdg4(四级灰度),lcdg16(16级灰度)
#define lcd_xsize(640)/* lcd水平分辨率 */
#define lcd_ysize(480)/* lcd垂直分辨率 */
#define lcd bitsperpixel(8)
#endif /*lcdc0nf_h*/
/*以下是s3c44b0x lcd控制器的配置*/
#include ..incoption.h
#define scr_xsize (640)//视窗屏幕大小
#define scr_ysize (480)
#define lcd_xsize (640)//液晶屏幕大小
#define lcd_ysize (480)
#define m5d(n)((n)&0x1fffff)
#define array_size_g4(scr_xsize/4*scr_ysize)
#define hozval (lcd_xsize/4-1)
#define hozval_color (lcd_xsize*3/8-1)
#define lineval (lcd_ysize-1)
#define mval (13)
#define clkval_g4 (10)
#define mval_used 0
#endif /*lcdconf_h */
(3)加载lcd驱动。
lcd驱动程序如前面所述,保存在lcd44b0.c中。出了底层的初始化函数lcd_init_controler()以外,还需要做以下修改,这里只提关键部分。
主要进行相关的寄存器配置,以及和gui的接口程序。这里只提及关键部分。
① 定义显示缓冲区时使用的char数据类型,它是8bit的:
unsigned char bmp[array_size_g16];//液晶显示缓冲数组
② 定义读写缓冲区时使用的数据类型,也是8bit的u8:
#define lcd_read_mem (off)*((u8*)(frame
buffer256+(((u32)(off)))))
#define lcd_wrrite_mem(off,data)*((u8*)framebuffer256+(((u32)(off)))))=data
#define lcd_write_reg(off,data)
⑧ 定义液晶总线宽度定义位8bit:
#ifndef lcd_buswidth
#define lcd_buswidth(8)
#endif
④ 定义字节顺序:
#define lcd_swap_byte_order(0)
至此uc/gui的移植基本上已经完成了。当然这里只提供了移植的关键部分,更多更完整的移植还需要做不少的工作,如触控屏的移植、键盘鼠标的移植以及中文字体的移植等。详情请参阅uc/gui手册中getting started一章。
4 数据显示程序设计
数据显示程序主要是基于uc/gui平台的gui函数库,完成字符、曲线的绘制。与画线相关的gui函数有:
gui drawhline()
原型:void gui_drawline(int x0,int y0,int x1,int y1);
其中,x0、y0、x1、y1分别为ugi坐标系下的起点和终点的横坐标和纵坐标。
gui dispdec()
原型:void gui_dispdec(i32 v,u8 len);
其中,v为要显示的十进制变量值,len为要显示的数据的位数。
5 总结
本文主要介绍了基于arm7内核s3c44b0x和l78c64液晶模块硬件平台的uc/gui的移植,以及在工程上的应用,经过实际应用发现,uc/gui功能强大,响应迅速,稳定性高,具有广泛的应用前景。

2019年国内激光焊接设备市场规模突破百亿元,同比增长14.33%
时间和温度如何影响永磁体的稳定性?
苹果耳机新专利:防止剧烈运动滑落
如何测试灯光是否有频闪 手机屏幕如何判断频闪程度
导入网络表文件
基于uCGUI的数据显示系统
电涌(浪涌)保护器防雷保护级别
戴森V8Absolute吸尘器怎么样 功能丰富却仍有改进空间
CSP市场增量加速 缘于闪光灯和背光市场的切入
多云已成规模,企业怎样进一步布局
什么是PID算法
虹科免拆诊断 | 2012 款奇瑞 A3 车发动机无法起动
MAX1470电路调整以及与天线的匹配
华为手表watch3-2599起,华为手表watch3价格-3299起
三星S8昨晚纽约发布,八大亮点为你解读三星S8系列
OV发布了NEX和Find X两款机型,使用户对其的印象大幅改观
德州仪器面向便携设备开发多模式无线电源IC
工业机器人的视觉市场未来该如何发展
三星S8获评智能机第一好屏:iPhone 7不服反击
应用芯片设计的人工智能解决方案有何优势?