工控网首页
>

应用设计

>

EM335x支持低成本单色LCD显示方案

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