--- 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 #代码块