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