RA-Eco-RA6M4开发板是一款近于最小系统得开发板,为其添加相应的外设,可用起到丰富其羽翼的作用。
这里就为它配置一个I2C接口的OLED屏,其引脚连接关系为:
SCLK------P208
SDIN------P209
在使用I2C进行硬件驱动前,先以模拟的方式来驱动该显示屏。
在程序设计前,需使用RASC对所用引脚加以配置,以是其作为GPIO口来使用。
然后,在回到KEIL中进行程序设计。
为实现高低电平的输出其语句定义为:
#define OLED_SCLK_Set() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_02_PIN_08, BSP_IO_LEVEL_HIGH)
#define OLED_SDIN_Set() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_02_PIN_09, BSP_IO_LEVEL_HIGH)
#define OLED_SCLK_Clr() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_02_PIN_08, BSP_IO_LEVEL_LOW)
#define OLED_SDIN_Clr() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_02_PIN_09, BSP_IO_LEVEL_LOW)
模拟I2C发送字节数据的函数为:
void Write_IIC_Byte(unsigned char IIC_Byte)
{
unsigned char i;
unsigned char m,da;
da=IIC_Byte;
OLED_SCLK_Clr();
for(i=0;i<8;i++)
{
m=da;
m=m&0x80;
if(m==0x80)
{OLED_SDIN_Set();}
else
OLED_SDIN_Clr();
da=da<<1;
delay_us(3);
OLED_SCLK_Set();
delay_us(3);
OLED_SCLK_Clr();
delay_us(3);
}
}
对显示屏的初始化函数为:
void OLED_Init(void)
{
Write_IIC_Command(0xAE);
Write_IIC_Command(0x40);
Write_IIC_Command(0xb0);
Write_IIC_Command(0xc8);
Write_IIC_Command(0x81);
Write_IIC_Command(0xff);
Write_IIC_Command(0xa1);
Write_IIC_Command(0xa6);
Write_IIC_Command(0xa8);
Write_IIC_Command(0x1F);
Write_IIC_Command(0xd3);
Write_IIC_Command(0x00);
Write_IIC_Command(0xd5);
Write_IIC_Command(0xf0);
Write_IIC_Command(0xd9);
Write_IIC_Command(0x22);
Write_IIC_Command(0xda);
Write_IIC_Command(0x02);
Write_IIC_Command(0x8d);
Write_IIC_Command(0x14);
Write_IIC_Command(0xdb);
Write_IIC_Command(0x49);
Write_IIC_Command(0xaf);
}
实现清除屏幕的函数为:
void OLED_Clear(void)
{
uint8_t i,n;
for(i=0;i<8;i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD);
OLED_WR_Byte (0x00,OLED_CMD);
OLED_WR_Byte (0x10,OLED_CMD);
for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
}
}
显示字符串的函数为:
void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)
{
unsigned char j=0;
while (chr[j]!='\\0')
{ OLED_ShowChar(x,y,chr[j],Char_Size);
x+=8;
if(x>120){x=0;y+=2;}
j++;
}
}
实现显示测试的主程序为:
void hal_entry(void)
{
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"RA-Eco-RA6M4",16);
OLED_ShowString(0,2,"jinglixixi",16);
while(1);
}
经程序的编译和下载,其显示效果如图1和图2所示,说明功能正常。

图1 器件连接

图2 显示效果
为了免去连接的麻烦,可利用开发板上的Arduino接口,见图3所示。

图3 所用接口
此时引脚的连接关系为:
SCLK------P112
SDIN------P113
在RASC中完成引脚加配置后,需更改原输出高低电平的定义,更新后的内容为:
#define OLED_SCLK_Set() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_01_PIN_12, BSP_IO_LEVEL_HIGH)
#define OLED_SDIN_Set() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_01_PIN_13, BSP_IO_LEVEL_HIGH)
#define OLED_SCLK_Clr() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_01_PIN_12, BSP_IO_LEVEL_LOW)
#define OLED_SDIN_Clr() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_01_PIN_13, BSP_IO_LEVEL_LOW)
经重新的程序编译和下载,其显示效果如图4所示,说明更改成功。

图4 显示效果
若改用硬件驱动方式,可在RASC的Stack中加入,见图5所示。

图5 加入I2C
随后,按图6所示加以配参数置。在点击“Generate Project Content”后,即可生成Keil工程。

图6 配置参数
在完成引脚配置后,即可在生成的Keil工程中进行编程。
在硬件驱动方式下,模拟I2C方式下的函数void Write_IIC_Byte()将被新的语句所取代,该语句为R_SCI_I2C_Write(&g_i2c0_ctrl, ii, 0x02, true);
其中,ii是一个有2个元素的数组。
应注意的是,由于OLED显示屏的引脚线序与I2C接口不一致,就不能仍以直插的方式来使用了。

图7 I2C接口