测试图片如下所示:
一:OLED知识分享:
OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。因为具备轻薄、省电等特性,因此从 2003 年开始,这种显示设备在 MP3 播放器上得到了广泛应用,而对于同属数码类产品的 DC 与手机,此前只是在一些展会上展示过采用 OLED 屏幕的工程样品。自 2007 年后,寿命得 到很大提高,具备了许多 LCD 不可比拟的优势。
GND:电源地 VCC:2.2V~5.5V SCL(D0):CLK 时钟 (高电平 2.2V~5.5V) SDA(D1):MOSI 数据(高电平 2.2V~5.5V) RST:复位(高电平 2.2V~5.5V) D/C:数据/命令(高电平 2.2V~5.5V) 兼容 3.3V 和 5V 控制芯片的 I/O 电平(无需任何设置,直接兼容)。
二:汉字的显示 由于这种OLED 本身不带字库,当我们需要显示的时候,需要自己弄一些汉字的字库进行显示。
按照上图的方式,进行字库的建立,方便我们显示字库。
三:硬件如下图所示:
在cube MX软件中进行GPIO口的配置,如下所示:
可见PB3,PB5没有硬件IIC的驱动功能,这里我们只好使用模拟的IIC进行显示:
四:代码如下所示:
4.1 模拟IIC时序驱动程序如下所示:
/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{
Start_I2C();
Wr_I2C(0x78); //Slave address,SA0=0
Wr_I2C(0x00); //write command
Wr_I2C(IIC_Command);
Stop_I2C();
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
Start_I2C();
Wr_I2C(0x78); //D/C#=0; R/W#=0
Wr_I2C(0x40); //write data
Wr_I2C(IIC_Data);
Stop_I2C();
}
/**********************************************
// Write OLED
**********************************************/
void OLED_WR_Byte(unsigned dat,unsigned cmd)
{
if(cmd) Write_IIC_Data(dat);
else Write_IIC_Command(dat);
}
/**********************************************
// Write OLED
**********************************************/
void OLED_WR_MutiByte(unsigned char *Pdata,unsigned char Num)
{
;//HAL_I2C_Mem_Write(&hi2c1,0x78,0x40,I2C_MEMADD_SIZE_8BIT,Pdata,Num,100);
for (u32 i = 0; i < Num; i++)
{
Write_IIC_Data(Pdata[i]);
}
}
使用硬件驱动代码如下:
extern I2C_HandleTypeDef hi2c1;
/***********************************************************************************************
* @brief static unsigned char OLED_send_byteS(unsigned char *data, unsigned char length)
* @param data:输入的数据 length:长度值,使用硬件IIC底层驱动函数
* @retval 无
* @author 聪聪哥哥
* @version V1.1.0
* @date 25-5-2025
*************************************************************************************************/
static unsigned char OLED_send_byteS(unsigned char *data, unsigned char length)
{
if (HAL_I2C_Master_Transmit(&hi2c1, 0x78, data, length, 2) != HAL_OK)
{
return 0;
}
return 1;
}
/***********************************************************************************************
* @brief static void I2C_WriteByte(uint8_t addr, uint8_t value)
* @param addr:IIC模块的地址,value :写入的数据
* @retval 无
* @author 聪聪哥哥
* @version V1.1.0
* @date 25-5-2025
*************************************************************************************************/
static void I2C_WriteByte(uint8_t addr, uint8_t value)
{
unsigned char dta[2] = {0};
dta[0] = addr;
dta[1] = value;
OLED_send_byteS(dta, 2);
}
/***********************************************************************************************
* @brief void WriteCmd(unsigned char I2C_Command)
* @param I2C_Command : IIC的命令
* @retval 无
* @author 聪聪哥哥
* @version V1.1.0
* @date 25-5-2025
*************************************************************************************************/
void WriteCmd(unsigned char I2C_Command)
{
I2C_WriteByte(0x00, I2C_Command);
}
/***********************************************************************************************
* @brief void WriteDat(unsigned char I2C_Data)
* @param I2C_Data : IIC的数据
* @retval 无
* @author 聪聪哥哥
* @version V1.1.0
* @date 25-5-2025
*************************************************************************************************/
void WriteDat(unsigned char I2C_Data)//写数据
{
I2C_WriteByte(0x40, I2C_Data);
}
4.2 OLED的初始化部分:
/********************************************************************
* OLED初始化
* 为OLED正常工作做准备
********************************************************************/
void OLED_Init(void)
{
OLED_WR_Byte(0xAE,OLED_CMD);//--display off
OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
OLED_WR_Byte(0x40,OLED_CMD);//--set start line address
OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
OLED_WR_Byte(0x81,OLED_CMD); // contract control
OLED_WR_Byte(0xFF,OLED_CMD);//--128
OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap
OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
OLED_WR_Byte(0x00,OLED_CMD);//
OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
OLED_WR_Byte(0x80,OLED_CMD);//
OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
OLED_WR_Byte(0x05,OLED_CMD);//
OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
OLED_WR_Byte(0xF1,OLED_CMD);//
OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
OLED_WR_Byte(0x12,OLED_CMD);//
OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
OLED_WR_Byte(0x30,OLED_CMD);//
OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
OLED_WR_Byte(0x14,OLED_CMD);//
OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
}
4.3 OLED显示部分:
void OLED_INIT(void)
{
OLED_Init(); //
OLED_Clear(); //
OLED_Display_On(); //
OLED_ShowString(25, 6, "RY MCU ", 16,1);
}
void OLED_DisPlay(void)
{
OLED_ShowString(25, 0, "RY MCU ", 16,0);
OLED_ShowString(25, 2, "by:congcong", 16,0);
OLED_ShowString(25, 4, "2025-8-19", 16,0);
OLED_ShowNum(30, 6, Time6Second, 2, 16, 0);
}
五:实物验证:
后记:由于没有将模块的SCL和SDA引脚连接到硬件的IIC硬件, 所以使用的模拟IIC进行驱动,由于IIC的有着时序的要求,所以在软件模拟的时候不得不使用延时的方式,而这种延时和可能导致其他程序运行不正常,所以要是将OLED的驱动引脚连接到硬件的IIC接口就完美了。
全部评论