关于OLED的具体介绍可参考STM32-OLED屏幕显示教程_stm32 oled_LJX的博客-CSDN博客
这里只贴了HC32F460的代码
首先是IIC初始化
static en_result_t Master_Initialize(void)
{
en_result_t enRet;
stc_i2c_init_t stcI2cInit;
float32_t fErr;
I2C_DeInit(I2C_UNIT);
MEM_ZERO_STRUCT(stcI2cInit);
stcI2cInit.u32ClockDiv = I2C_CLK_DIV2;
stcI2cInit.u32Baudrate = I2C_BAUDRATE;
stcI2cInit.u32SclTime = 0ul;
enRet = I2C_Init(I2C_UNIT, &stcI2cInit, &fErr);
I2C_BusWaitCmd(I2C_UNIT, Enable);
return enRet;
}
接着是写OLED的函数,这里主要是注意写地址那是0X3C,而网上一般是说地址是0X78,我也就是这里卡了很久。
实际上地址只有七位,其中一位是读/写,也就是0X78的第一位其实不是地址,而是写。所以实际地址是0X3C,且HC32F460底层的I2C_TransAddr有对这个进行处理,也就要填实际的地址,不带最后的读/写,读/写由I2CDirTrans来控制。
static en_result_t OLED_WR_Byte(uint8_t *pu8TxData)
{
en_result_t enRet;
I2C_Cmd(I2C_UNIT, Enable);
I2C_SoftwareResetCmd(I2C_UNIT, Enable);
I2C_SoftwareResetCmd(I2C_UNIT, Disable);
enRet = I2C_Start(I2C_UNIT,TIMEOUT); //START
if(Ok == enRet)
{
enRet = I2C_TransAddr(I2C_UNIT, (uint8_t)0x3C, I2CDirTrans, TIMEOUT);//地址
if(Ok == enRet)
{
enRet = I2C_TransData(I2C_UNIT, pu8TxData, 2,TIMEOUT);
}
if(Ok != enRet)
{
I2C_Stop(I2C_UNIT,TIMEOUT);
I2C_SoftwareResetCmd(I2C_UNIT, Enable);
I2C_SoftwareResetCmd(I2C_UNIT, Disable);
}
}
I2C_Stop(I2C_UNIT,TIMEOUT);
I2C_Cmd(I2C_UNIT, Disable);
return enRet;
}
void WriteCmd(int8_t dat)
{
uint8_t u8TxBuf[2];
u8TxBuf[0]=0x00;
u8TxBuf[1]=dat;
OLED_WR_Byte(u8TxBuf);
}
void WriteDat(int8_t dat)
{
uint8_t u8TxBuf[2];
u8TxBuf[0]=0x40;
u8TxBuf[1]=dat;
OLED_WR_Byte(u8TxBuf);
}
void Drv_Oled_Init (void)
{
// 根据数据手册提供的例程,初始化OLED
Ddl_Delay1ms(200); // 延时200ms
WriteCmd(0xAE); //display off
WriteCmd(0x20); //Set Memory Addressing Mode
WriteCmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
WriteCmd(0xb0); //Set Page Start Address for Page Addressing Mode,0-7
WriteCmd(0xc8); //Set COM Output Scan Direction
WriteCmd(0x00); //---set low column address
WriteCmd(0x10); //---set high column address
WriteCmd(0x40); //--set start line address
WriteCmd(0x81); //--set contrast control register
WriteCmd(0xff); //áá?èμ÷?ú 0x00~0xff
WriteCmd(0xa1); //--set segment re-map 0 to 127
WriteCmd(0xa6); //--set normal display
WriteCmd(0xa8); //--set multiplex ratio(1 to 64)
WriteCmd(0x3F); //
WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
WriteCmd(0xd3); //-set display offset
WriteCmd(0x00); //-not offset
WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency
WriteCmd(0xf0); //--set divide ratio
WriteCmd(0xd9); //--set pre-charge period
WriteCmd(0x22); //
WriteCmd(0xda); //--set com pins hardware configuration
WriteCmd(0x12);
WriteCmd(0xdb); //--set vcomh
WriteCmd(0x20); //0x20,0.77xVcc
WriteCmd(0x8d); //--set DC-DC enable
WriteCmd(0x14); //
WriteCmd(0xaf); //--turn on oled panel
}
void SetPos(unsigned char x,unsigned char y) //设置起点坐标
{
WriteCmd(0xb0+y);
WriteCmd((x&0xf0)>>4|0x10); //取高位
WriteCmd((x&0x0f)|0x01); //取低位
}
void OLED_Fill(unsigned char Fill_Data) //全屏填充
{
unsigned char m,n;
for(m=0;m<8;m++){
WriteCmd(0xb0+m);
WriteCmd(0x00);
WriteCmd(0x10);
for(n=0;n<128;n++){
WriteDat(Fill_Data);
}
}
}
void OLED_Clean(void) //清屏
{
OLED_Fill(0x00);
}
void OLED_ON(void) //打开OLED
{
WriteCmd(0X8D); //设置电荷泵
WriteCmd(0X14); //开启电荷泵
WriteCmd(0XAF); //OLED唤醒
}
void OLED_OFF(void) //关闭OLED
{
WriteCmd(0X8D); //设置电荷泵
WriteCmd(0X10); //关闭电荷泵
WriteCmd(0XAE); //关闭OLED
}
其他指令都和其他的一样,可直接复制