I2C禁止输出强上拉的电平,采用外置弱上拉电阻加开漏输出的电路结构,外置上拉电阻阻值一般为4.7kΩ左右。
按引脚定义用相应的引脚就好。
OLED输出的一种优化方案:
原来的刷新屏幕:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| void OLED_Refresh(void){ uint8_t i, j; uint8_t OLED_BufferUpdFlag = OLED_BufferUpdLagFlag | OLED_BufferLineUpdFlag; for (j = 0; j < 8; ++j){ if (OLED_BufferUpdFlag & 1){ OLED_SetCursor(0, j); for (i = 0; i < 128; ++i){ OLED_WriteData(OLED_Buffer[i][j]); OLED_Buffer[i][j] = 0; } } OLED_BufferUpdFlag >>= 1; } OLED_BufferUpdLagFlag = OLED_BufferLineUpdFlag; }
|
虽然有UpdFlag的优化,但是经过测试,它的最高帧率只能达到37fps左右。问题出在哪儿呢?问题就出在OLED_WriteData反复开始结束通讯消耗了大量无意义资源。
优化后,变成了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| void OLED_Refresh(void){ uint8_t i, j; uint8_t OLED_BufferUpdFlag = OLED_BufferUpdLagFlag | OLED_BufferLineUpdFlag; for (j = 0; j < 8; ++j){ if (OLED_BufferUpdFlag & 1){ OLED_SetCursor(0, j); OLED_I2C_Start(); OLED_I2C_SendByte(0x78); OLED_I2C_SendByte(0x40); for (i = 0; i < 128; ++i){ OLED_I2C_SendByte(OLED_Buffer[i][j]); OLED_Buffer[i][j] = 0; } } OLED_I2C_Stop(); OLED_BufferUpdFlag >>= 1; } OLED_BufferUpdLagFlag = OLED_BufferLineUpdFlag; }
|
虽然看上去不如之前的好看,但是它效率极高——直接达到了110fps!
但是!当我改用硬件I2C,它的效率不增反降……我先找找原因