QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2700|回复: 0

Learn-lumit-Step-19 : 字符液晶显示实验

[复制链接]
发表于 2005-9-12 07:59:32 | 显示全部楼层 |阅读模式
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 中关于字符显示地址定义的文档一同分析。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-4-28 05:02 , Processed in 0.178177 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表