由于瑞萨RL78/G15开发板上没有配置相应的显示器件,故特意为它配置了一款I2C接口的LCD1602显示模块,从而使其可以大大地增强信息输出的表现力。
该显示模块是以PCF8574为核心处理芯片,是由它把I2C信号转化为并行信号来驱动LCD1602显示的。
PCF8574 采用CMOS电路设计。它通过两条双向总线(I 2 C)以使大多数 MCU 实现远程I/O 口扩展。该器件包含一个 8 位准双向口和一个 I 2C 总线接口。PCF8574 电流消耗很低,且口输出锁存具有大电流驱动能力,可直接驱动 LED。
在该显示模块中,LCD1602实际上是采用4位数据的方式来驱动,而非常规的8位数据驱动方式。
改显示模块与开发板的连接关系为:
LCD1602(I2C)
SCL---D6--15
SDA---D7--16
在GPIO口模拟I2C的情况下,其输出高低电平的语句定义为:
#define SCL_high  digitalWrite(15, HIGH)
  • #define SCL_low   digitalWrite(15, LOW)
  • #define SDA_high  digitalWrite(16, HIGH)
  • #define SDA_low   digitalWrite(16, LOW)
  • 复制代码
    模拟I2C开始与结束的函数为:
    void start()
  • {
  •         SDA_high;
  •         SCL_high;
  •         SDA_low;
  • }

  • void stop()
  • {
  •         SDA_low;
  •         SCL_high;
  •         SDA_high;
  • }
  • 复制代码
    模拟I2C方式字节数据的函数为:
    void write_byte(uint8_t date)
  • {
  •         uint8_t i,temp,m;
  •         temp=date;
  •         for(i=0;i<8;i++)
  •         {
  •           SCL_low;
  •           m=temp;
  •           m=m&0x80;
  •           if(m==0x80)
  •           {
  •                 SDA_high;
  •           }
  •           else  SDA_low;
  •           temp=temp<<1;
  •           SCL_high;
  •         }
  •         SCL_low;
  •         SDA_high;
  • }
  • 复制代码
    进行应答处理判别的函数为:
    void look()
  • {
  •       uint8_t i,sda;
  •       pinMode(16, INPUT);
  •       i=0;
  •       sda=digitalRead(16);
  •       while((sda==1)&&(i<250)) i++;
  •       pinMode(16, OUTPUT);
  • }

  • void respons()
  • {
  •      uint8_t i;
  •      SCL_high;
  •      look();
  •      SCL_low;
  • }
  • 复制代码
    向指定地址发送数据的函数为:
    void write_add(uint8_t date1)
  • {
  •      start();
  •      if(M_8574==0)
  •         write_byte(0x4e);
  •      else if(M_8574==1)
  •         write_byte(0x7e);
  •      else if(M_8574==2)
  •         write_byte(0x27);
  •      else if(M_8574==3)
  •         write_byte(0x3f);
  •      respons();
  •      write_byte(date1);
  •      respons();
  •      stop();
  • }
  • 复制代码
    发送指令的函数为:
    void write_com(uint8_t com)
  • {
  •         uint8_t com1,com2;
  •         com1=com|0x0f;
  •         write_add(com1 &0xfc);
  •         write_add(com1 &0xf8);
  •         com2=com<<4;
  •         com2=com2|0x0f;
  •         write_add(com2&0xfc);
  •         write_add(com2&0xf8);
  • }
  • 复制代码
    发送数据的函数为:
    void write_date(uint8_t date)
  • {
  •         uint8_t date1,date2;
  •         date1 =date|0x0f;
  •         write_add(date1 &0xfd);
  •         write_add(date1 &0xf9);
  •         date2=date<<4;
  •         date2=date2|0x0f;
  •         write_add(date2&0xfd);
  •         write_add(date2&0xf9);
  • }
  • 复制代码

    对LCD1602进行初始化的函数为:
    void init_lcd()
  • {
  •         SDA_high;
  •         SCL_high;
  •         write_add(0x08);
  •         write_com(0x0f);
  •         write_com(0x28);
  •         write_add(0x0c);
  •         write_add(0x08);
  •         write_com(0x28);
  •         write_com(0x01);
  •         write_com(0x0c);
  •         write_com(0x06);
  • }
  • 复制代码
    用于显示处理的函数为:
    void display()
  • {
  •         uint8_t i;
  •         write_com(0x80);
  •         for(i=0;i<16;i++)
  •         {
  •                 write_date(t0[i]);
  •         }
  •         write_com(0x80+0x40);
  •         for(i=0;i<16;i++)
  •         {
  •                 write_date(t1[i]);
  •           }

  •         if(M_8574==0)
  •         {
  •                 write_date('4');
  •                 write_date('E');
  •         }
  •         else if(M_8574==1)
  •         {
  •                 write_date('7');
  •                 write_date('E');
  •         }
  •         else if(M_8574==2)
  •         {
  •                 write_date('2');
  •                 write_date('7');
  •         }
  •         else if(M_8574==3)
  •         {
  •                 write_date('3');
  •                 write_date('F');
  •         }
  • }
  • 复制代码
    进行显示测试的主程序为:
    void setup() {
  •    pinMode(15, OUTPUT);
  •    pinMode(16, OUTPUT);
  •    init_lcd();
  • }

  • void loop() {
  •      display();
  •      delay(50);
  •      init_lcd();
  •      M_8574++;
  •      if(M_8574>=4)
  •      {
  •           M_8574=0;
  •      }
  • }
  • 复制代码
    经程序的下载测试,其显示效果如下图所示,说明功能正常,这样就有效地提高了显示输出的表现力。
    此外,由于是采用GPIO口模拟I2C的处理方式,故它也十分有利于移植到其它的开发板来实现驱动显示。
    image.png
    显示效果图