CH57x,CH582,CH592硬件I2C主机控制OLED屏幕

硬件IIC特性介绍:


 

IIC概述及时序图:

 


 

 IIC手册文字描述流程:

例程改写:

/**
  * @brief  OLED数据发送(十六进制,正数)
  * @param  Addr 从机地址
  * @param  Cmd  发送数据类型命令
  * @param  Data 发送的数据
  * @retval 无
  */
void OLED_SendData(uint8_t Addr,uint8_t Cmd,uint8_t Data)
{
    while(I2C_GetFlagStatus(I2C_FLAG_BUSY) != RESET);//等待总线处于空闲状态
    I2C_GenerateSTART(ENABLE);//发送起始信号
    while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));//等待IIC接口设置为主模式,等待主机拿到总线控制权,等待起始信号发送完成
    I2C_Send7bitAddress(Addr, I2C_Direction_Transmitter);//发送7位从机地址数据,设置发送方向,将最低位置0,将读写位设置为写状态
    while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//等待IIC总线处于忙状态,等待IIC接口设置为主模式,等待地址数据发送结束/数据发送完成
    if(I2C_GetFlagStatus(I2C_FLAG_TXE) != RESET)//等待数据寄存器为空
    I2C_SendData(Cmd);//填写数据至数据寄存器DATAR
    I2C_SendData(Data);//填写数据至数据寄存器DATAR
    while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));//等待总线处于忙状态,接口为主模式,主机处于发送模式,数据寄存器为空,等待字节发送结束
    I2C_GenerateSTOP(ENABLE);//发送停止信号
}

 

void OLED_SetCursor(uint8_t Y, uint8_t X)
{
    OLED_SendData(0x78,0x00,0xB0 | Y);                    //设置Y位置
    OLED_SendData(0x78,0x00,0x10 | ((X & 0xF0) >> 4));//设置X位置低4位
    OLED_SendData(0x78,0x00,0x00 | (X & 0x0F));         //设置X位置高4位      
}

 

void OLED_Init(void)
{
    OLED_SendData(0x78,0x00,0xAE);//关闭显示
    OLED_SendData(0x78,0x00,0xD5);//设置显示时钟分频比/振荡器频率
    OLED_SendData(0x78,0x00,0x80);
    OLED_SendData(0x78,0x00,0xA8);//设置多路复用率
    OLED_SendData(0x78,0x00,0x3F);
    OLED_SendData(0x78,0x00,0xD3);//设置显示偏移
    OLED_SendData(0x78,0x00,0x00);
    OLED_SendData(0x78,0x00,0x40);//设置显示开始行
    OLED_SendData(0x78,0x00,0xA1);//设置左右方向,0xA1正常 0xA0左右反置
    OLED_SendData(0x78,0x00,0xC8);//设置上下方向,0xC8正常 0xC0上下反置
    OLED_SendData(0x78,0x00,0xDA);//设置COM引脚硬件配置
    OLED_SendData(0x78,0x00,0x12);
    OLED_SendData(0x78,0x00,0x81);//设置对比度控制
    OLED_SendData(0x78,0x00,0xCF);
    OLED_SendData(0x78,0x00,0xD9);//设置预充电周期
    OLED_SendData(0x78,0x00,0xF1);
    OLED_SendData(0x78,0x00,0xDB);//设置VCOMH取消选择级别
    OLED_SendData(0x78,0x00,0x30);
    OLED_SendData(0x78,0x00,0xA4);//设置整个显示打开/关闭
    OLED_SendData(0x78,0x00,0xA6);//设置正常/倒转显示
    OLED_SendData(0x78,0x00,0x8D);//设置充电泵
    OLED_SendData(0x78,0x00,0x14);//设置充电泵
    OLED_SendData(0x78,0x00,0xAF);//开启显示
    OLED_Clear();//OLED清屏
}

 

 

 在使用硬件IIC时,会自动设置为开漏输出模式,仅IIC引脚支持;

int main()
{
    SetSysClock(CLK_SOURCE_PLL_60MHz);
    GPIOA_SetBits(GPIO_Pin_9);
    GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);
    GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
    UART1_DefInit();
    
    PRINT("IIC Host mode\r\n");
    /*IIC_Init*/
    GPIOB_ModeCfg(GPIO_Pin_13 | GPIO_Pin_12, GPIO_ModeIN_PU);
    I2C_Init(I2C_Mode_I2C, 400000, I2C_DutyCycle_16_9, I2C_Ack_Enable, I2C_AckAddr_7bit, 0x42);//使用IIC外设,时钟频率设置为400Kbit/s,时钟占空比设置为Tlow:Thigh=16:9,7位地址,设置主机地址
    OLED_Init();//OLED初始化
    char Data = '!';
    for(uint8_t i=1;i<5;i++)
    {
        for(uint8_t j=1;j<17;j++)
        {
            OLED_ShowChar(i,j,Data);
            Data++;
        }
    }
    while(1);
}

显示效果如图:

工程链接自取:

链接:https://pan.baidu.com/s/1yfBXKvwj2NAyPvGG3asFNg?pwd=zsph
提取码:zsph

 

posted @ 2024-07-18 17:01  oTvTo  阅读(133)  评论(0编辑  收藏  举报