这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 第二期-智能手环DIY活动-屏幕驱动过程贴

共2条 1/1 1 跳转至

第二期-智能手环DIY活动-屏幕驱动过程贴

工程师
2025-08-30 15:15:51     打赏

咱们这次活动的OLED屏幕是SEEED Studio的Grove - OLED Yellow&Blue Display 0.96 (SSD1315)。

产品wiki: https://wiki.seeedstudio.com/Grove-OLED-Yellow&Blue-Display-0.96-SSD1315_V1.0/

产品电路图:https://files.seeedstudio.com/products/104020249/Grove-OLED-Yellow&Blue-Display-0.96-(SSD1315)_V1.0-SCH.pdf


image.png

电路图上的说明:

image.png

注意:0x78 (0b' 111_1000)是I2C八位地址,对应的7-bit地址为:0x3C (0b' 11_1100)。这个地址后续在代码里经常用到。

GROVE接口的IIC四根线连接到MAX78000的右下角的P0_16, P0_17,左上角的3V3和GND四个引脚。

image.png

首先初始化I2C1:

	error = MXC_I2C_Init(I2C_MASTER, 1, 0);
	if (error != E_NO_ERROR) {
		printf("-->I2C Master Initialization failed, error:%d\n", error);
		return -1;
	} else {
		printf("\n-->I2C Master Initialization Complete\n");
	}

之后设置I2C通信速率,这里选择100K.

MXC_I2C_SetFrequency(I2C_MASTER, I2C_FREQ);

之后进行屏幕的初始化,这里共用了之前的SSD1306的代码!

	HAL_Delay(1000);
	
	WriteCmd(0xAE);//--turn off oled panel
	WriteCmd(0x00);//---set low column address
	WriteCmd(0x10);//---set high column address
	WriteCmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
	WriteCmd(0x81);//--set contrast control register
	WriteCmd(0xCF);// Set SEG Output Current Brightness
	WriteCmd(0xA1);//--Set SEG/Column Mapping    
	WriteCmd(0xC8);//Set COM/Row Scan Direction   
	WriteCmd(0xA6);//--set normal display
	WriteCmd(0xA8);//--set multiplex ratio(1 to 64)
	WriteCmd(0x3f);//--1/64 duty
	WriteCmd(0xD3);//-set display offset	Shift Mapping RAM Counter (0x00~0x3F)
	WriteCmd(0x00);//-not offset
	WriteCmd(0xd5);//--set display clock divide ratio/oscillator frequency
	WriteCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
	WriteCmd(0xD9);//--set pre-charge period
	WriteCmd(0xF1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
	WriteCmd(0xDA);//--set com pins hardware configuration
	WriteCmd(0x12);
	WriteCmd(0xDB);//--set vcomh
	WriteCmd(0x40);//Set VCOM Deselect Level
	WriteCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
	WriteCmd(0x02);//
	WriteCmd(0x8D);//--set Charge Pump enable/disable
	WriteCmd(0x14);//--set(0x10) disable
	WriteCmd(0xA4);// Disable Entire Display On (0xa4/0xa5)
	WriteCmd(0xA6);// Disable Inverse Display On (0xa6/a7)
	OLED_Clear();
	WriteCmd(0xAF);	//Set display on added by sensoryoung
	HAL_Delay(200);

其中的写“数据”与写“命令”的实现如下:

/**************************************************************
	 Prototype      : void WriteCmd(uint8_t IIC_Command)
	 Parameters     : IIC_Command
	 return					: none
	 Description    : 写命令(通过HAL_I2C_WriteByte中的HAL_I2C_Master_Transmit
                      向0x00写入命令)
***************************************************************/
void WriteCmd(uint8_t IIC_Command)
{
	HAL_I2C_WriteByte(0x00, IIC_Command);
}

/**************************************************************
	 Prototype      : void WriteDat(uint8_t IIC_Data)
	 Parameters     : IIC_Data
	 return					: none
	 Description    : 写数据(通过HAL_I2C_WriteByte中的HAL_I2C_Master_Transmit
                      向0x40写入数据)
***************************************************************/
void WriteDat(uint8_t IIC_Data)
{
	HAL_I2C_WriteByte(0x40, IIC_Data);
}


具体到MAX78000的I2C的SDK上:

MXC_I2C_MasterTransaction(&reqMaster);


应用代码:

		OLED_Clear();
		OLED_ShowString(8, 0, "OLED Driven by HwI2C", 8, 1);
		OLED_ShowString(8, 16, "max78000", 8, 1);
		OLED_ShowString(64, 16, "Smart Band", 8, 1);
		OLED_ShowString(8, 32, "BloodPressure", 8, 1);
		OLED_ShowNum(103, 32, heart, 3, 8, 1);

		OLED_ShowString(8, 48, "SPO2", 8, 1);
		OLED_ShowNum(103, 48, (int)SpO2, 3, 8, 1);
		OLED_Refresh();


实现效果:(拍摄原因导致显示不全,实物显示非常好)

image.png



工程师
2025-08-30 17:14:39     打赏
2楼

感谢刘工的分享:

【EV76S68A试用】驱动OLED屏以及IIC发送指令注意事项 

 https://forum.eepw.com.cn/thread/393560/1



共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]