我忘了这件事了,诶嘿o( ̄▽ ̄)d
我忘了这件事了,诶嘿o( ̄▽ ̄)d
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,它的效率不增反降……我先找找原因
我的新冠终于快要好啦!!!
浅写写代码注释规范
刘慈欣:“好的程序员不去造轮子。”
刘慈欣:“我没说过这句话。”
刘慈欣:“我说过这句话。”
我会直接放上完整的错误名称,并在下面附上解决方案。
在宣传部当了一年的打工人志愿者,记录一些经验以供参考。“道可道,非恒道”。知识与能力有限,恳请各位多多包涵。
debug是DOS环境下调试程序的得力助手。
Update your browser to view this website correctly.&npsb;Update my browser now