开发平台:MDK5和rasc
开发板RA4M2
芯片:R7FA4M2AD3CFP
RA4开发板上刚好有一个IIC接口其实可以直接接上OLED屏,可惜我的屏电源和地脚刚好相反,不能直接接在上面。
下面我来IIC来驱动OLED屏显示。
功能如下:
硬件连接:
框图:
配置:
配置属性
核心代码,代码抄的。
显示字条:
OLED_ShowString(12, 0, (const uint8_t*)"R7FA4M2AD3CFP", 16, 1);
OLED_ShowString(24, 25, (const uint8_t*)"--IIC OLED--", 16, 1);
OLED_ShowString(54, 45, (const uint8_t*)"--YAO--", 16, 1);
IIC回调内家:
i2c_event = I2C_MASTER_EVENT_ABORTED;
if (NULL != p_args)
{
/* capture callback event for validating the i2c transfer event*/
i2c_event = p_args->event;
}
IIC初始:
err = R_SCI_I2C_Open(&g_sci3_i2c_ctrl, &g_sci3_i2c_cfg);
assert(FSP_SUCCESS == err);
OLED初始:
OLED_WrCmd(0xAE); //关闭显示
OLED_WrCmd(0xD5); //设置时钟分频因子,震荡频率
OLED_WrCmd(80); //[3:0],分频因子;[7:4],震荡频率
OLED_WrCmd(0xA8); //设置驱动路数
OLED_WrCmd(0X3F); //默认0X3F(1/64)
OLED_WrCmd(0xD3); //设置显示偏移
OLED_WrCmd(0X00); //默认为0
OLED_WrCmd(0x40); //设置显示开始行 [5:0],行数.
OLED_WrCmd(0x8D); //电荷泵设置
OLED_WrCmd(0x14); //bit2,开启/关闭
OLED_WrCmd(0x20); //设置内存地址模式
OLED_WrCmd(0x02); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
OLED_WrCmd(0xA1); //段重定义设置,bit0:0,0->0;1,0->127;
OLED_WrCmd(0xC0); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
OLED_WrCmd(0xDA); //设置COM硬件引脚配置
OLED_WrCmd(0x12); //[5:4]配置
OLED_WrCmd(0x81); //对比度设置
OLED_WrCmd(0xEF); //1~255;默认0X7F (亮度设置,越大越亮)
OLED_WrCmd(0xD9); //设置预充电周期
OLED_WrCmd(0xf1); //[3:0],PHASE 1;[7:4],PHASE 2;
OLED_WrCmd(0xDB); //设置VCOMH 电压倍率
OLED_WrCmd(0x30); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;
OLED_WrCmd(0xA4); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
OLED_WrCmd(0xA6); //设置显示方式;bit0:1,反相显示;0,正常显示
OLED_WrCmd(0xAF); //开启显示
OLED_Clear();
写:
fsp_err_t err;
uint32_t timeout_ms = 100;
uint8_t i2c_transmitter[2]={0x40, IIC_Data};
err = R_SCI_I2C_Write(&g_sci3_i2c_ctrl, i2c_transmitter, 0x02, true);
assert(FSP_SUCCESS == err);
while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms>0)
{
R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MICROSECONDS);
timeout_ms--;
}
if (I2C_MASTER_EVENT_ABORTED == i2c_event)
{
__BKPT(0);
}
/* Read data back from the I2C slave */
i2c_event = I2C_MASTER_EVENT_ABORTED;
显示效果:
更多回帖