由于瑞萨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的处理方式,故它也十分有利于移植到其它的开发板来实现驱动显示。
显示效果图