EM335x支持低成本单色LCD显示方案
1、简述
英创公司嵌入式板卡EM335x是一款高性能的Cortex-A8硬件平台,板卡带有丰富的硬件接口,非常适用于工业应用开发。
EM335x板卡CPU采用了Ti公司的AM3354,AM3354的LCD控制器包括有两种独立的控制器:一种是行扫(raster)模式,一种是LCD接口驱动(LIDD)模式,raster 模式用于处理同步LCD,用于支持彩色液晶显示屏,而LIDD模式可以用来支持低成本的单色点阵LCD模块。
EM335x板卡的标准应用是采用的raster模式LCD驱动,支持多种分辨率彩色液晶显示接口,最高分辨率到1024X768。在此基础上英创公司在EM335x上还实现了基于LIDD模式的LCD驱动,可满足部分工业场合对于单色点阵屏的需求。本文以单色点阵屏160X160 LCD为例,介绍该屏在EM335x上的应用。
2、单色LCD接线
EM335x的LCD接口请参见EM335x数据手册中CN3的信号定义。下面是通过EM335x CN3连接HGO160160 LCD模块(UC1698U控制器,160x160点阵)的信号对应表:
LCD的第19脚为背光电源正,EM335x CN3的第30脚为PWM信号输出,低电平有效。这两个引脚在物理上并不是直接相连,而是应该将PWM作为LCD的背光控制信号,通过控制一个电子开关实现LCD背光的打开与关闭,具体连接可参考下图。
3、单色屏LCD应用程序开发
在Linux操作系统中,与彩色屏的设备节点不同,对于单色LCD的设备节点定义为:'/dev/em335x_lcd',因此Linux应用程序操作单色LCD时,一般为以下几个步骤:
1、打开LCD设备文件:
fd = open('/dev/em335x_lcd', O_RDWR);
2、调用标准的write( )函数对LCD屏进行操作。
3、关闭LCD设备文件。
为了方便客户使用,我们设计了一套通用的汉字及LCD显示接口函数,这些接口函数定义和实现分别在lcd_api.h lcd_api.cpp中,函数中包括画点、画线、画Bar条、写块数据、输出汉字及字符等操作。关于各个函数的定义说明,可参见lcd_api.h头文件中的中文注释。其中的汉字支持为标准一级全汉字,为16×16点阵字模,西文(字母、数字和符号)为8×14点阵字模,这两个字模文件分别为cclib、cclib12.fnt、ascii.chr,放置在EM335x嵌入式主板的根文件系统“/usr”目录中。各个函数定义如下:
// 功能描述: 启动对LCD屏的操作功能,并初始化LCD显示屏
// 返回值 > 0: 启动LCD成功
// = -1: 启动LCD失败
int LCD_Init( );
// 功能描述: 释放对LCD显示屏的操作功能
// 输入参数: 无
// 返回值 > 0: 初始化LCD成功,并返回LCD的类型
// = -1: 初始化LCD失败
int LCD_DeInit( );
// 功能描述: 对LCD显示屏的清屏操作
// 输入参数: 无
// 返回值 = 0: LCD清屏成功
//<0 : LCD清屏失败
int LCD_Clearup( );
// 功能描述: 获取LCD显示屏的X方向最大分辨率
// 输入参数: 无
// 返回值 : LCD显示屏的X方向最大分辨率
int LCD_GetMaxX( );
// 功能描述: 获取LCD显示屏的Y方向最大分辨率
// 输入参数: 无
// 返回值 : LCD显示屏的Y方向最大分辨率
int LCD_GetMaxY( );
// 功能描述: 设置LCD显示汉字字模:16点阵、12点阵
// 输入参数: FontWidth = 16 : 16点阵汉字
// FontWidth = 12 : 12点阵汉字
// 返回值 : 字模的类型16或12
int LCD_SetFont( int FontWidth );
// 功能描述: 对LCD显示屏进行描点操作
// 输入参数:
// int x0: 描点的列坐标(x坐标),范围0~(MaxX-1)
// int y0: 描点的行坐标(y坐标),范围0~(MaxY-1)
// int color: 描点的颜色:BK_COLOR或者TEXT_COLOR
// 返回值 0: 成功
int LCD_PutPixel( int x0, int y0, int color );
// 功能描述: 对LCD显示屏进行写多个字节操作
// 输入参数:
// int x: 写字节的列坐标(x坐标),范围0~(MaxX-1),不可大于或等于MaxX
// int y: 写字节的行坐标(y坐标),范围0~(MaxY-1),不可大于或等于MaxY
// unsigned char* hfont: 需要写的字节组
// int xsize: x方向的大小,最大不超过8
// int NumOfBytes: 需要写的字节数,最大不超过16
// 返回值 0: 成功
int LCD_WriteByteBlock( int x, int y, unsigned char* hfont, int xsize,
int NumOfBytes );
// 功能描述: 对LCD显示屏画直线操作
// 输入参数:
// int x0: 直线开始列坐标(x坐标),范围0~(MaxX-1),不可大于或等于MaxX
// int y0: 直线开始行坐标(y坐标),范围0~(MaxY-1),不可大于或等于MaxY
// int x1: 直线结束列坐标(x坐标),范围0~(MaxX-1),不可大于或等于MaxX
// int y1: 直线结束行坐标(y坐标),范围0~(MaxY-1),不可大于或等于MaxY
// int color: 颜色设置:BK_COLOR或者TEXT_COLOR
int LCD_DrawLine( int x0, int y0, int x1, int y1, int color );
// 功能描述: 对LCD显示屏画Bar条操作
// 输入参数:
// int x0: 直线开始列坐标(x坐标),范围0~(MaxX-1),不可大于或等于MaxX
// int y0: 直线开始行坐标(y坐标),范围0~(MaxY-1),不可大于或等于MaxY
// int x1: 直线结束列坐标(x坐标),范围0~(MaxX-1),不可大于或等于MaxX
// int y1: 直线结束行坐标(y坐标),范围0~(MaxY-1),不可大于或等于MaxY
// int color: 颜色设置:BK_COLOR或者TEXT_COLOR
int LCD_FillBar( int x0, int y0, int x1, int y1, int color );
// 功能描述: 对LCD显示屏进行写字符串的操作
// 输入参数:
// int x0: 字符写入的列坐标(x坐标),范围0~(MaxX-1)
// int y0: 字符写入的行坐标(y坐标),范围0~(MaxY-1)
// int color: 字符写入的颜色设置:BK_COLOR或者TEXT_COLOR
// 返回值 0: 成功
int LCD_WriteString( int x0, int y0, char* pStr, int color );
以test_lcd为例,介绍利用eclipse / Sourcery G++工具进行应用程序开发时,如何使用lcd_api.h函数库来实现对LCD的显示操作。
首先需要在应用工程项目文件test_lcd中导入API函数相关的几个文件:lcd_api.h、lcd_api.cpp 以及DotLib.CPP(主要实现了西文、汉字显示功能)。在eclipse / Sourcery G++ IDE下导入不仅仅是将这些文件加入到项目工程中,同时也会把这几个文件复制到项目工程所在的目录下。以下为测试代码:
// 对LCD屏进行初始化操作
i1 = LCD_Init( );
if( i1<0 )
{
printf( 'LCD Init fail!\n' );
return -1;
}
MaxX = LCD_GetMaxX( );
MaxY = LCD_GetMaxY( );
LCD_Clearup( );
LCD_PutPixel( 0, 0, 1 );
LCD_PutPixel( MaxX-1, 0, 1 );
LCD_PutPixel( 0, MaxY-1, 1 );
LCD_PutPixel( MaxX-1, MaxY-1, 1 );
LCD_SetFont( 12 );
// 显示中文、字符操作
strcpy( BufStr, '** 欢迎测试 **' );
x = (MaxX-strlen(BufStr)*8)/2;
y = 8;
LCD_WriteString( x, y, BufStr, TEXT_COLOR );
strcpy( BufStr, '嵌入式Linux主板' );
x = (MaxX-strlen(BufStr)*8)/2;
y = 24;
LCD_WriteString( x, y, BufStr, BK_COLOR );
sleep( 2 );
// 画线
LCD_DrawLine( 0, 42, MaxX-1, 42, TEXT_COLOR );
LCD_DrawLine( 0, 63, MaxX-1, 63, TEXT_COLOR );
// 画曲线
for( x=0; x {
y = 53 - 10.0*sin( 2.0*M_PI*x/24.0 );
LCD_PutPixel( x, y, XOR_WRITE );
}
sleep( 2 );
for( x=0; x {
y = 53 - 10.0*sin( 2.0*M_PI*x/24.0 );
LCD_PutPixel( x, y, XOR_WRITE );
}
sleep( 2 );
LCD_Clearup( );
LCD_DrawLine( 0, 0, MaxX-1, MaxY-1, TEXT_COLOR );
LCD_DrawLine( 0, MaxY-1, MaxX-1, 0, TEXT_COLOR );
// 画Bar条
start = time(NULL);
for( i1=0; i1<9; i1++)
{
LCD_FillBar( MaxX/2-20, MaxY/2-20, MaxX/2+20, MaxY/2+20, XOR_WRITE );
sleep(1);
}
end = time(NULL);
printf('The pause used %f seconds.\n',difftime(end,start)/10);//
LCD_DeInit( );
提交
Windows下STM32单片机eclipse编译环境搭建
Android Studio应用开发简介
WinCE工控主板WiFi解决方案
敬请关注成都英创微信公众号
WinCE工控主板通过PPI协议连接西门子PLC