咱们这次活动的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/
电路图上的说明:
注意:0x78 (0b' 111_1000)是I2C八位地址,对应的7-bit地址为:0x3C (0b' 11_1100)。这个地址后续在代码里经常用到。
GROVE接口的IIC四根线连接到MAX78000的右下角的P0_16, P0_17,左上角的3V3和GND四个引脚。
首先初始化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();
实现效果:(拍摄原因导致显示不全,实物显示非常好)