I2C禁止输出强上拉的电平,采用外置弱上拉电阻加开漏输出的电路结构,外置上拉电阻阻值一般为4.7kΩ左右。
按引脚定义用相应的引脚就好。
OLED输出的一种优化方案:
原来的刷新屏幕:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15void 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
19void 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,它的效率不增反降……我先找找原因