limingth 发表于 2005-9-12 07:59:32

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]
查看完整版本: Learn-lumit-Step-19 : 字符液晶显示实验