obsidian-notes/信号源/0.91_ OLED显示.md
CSSC-WORK\murmur 3e6078442b init version
2024-04-15 11:19:57 +08:00

128 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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即110-9 11位等宽对应99.999999999GHz+31/2变宽分隔符+11/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)`的参数2XOR模式将上一内容再次发送一次即可清空背景清空后参数恢复为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
#代码块