不管编写什么驱动第一件事都是查阅数据手册,这里记录一下我编写LCD驱动的过程

硬件环境:

主板: PIC24FJ64GA306

LCD驱动芯片:PCF8542ATT

这款LCD驱动芯片支持1:8的输出可以驱动8*40的段码

可以通过这里了解一些LCD基本参数:http://www.360doc.com/content/18/1121/23/277688_796410994.shtml

echo lcd驱动测试 lcd驱动设计_echo lcd驱动测试

LCD驱动板的原理图,我们只需要使用I2C协议和驱动芯片进行通信就可以控制LCD的显示了

1、LCD端口的初始化

查看手册了解每个端口的作用

echo lcd驱动测试 lcd驱动设计_嵌入式_02

重点关注:Vlcd和Vdd引脚的电压,Vlcd电压需要大于等于Vdd,A0引脚决定I2C从站的地址

从原理图看,Vlcd直接接5V,A0接低,所以芯片I2C写数据地址为0x70

初始化操作主要是配置I2C通信端口以及Vdd电源端口以及对驱动芯片的初始化配置

手册推荐的初始化顺序

echo lcd驱动测试 lcd驱动设计_PIC_03

程序的实现

void I2cInit( void )
{
    I2C_VCC_OUT;//LCD_PWR设置输出
    I2C_TRIS_SCL=0;//SCL设置输出
    I2C_TRIS_SDA=0;//SDA设置输出
    I2C_VCC_EN;//LCD_PWR输出高电平
}

/********************************************************************************
**函数名称:HalLcdCfg
**具体描述:对液晶进行初始配置
**输    入:无
**输    出:无
*********************************************************************************/
void HalLcdCfg(void )
{
    //端口初始化
    I2cInit();
    DelayMs(1);
    //配置LCD芯片
    HalLcdControl(CMD_BYTE_REFRESH);//OTP刷新
    DelayMs(10);
    HalLcdControl(CMD_BYTE_LCD_DIS);//设置显示模式 BSP=1
    HalLcdControl(CMD_BYTE_BIAS_SET);;//设置偏压比1/3
    HalLcdControl(CMD_BYTE_OS_CONTROL);//设置帧率60Hz
    
    HalLcdControl(CMD_BYTE_RERET_DATA_POINTER);//设置数据指针地址
    HalLcdDisAllNum();//全显
    HalLcdControl(CMD_BYTE_LCD_EN);//显示
}

2、I2C驱动

I2C我们都比较熟悉了,我们主要是通过通过I2C协议与芯片进行通行

手册推荐I2C通信序列,控制芯片需要一个控制字节

echo lcd驱动测试 lcd驱动设计_LCD_04

Slave address地址通过硬件A0输入控制

echo lcd驱动测试 lcd驱动设计_嵌入式_05

A0输入低电平,0X70u,写数据地址, 0x71u//读数据地址

A0输入高电平,0X72u,写数据地址, 0x73u//读数据地址

程序实现

unsigned char I2cWrite (unsigned char device_addr, unsigned char control_type,unsigned char *pdata,unsigned int len) 

    unsigned char slave_addr; 
    unsigned char ack,err; 
    unsigned int i;
    unsigned char *ptmp;
    
    err = 0;
    if( len == 0) return 2;    

    //获取地址、从地址 
    slave_addr = device_addr; 
         
    //写数据 
    err = 0; 
    start(); 
    ack = SendI2cOne(slave_addr); 
    if( ack != 0) err = 1;
     
    ack = SendI2cOne(control_type); 
    if( ack != 0) err = 1;     
    ptmp = pdata;
    for(i = 0; i < len; i++) 
    { 
        ack = SendI2cOne(*ptmp); 
        if( ack != 0) err = 1; 
        ptmp++;
    } 
    stop();                           
    return err;    

3、PCF8545命令详解

echo lcd驱动测试 lcd驱动设计_帧率_06

MCU使用I2C和芯片进行通信,这里讨论这几个命令的使用,命令通过RS的低两位控制写。

3.1 initialize   

    芯片软件复位

3.2 OTP-refresh

    刷新显示缓存,刷新显示

3.3 mode-setting

    设置显示模式

echo lcd驱动测试 lcd驱动设计_嵌入式_07

BPS:设置背板引脚位置交换,下图是设置0和1的区别根据此设置电路

echo lcd驱动测试 lcd驱动设计_echo lcd驱动测试_08

IVN:设置驱动方案,一共两种方案,LCD线线反转方式(默认)和LCD帧率反转方式

 

PD:设置芯片电源模式,默认上电,下电模式内部时钟关闭处于低功耗状态

    推荐进入低功耗执行顺序

echo lcd驱动测试 lcd驱动设计_嵌入式_09

E:显示使能,默认不开启

2、oscillator-control

    配置时钟,默认使用内部时钟,230KHZ

echo lcd驱动测试 lcd驱动设计_echo lcd驱动测试_10

 

 

 

echo lcd驱动测试 lcd驱动设计_帧率_11

    LCD帧率的计算

echo lcd驱动测试 lcd驱动设计_嵌入式_12

    

3、set-MUX-mode

    设置多驱动模式,默认1:8

echo lcd驱动测试 lcd驱动设计_echo lcd驱动测试_13

4、set-bias-mode

    设置偏置比,默认1/4

echo lcd驱动测试 lcd驱动设计_帧率_14

5、frame-frequency

LCD的帧率由时钟频率、预分频、分频确定

预分频配置

echo lcd驱动测试 lcd驱动设计_LCD_15

echo lcd驱动测试 lcd驱动设计_PIC_16

6、load-data-pointer

    定义显示RAM起始地址,设置和驱动模式相关,默认0,注意每次写完之前需要重定位数据寄存器

echo lcd驱动测试 lcd驱动设计_帧率_17

 

7、write-RAM-data

定义显示RAM写起始地址,设置和驱动模式相关,默认0,注意控制字节RS=01

echo lcd驱动测试 lcd驱动设计_帧率_18