STM32移植U8G2让我的光强计界面更加丝滑(1)
上期我们简单的焊接好了我们的样板之后,当然现在还少了一个开关和PMOS,不过整体已经能用了,但是还还只是非常简陋的界面。

本期呢,我们移植U8g2图像库,话不多说看看效果,当然本期的源码也可以直接使用,在STM32F103C8T6


U8G2是一个用于嵌入式系统的图形库,特别适用于微控制器和单片机。这个库支持大量的显示屏,如OLED、LCD和ePaper显示屏,并且以其高效、易用和广泛兼容性而闻名。

- 广泛的硬件支持:
- U8G2支持众多不同型号的显示屏,如SSD1306、SH1106、ST7920、UC1701等。这使得它在硬件选择上非常灵活。
- 多种接口支持:
- U8G2可以通过I2C、SPI和并行接口与显示屏通信,兼容性极高。
- 多种字体和图形功能:
- 提供了丰富的字体库,包括多种比例字体和符号字符。
- 支持基本图形绘制功能,如点、线、矩形、圆形、多边形等。
- 高效的内存管理:
- U8G2具有两种绘图模式:全缓冲和页面缓冲。全缓冲模式适用于内存充足的情况,而页面缓冲模式则适用于内存有限的嵌入式系统。
- 广泛的微控制器支持:
- U8G2可以在各种微控制器平台上运行,如Arduino、STM32、ESP8266、ESP32、AVR等。
- 开放源代码:
- U8G2是一个开源项目,可以自由获取和修改源代码,以适应特定项目需求。
本期我们主要的内容如下:
- 移植OPT3001光强传感器的内容
- 移植U8G2图像库
- 精简化U8G2
- 编写GUI代码

移植和精简化U8g2,这里不详细赘述了,网上有很多的教程 。
接着就是编写我们的GUI代码。
//进度条显示
void testDrawProcess(u8g2_t *u8g2)
{
for(int i=10;i<=80;i=i+2)
{
u8g2_ClearBuffer(u8g2);
char buff[20];
sprintf(buff,"%d%%",(int)(i/80.0*100));
u8g2_SetFont(u8g2,u8g2_font_ncenB12_tf);
u8g2_DrawStr(u8g2,16,32,"Lux meter");//字符显示
u8g2_SetFont(u8g2,u8g2_font_ncenB08_tf);
u8g2_DrawStr(u8g2,100,49,buff);//当前进度显示
u8g2_DrawRBox(u8g2,16,40,i,10,4);//圆角填充框矩形框
u8g2_DrawRFrame(u8g2,16,40,80,10,4);//圆角矩形
if(i%10==0)
{
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_0<<(i/10-1));
}
u8g2_SendBuffer(u8g2);
}
HAL_Delay(250);
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_All);
HAL_Delay(250);
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_All);
HAL_Delay(250);
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_All);
}
首当其冲的是初始化界面,虽然这段内容是冗余的没有用,但是帅就完事了。

uint32_t Lux;
void MainGUI(u8g2_t *u8g2)
{
int t = 1000;
int x = 16;
int y = 32;
int w = 50;
int h = 20;
char buff[20];
u8g2_SetFont(u8g2,u8g2_font_ncenB08_tf);
u8g2_ClearBuffer(u8g2);
u8g2_DrawStr(u8g2,5, 15, "Light Intensity");
u8g2_DrawStr(u8g2,95, 15, "High");
u8g2_DrawStr(u8g2,95, 60, "Low");
u8g2_DrawRFrame(u8g2, 0, 0, 92, 23,6);
B_LUX_40_GetLux(&Lux);
u8g2_SetFont(u8g2, u8g2_font_ncenB12_tr); // 设置字体为 ncenB14
if(Lux<1000)
{
Level = 1;
}
else if(Lux < 7000)
{
Level = 2;
}
else if(Lux < 15000)
{
Level = 3;
}
else if(Lux <33000)
{
Level = 4;
}
else if(Lux <78000)
{
Level = 5;
}
else if(Lux <170000)
{
Level = 6;
}
else if(Lux <290000)
{
Level = 7;
}
else
{
Level = 8;
}
sprintf(buff,"%6.0luLux",(long)Lux);
u8g2_DrawStr(u8g2,0,40,buff);
sprintf(buff,"LeveL:%d",Level);
u8g2_DrawStr(u8g2,7,60,buff);
if(Level>=8)
{
u8g2_DrawBox(u8g2, 104, 21, 8, 5);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,1);
}
else
{
u8g2_DrawFrame(u8g2, 104, 21, 8, 5);
}
if(Level>=7 &&Level<8)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,0);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6,1);
u8g2_DrawBox(u8g2, 95, 24, 8, 5);
}
else
{
u8g2_DrawFrame(u8g2, 95, 24, 8, 5);
}
if(Level>=6&&Level<7)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7|GPIO_PIN_6,0);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5,1);
u8g2_DrawBox(u8g2, 95, 29, 8, 5);
}
else
{
u8g2_DrawFrame(u8g2, 95, 29, 8, 5);
}
if(Level>=5&&Level<6)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,0);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4,1);
u8g2_DrawBox(u8g2, 104, 32, 8, 5);
}
else
{
u8g2_DrawFrame(u8g2, 104, 32, 8, 5);
}
if(Level>=4&&Level<5)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,0);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,1);
u8g2_DrawBox(u8g2, 113, 35, 8, 5);
}
else
{
u8g2_DrawFrame(u8g2, 113, 35, 8, 5);
}
if(Level>=3&&Level<4)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_4|GPIO_PIN_3,0);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2,1);
u8g2_DrawBox(u8g2, 113, 40, 8, 5);
}
else
{
u8g2_DrawFrame(u8g2, 113, 40, 8, 5);
}
if(Level>=2&&Level<3)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,0);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0|GPIO_PIN_1,1);
u8g2_DrawBox(u8g2, 104, 43, 8, 5);
}
else
{
u8g2_DrawFrame(u8g2, 104, 43, 8, 5);
}
if(Level>=1&&Level<2)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6,0);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,1);
u8g2_DrawBox(u8g2, 95, 45, 8, 5);
}
else
{
u8g2_DrawFrame(u8g2, 95, 45, 8, 5);
}
}
嘉立创PCB


登录 或 注册 后才可以进行评论哦!
还没有评论,抢个沙发!