前作:二战蓝桥杯
建议读者先阅读前作写的模板,再来看后续内容。当然,本作仍然会整理前作模板,可能还会做一些调整。
致谢
- 感谢天地,感谢父母,感谢环境
- 特别地,感谢
zhj
(英雄豪杰!)和lfy
(膜拜大佬!)的关键性支持!感谢考场里带了万用表的选手!
前作:二战蓝桥杯
建议读者先阅读前作写的模板,再来看后续内容。当然,本作仍然会整理前作模板,可能还会做一些调整。
zhj
(英雄豪杰!)和lfy
(膜拜大佬!)的关键性支持!感谢考场里带了万用表的选手!没想到,还会再来一遍
勇敢梧桐树,不怕寒暑苦!
前作:stc15笔记
你知道我为什么去年只拿了个省三吗?
因为我的板子,有!错!误!这就导致代码在我的板子上面可以正常运行,但到了官方的板子上就跑不了。
Q:那你当时怎么不用比赛现场发的官方板子尝试一下?
A:太自信了,并且我的板子是Type-C接口有高级感。
Q:怎么想的?
A:失败有失败的原因,以史为鉴。
Q:只有这一种错误码?
A:我还出现了审题错误,误解题意导致某一项功能在最后的15分钟内去做更正;没找到客观题真题,导致只能根据仅存的知识乱蒙等。
为了蓝桥杯单片机开发赛道。由于各种原因,一直没赶上培训,所以就自学。自学也不错,一两个小时下来的效率比听讲要高很多,还能集百家之长,还能随便写点东西出来。
实话说,我现在手上这些的芯片,其速度大都超越了上个世纪八十年代的所有芯片——而且存储空间很大,封装体积很小,随便就能吊打当时的任何超级计算机——如果有。
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,它的效率不增反降……我先找找原因
我的新冠终于快要好啦!!!
刘慈欣:“好的程序员不去造轮子。”
刘慈欣:“我没说过这句话。”
刘慈欣:“我说过这句话。”
Update your browser to view this website correctly.&npsb;Update my browser now