芯查查logo
  • 数据服务
    1. 新产品
    2. 物料选型
    3. 查替代
    4. 丝印反查
    5. 查品牌
    6. PCN/PDN
    7. 查方案
    8. 查代理
    9. 数据合作
  • SaaS/方案
      SaaS产品
    1. 供应链波动监控
    2. 半导体产业链地图
    3. BOM管理
    4. 解决方案
    5. 汽车电子
    6. 政府机构
    7. 数据API
  • 商城
  • 行业资讯
    1. 资讯
    2. 直播
  • 论坛社区
    1. 论坛
    2. 学习
    3. 测评中心
    4. 活动中心
    5. 积分商城
  • 查一下
  • 开通会员
聪聪哥哥
【星允派 NEBULA PI】06:IIC显示OLED

测试图片如下所示:

一: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接口就完美了。

申请原创奖励
版块: 单片机/MCU论坛
前4天 20:22
  • 举报
😁😂😃😄😅😆😉😊😋😌😍😏😒😓😔😖😘😚😜😝😞😠😡😢😣😤😥😨😩😪😫😭😰😱😲😳😵😷😸😹😺😻😼😽😾😿🙀🙅🙆🙇🙈🙉🙊🙋🙌🙍🙎🙏✂✅✈✉✊✋✌✏✒✔✖✨✳✴❄❇❌❎❓❔❕❗❤➕➖➗➡➰🚀🚃🚄🚅🚇🚉🚌🚏🚑🚒🚓🚕🚗🚙🚚🚢🚤🚥🚧🚨🚩🚪🚫🚬🚭🚲🚶🚹🚺🚻🚼🚽🚾🛀Ⓜ🅰🅱🅾🅿🆎🆑🆒🆓🆔🆕
@好友

全部评论

加载中
游客登录通知
已选择 0 人
自定义圈子
移动
发布帖子
发布动态
发布问答
最新帖子
【星允派 NEBULA PI】10:cube实现文件系统操作【星允派 NEBULA PI】09:USB虚拟CDC与串口1【星允派 NEBULA PI】08硬件SPI驱动W25Q64【星允派 NEBULA PI】07:IIC驱动24C02【星允派 NEBULA PI】05:调试外部中断
热门版块
查看更多
问型号
问技术
问行情
电子DIY
汽车电子工程师论坛
工业电子专区
新手入门指南
单片机/MCU论坛
PCB设计
开源项目

109

收藏

分享

微信扫码
分享给好友

评论