128 lines
3.8 KiB
Markdown
128 lines
3.8 KiB
Markdown
|
---
|
|||
|
title: 0.91' OLED显示
|
|||
|
updated: 2022-05-12 02:09:19Z
|
|||
|
created: 2022-01-08 13:18:08Z
|
|||
|
tags:
|
|||
|
- mcu
|
|||
|
- oled
|
|||
|
- u8g2
|
|||
|
- 代码块
|
|||
|
---
|
|||
|
|
|||
|
# 显示规划
|
|||
|
0.91‘的OLED大小刚好合适,分辨率(128*32)也可以显示足够多的消息量。
|
|||
|
|
|||
|
mini定位低端,功能简单,小巧便携,使用方便。
|
|||
|
|
|||
|
可设置选项有频率和功率,输出使能,**其它功能需通过控制接口通过上位机实现**。
|
|||
|
2021.04.13取消上位机控制功能,暂定使用CDC串口
|
|||
|
|
|||
|
显示界面第一行左侧显示功率,分辨率1dB2021.04.13或可0.5dB;右侧显示输出使能状态
|
|||
|
|
|||
|
第二行显示频率,分辨率1kHz
|
|||
|
|
|||
|
|
|||
|
2021.04.16
|
|||
|
|
|||
|
0.91‘的ips屏效果可能更好,价格差不多
|
|||
|
|
|||
|
~~可考虑加电池,满载续航目标30分钟(约需200mAH)~~
|
|||
|
|
|||
|
|
|||
|
# 程序设计
|
|||
|
2021.05.06
|
|||
|
|
|||
|
0.91屏分辨率为128\*32
|
|||
|
|
|||
|
为方便程序设计,显示用数字部分尽量采用等宽字体,但等宽字体标点符号也是等宽,浪费空间频率对应数字添加分隔符`, .`等提升辨识度
|
|||
|
频率对应显示位数总数约为18,即11(0-9 11位等宽,对应99.999999999GHz)+3(1/2变宽,分隔符,,。)+1(1/2变宽:)+4(变宽,大写字母LMH)+1(变宽,小写字母z)
|
|||
|
故字体宽度最大为7,若为8则MHz无法显示完整(可只显示M)
|
|||
|
|
|||
|
数字字体中基本自带等宽,除了数字1
|
|||
|
|
|||
|
|
|||
|
|
|||
|
数字字体`u8g2_font_bauhaus2015_tn`
|
|||
|
|
|||
|
单位字体`u8g2_font_beanstalk_mel_tr`
|
|||
|
|
|||
|
状态字体`u8g2_font_tenfatguys_tr`
|
|||
|
|
|||
|
字高==11==:
|
|||
|
```c
|
|||
|
u8g2_SetFont(&u8g2,u8g2_font_bauhaus2015_tn);//?*11
|
|||
|
u8g2_DrawStr(&u8g2,10-2,15-1,"-60.5");
|
|||
|
u8g2_DrawStr(&u8g2,10-2,30,"0,023.456,789");//cnt =18, max W of font is 7
|
|||
|
u8g2_SetFont(&u8g2,u8g2_font_tenfatguys_tr);//15*14
|
|||
|
u8g2_DrawStr(&u8g2,90+5+10+1,15-1,"ON");
|
|||
|
u8g2_SetFont(&u8g2,u8g2_font_beanstalk_mel_tr);//?*10
|
|||
|
u8g2_DrawStr(&u8g2,10+40-4+4,15-1,"dBm");
|
|||
|
u8g2_DrawStr(&u8g2,112+1,30,"MHz");
|
|||
|
u8g2_DrawStr(&u8g2,0,30,">");
|
|||
|
u8g2_SendBuffer(&u8g2);
|
|||
|
```
|
|||
|
字高==12==
|
|||
|
```
|
|||
|
u8g2_SetFont(&u8g2,u8g2_font_cupcakemetoyourleader_tn);//?*12
|
|||
|
u8g2_DrawStr(&u8g2,10-5,15-1,"-60.5");
|
|||
|
u8g2_DrawStr(&u8g2,10-5,30,"0,023.456,78");//cnt =18, max W of font is 7
|
|||
|
u8g2_SetFont(&u8g2,u8g2_font_tenfatguys_tr);//15*14
|
|||
|
u8g2_DrawStr(&u8g2,90+5,15-1,"OFF");
|
|||
|
//u8g2_DrawStr(&u8g2,90+5+10+1,15-1,"ON");
|
|||
|
u8g2_SetFont(&u8g2,u8g2_font_beanstalk_mel_tr);//?*10
|
|||
|
u8g2_DrawStr(&u8g2,10+40-4+4,15-1,"dBm");
|
|||
|
u8g2_DrawStr(&u8g2,112+1,30,"MHz");
|
|||
|
u8g2_DrawStr(&u8g2,0,15-2,">");
|
|||
|
u8g2_DrawStr(&u8g2,0,30-2,">");
|
|||
|
```
|
|||
|
# 刷新问题
|
|||
|
由其它数字刷新为1时背景无法清除的解决办法:
|
|||
|
|
|||
|
理论上发送空格“ ”可清除背景,实测不行
|
|||
|
|
|||
|
改为利用`u8g2_SetDrawColor(&u8g2, 2)`的参数2(XOR模式),将上一内容再次发送一次即可清空背景,清空后参数恢复为1。
|
|||
|
|
|||
|
从主界面切换到其它界面时L/F参数不会变化,故切换回主界面时直接恢复最高效,为此需在切换前缓存界面,方法如下:
|
|||
|
```c
|
|||
|
void getbuffer(void)
|
|||
|
{
|
|||
|
uint8_t *ptr= u8g2_GetBufferPtr(&u8g2);
|
|||
|
uint16_t size = u8g2_GetBufferTileHeight(&u8g2) * u8g2_GetBufferTileWidth(&u8g2) * 8;
|
|||
|
lastbuffer = (uint8_t *)malloc(size);
|
|||
|
for (uint16_t var = 0; var < size; ++var) {
|
|||
|
*(lastbuffer+var) = *(ptr+var);
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
切换回主界面后可释放缓存
|
|||
|
|
|||
|
# 内存
|
|||
|
使用malloc比直接分配固定大小数组节省0.5K内存,因为malloc在编译时不分配,使用时才“动态分配”
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# 数字反显
|
|||
|
当前数字反显
|
|||
|
|
|||
|
正常模式下填充背景
|
|||
|
切换模式
|
|||
|
写入数字
|
|||
|
换回正常模式
|
|||
|
|
|||
|
```c
|
|||
|
8g2_DrawBox(&u8g2, numLoc[i], F_OFFSET_Y-FONTH-1, FONTALLW, FONTH+2);
|
|||
|
u8g2_SetDrawColor(&u8g2, 0);//clear pixel mode
|
|||
|
u8g2_DrawStr(&u8g2, numLoc[i], 30, “0”);
|
|||
|
u8g2_SetDrawColor(&u8g2, 1);//back to default color(set pixel)
|
|||
|
```
|
|||
|
|
|||
|
# 源码
|
|||
|
2010.06
|
|||
|
demo版程序:
|
|||
|
[oled12832.zip](../_resources/oled12832.zip)
|
|||
|
|
|||
|
#u8g2
|
|||
|
#oled
|
|||
|
#mcu
|
|||
|
#代码块
|