Learn-lumit-Step-19 : 字符液晶显示实验
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 (pin68) 与 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 中关于字符显示地址定义的文档一同分析。
页:
[1]