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