|  | 
 
| Learn-lumit-Step-19 : 字符液晶显示实验 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 lumit4510 上面采用了一块 16×2 的字符型液晶作为显示界面,型号为 GXM1602C。
 液晶的用户调用接口很简单,主要有如下几个:
 
 int lcd_init( void );
 
 // 字符定位输出
 int lcd_line1_putchar( char ch, int position );
 
 int lcd_line2_putchar( char ch, int position );
 
 // 字符串输出
 int lcd_line1_puts( char * string );
 
 int lcd_line2_puts( char * string );
 
 // 清除屏幕
 void lcd_clear_display( void );
 
 // 同时输出两行字符串
 int lcd_print_line( char * L1, char * L2 );
 
 这里着重分析一下驱动液晶显示的过程和相关代码实现。首先需要了解的是 lumit4510 的
 硬件设计原理,主要就是数据线、地址线以及控制线和液晶的连接关系:
 
 1、数据线: DB0-DB7 共 8 根数据线
 2、地址线: A0-A1 共 2 根地址线
 其中 A0 与读写选择 R/W 相连,A1 与数据命令选择端 RS 相连;
 3、控制线: nECS1_LCD (pin6
  与 E 使能信号 相连; 
 软件初始化工作主要分为两个部分,一个部分是 s3c4510 内部相关寄存器的设置,如下:
 
 /* Set External I/O Bank 1 configuration */
 EXTDBWTH &= 0xff3fffff ;
 EXTDBWTH |= DSX1 ;
 EXTACON0 = LTCOS1 | LTACS1 | LTCOH1 | LTACC1 ;
 
 这里主要是设置 lcd 的传输数据宽度为 8 位,也就是使用 DB7-DB0 ,
 
 另一个部分就是和 lcd 相关的使用参数的设置,主要是包含在 GXM1602C.pdf 中的相关配置字。
 可以参考如下代码中的注释,所有配置字的设置含义都在 pdf 文件里面能够找到。
 
 /* ---
 * Function Set
 *     Interface Data Length is : 8 bit
 *     Display Numer of Line is 2
 * --- */
 lcd_ioctl( LCD_INST_REG_WRITE, 0x38 );                 lcd_ioctl( LCD_WAIT, 100 );
 
 /* ---
 * Display On/Off Control
 *     Display On
 *     Cursor Display
 *     Cursor Blink
 * --- */
 lcd_ioctl( LCD_INST_REG_WRITE, 0x0f );                 lcd_ioctl( LCD_WAIT, 200 );
 
 /* ---
 * Cursor or Display Shift
 *     Shift Left
 * --- */
 lcd_ioctl( LCD_INST_REG_WRITE, 0x18 );                 lcd_ioctl( LCD_WAIT, 200 );
 
 /* ---
 * Entry Mode Set
 *     Increment DD Ram Address
 * --- */
 lcd_ioctl( LCD_INST_REG_WRITE, 0x06 );                 lcd_ioctl( LCD_WAIT, 200 );
 
 /* ---
 * Clear Display
 * --- */
 lcd_ioctl( LCD_INST_REG_WRITE, 0x01 );                 lcd_ioctl( LCD_WAIT, 200 );
 
 在 lcd_driver.c 里面还有一个比较重要的设置参数,就是显示字符的位置:
 
 case        LCD_MOVE_TO_FIRST_LINE:
 // 0x80 = 0b10000000 = 1 000 0000 = 1 0x00
 *(unsigned char *)LINSTWR = (unsigned char) 0x80;
 break;
 
 case        LCD_MOVE_TO_FIRST_LINE_POSITION:
 // 0x80 = 0b10000000 = 1 000 0000 = 1 0x00 + offset
 *(unsigned char *)LINSTWR = (unsigned char) 0x80 + (unsigned int) arg;
 break;
 
 case        LCD_MOVE_TO_SECOND_LINE:
 // 0xC0 = 0b11000000 = 1 100 0000 = 1 0x40
 *(unsigned char *)LINSTWR = (unsigned char) 0xC0;
 break;
 
 case        LCD_MOVE_TO_SECOND_LINE_POSITION:
 // 0xC0 = 0b11000000 = 1 100 0000 = 1 0x40 + offset
 *(unsigned char *)LINSTWR = (unsigned char) 0xC0 + (unsigned int) arg;
 
 其中在第一行开头显示,则地址应该设置为 0x80 ,如果是第二行的开头,则地址应该设置为 0xC0 。
 具体含义也需要参考代码(注释)以及 GXM1602C.pdf 中关于字符显示地址定义的文档一同分析。
 | 
 
×本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?注册  |