文章目录
一、关于u8g2图形库的移植
具体参考文章:
https://blog.csdn.net/black_sneak/article/details/126312657
内容步骤太多,一步步跟着参考,中间容易踩坑,注意细节即可,实在不行,可以下载该作者的源码进行后续实验,做完之后再理解前面的内容,他已在文章末尾给出源码!
转载源码:https://pan.baidu.com/s/16SCXGKyoBlVZwUR4bse6ug
提取码:93ig
要具体理解每个函数的用法,可以参考这篇文章,非常详细:
https://blog.csdn.net/qq_51096702/article/details/130257230
二、u8g2的demo例程
移植完成后,主要看main.c、test.c和test.h
(一)main函数修改
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C2_Init();
MX_TIM1_Init();
/* USER CODE BEGIN 2 */
u8g2_t u8g2;
u8g2Init(&u8g2);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
u8g2_FirstPage(&u8g2);
do
{
draw(&u8g2);
u8g2DrawTest(&u8g2);
} while (u8g2_NextPage(&u8g2));
}
/* USER CODE END 3 */
}
(二)test.c
#include "test.h"
//---------------U8g2测试函数
#define SEND_BUFFER_DISPLAY_MS(u8g2, ms)\
do {\
u8g2_SendBuffer(u8g2); \
HAL_Delay(ms);\
}while(0);
//进度条显示
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,"STM32 U8g2");//字符显示
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);//圆角矩形
u8g2_SendBuffer(u8g2);
}
HAL_Delay(500);
}
//字体测试 数字英文可选用 u8g2_font_ncenB..(粗) 系列字体
//u8g2_font_unifont_t_symbols/u8g2_font_unifont_h_symbols(细 圆润)
void testShowFont(u8g2_t *u8g2)
{
int t = 1000;
char testStr[14] = "STM32F103C8T6";
u8g2_ClearBuffer(u8g2);
u8g2_SetFont(u8g2,u8g2_font_u8glib_4_tf);
u8g2_DrawStr(u8g2,0,5,testStr);
SEND_BUFFER_DISPLAY_MS(u8g2,t);
u8g2_SetFont(u8g2,u8g2_font_ncenB08_tf);
u8g2_DrawStr(u8g2,0,30,testStr);
SEND_BUFFER_DISPLAY_MS(u8g2,t);
u8g2_SetFont(u8g2,u8g2_font_ncenB10_tr);
u8g2_DrawStr(u8g2,0,60,testStr);
SEND_BUFFER_DISPLAY_MS(u8g2,t);
}
//画空心矩形
void testDrawFrame(u8g2_t *u8g2)
{
int t = 1000;
int x = 16;
int y = 32;
int w = 50;
int h = 20;
u8g2_ClearBuffer(u8g2);
u8g2_DrawStr(u8g2,0, 15, "DrawFrame");
u8g2_DrawFrame(u8g2, x, y, w, h);
SEND_BUFFER_DISPLAY_MS(u8g2,t);
u8g2_DrawFrame(u8g2, x+w+5, y-10, w-20, h+20);
SEND_BUFFER_DISPLAY_MS(u8g2,t);
}
//画实心圆角矩形
void testDrawRBox(u8g2_t *u8g2)
{
int t = 1000;
int x = 16;
int y = 32;
int w = 50;
int h = 20;
int r = 3;
u8g2_ClearBuffer(u8g2);
u8g2_DrawStr(u8g2,0, 15, "DrawRBox");
u8g2_DrawRBox(u8g2, x, y, w, h, r);
SEND_BUFFER_DISPLAY_MS(u8g2,t);
u8g2_DrawRBox(u8g2, x+w+5, y-10, w-20, h+20, r);
SEND_BUFFER_DISPLAY_MS(u8g2,t);
}
//画空心圆
void testDrawCircle(u8g2_t *u8g2)
{
int t = 600;
int stx = 0; //画图起始x
int sty = 16; //画图起始y
int with = 16;//一个图块的间隔
int r = 15; //圆的半径
u8g2_ClearBuffer(u8g2);
u8g2_DrawStr(u8g2, 0, 15, "DrawCircle");
u8g2_DrawCircle(u8g2, stx, sty - 1 + with, r, U8G2_DRAW_UPPER_RIGHT); //右上
SEND_BUFFER_DISPLAY_MS(u8g2,t);
u8g2_DrawCircle(u8g2, stx + with, sty, r, U8G2_DRAW_LOWER_RIGHT); //右下
SEND_BUFFER_DISPLAY_MS(u8g2,t);
u8g2_DrawCircle(u8g2, stx - 1 + with * 3, sty - 1 + with, r, U8G2_DRAW_UPPER_LEFT); //左上
SEND_BUFFER_DISPLAY_MS(u8g2,t);
u8g2_DrawCircle(u8g2, stx - 1 + with * 4, sty, r, U8G2_DRAW_LOWER_LEFT); //左下
SEND_BUFFER_DISPLAY_MS(u8g2,t);
u8g2_DrawCircle(u8g2, stx - 1 + with * 2, sty - 1 + with * 2, r, U8G2_DRAW_ALL);//整个圆
SEND_BUFFER_DISPLAY_MS(u8g2,t);
u8g2_DrawCircle(u8g2, 32*3, 32, 31, U8G2_DRAW_ALL);//右侧整个圆
SEND_BUFFER_DISPLAY_MS(u8g2,t);
}
//画实心椭圆
void testDrawFilledEllipse(u8g2_t *u8g2)
{
int t = 800;
int with = 16;//一个图块的间隔
int rx = 27; //椭圆x方向的半径
int ry = 22; //椭圆y方向的半径
u8g2_ClearBuffer(u8g2);
u8g2_DrawStr(u8g2,0, 14, "DrawFilledEllipse");
SEND_BUFFER_DISPLAY_MS(u8g2,t);
u8g2_DrawFilledEllipse(u8g2, 0, with, rx, ry, U8G2_DRAW_LOWER_RIGHT);//右下
SEND_BUFFER_DISPLAY_MS(u8g2,t);
u8g2_DrawFilledEllipse(u8g2, with * 4 - 1, with, rx, ry, U8G2_DRAW_LOWER_LEFT); //左下
SEND_BUFFER_DISPLAY_MS(u8g2,t);
u8g2_DrawFilledEllipse(u8g2, 0, with * 4 - 1, rx, ry, U8G2_DRAW_UPPER_RIGHT); //右上
SEND_BUFFER_DISPLAY_MS(u8g2,t);
u8g2_DrawFilledEllipse(u8g2, with * 4 - 1, with * 4 - 1, rx, ry, U8G2_DRAW_UPPER_LEFT); //左上
SEND_BUFFER_DISPLAY_MS(u8g2,t);
u8g2_DrawFilledEllipse(u8g2, with * 6, with * 2.5, rx, ry, U8G2_DRAW_ALL);//整个椭圆
SEND_BUFFER_DISPLAY_MS(u8g2,t);
}
//环形测试
void testDrawMulti(u8g2_t *u8g2)
{
u8g2_ClearBuffer(u8g2);
for (int j = 0; j < 64; j+=16)
{
for (int i = 0; i < 128; i+=16)
{
u8g2_DrawPixel(u8g2, i, j);
u8g2_SendBuffer(u8g2);
}
}
//实心矩形逐渐变大
u8g2_ClearBuffer(u8g2);
for(int i=30; i>0; i-=2)
{
u8g2_DrawBox(u8g2,i*2,i,128-i*4,64-2*i);
u8g2_SendBuffer(u8g2);
}
//空心矩形逐渐变小
u8g2_ClearBuffer(u8g2);
for(int i=0; i<32; i+=2)
{
u8g2_DrawFrame(u8g2,i*2,i,128-i*4,64-2*i);
u8g2_SendBuffer(u8g2);
}
//实心圆角矩形逐渐变大
u8g2_ClearBuffer(u8g2);
for(int i=30; i>0; i-=2)
{
u8g2_DrawRBox(u8g2,i*2,i,128-i*4,64-2*i,10-i/3);
u8g2_SendBuffer(u8g2);
}
//空心圆角矩形逐渐变小
u8g2_ClearBuffer(u8g2);
for(int i=0; i<32; i+=2)
{
u8g2_DrawRFrame(u8g2,i*2,i,128-i*4,64-2*i,10-i/3);
u8g2_SendBuffer(u8g2);
}
//实心圆逐渐变大
u8g2_ClearBuffer(u8g2);
for(int i=2; i<64; i+=3)
{
u8g2_DrawDisc(u8g2,64,32,i, U8G2_DRAW_ALL);
u8g2_SendBuffer(u8g2);
}
//空心圆逐渐变小
u8g2_ClearBuffer(u8g2);
for(int i=64; i>0; i-=3)
{
u8g2_DrawCircle(u8g2,64,32,i, U8G2_DRAW_ALL);
u8g2_SendBuffer(u8g2);
}
//实心椭圆逐渐变大
u8g2_ClearBuffer(u8g2);
for(int i=2; i<32; i+=3)
{
u8g2_DrawFilledEllipse(u8g2,64,32, i*2, i, U8G2_DRAW_ALL);
u8g2_SendBuffer(u8g2);
}
//空心椭圆逐渐变小
u8g2_ClearBuffer(u8g2);
for(int i=32; i>0; i-=3)
{
u8g2_DrawEllipse(u8g2,64,32, i*2, i, U8G2_DRAW_ALL);
u8g2_SendBuffer(u8g2);
}
}
// width: 128, height: 48
const unsigned char bilibili[] U8X8_PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xe0, 0x03, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xf0, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x01, 0xfc, 0x00, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0xfc, 0x00, 0x00, 0x3c, 0xc0, 0x0f, 0x00, 0x80, 0x03, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfc, 0x00, 0x00, 0x3c, 0xc0, 0x0f, 0x00, 0xc0, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfc, 0x00, 0x00, 0x3c, 0x80, 0x0f, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x80, 0x0f, 0xf8, 0x00, 0x00, 0x3c, 0x80, 0x0f, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x78, 0x80, 0x0f, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x78, 0x80, 0x0f, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x80, 0x79, 0x80, 0x0f, 0x00, 0x98, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0xe0, 0x79, 0x9f, 0x0f, 0x00, 0xbe, 0xe7, 0x01, 0xc0, 0x07, 0x10, 0x40, 0x00, 0x1f, 0xf8, 0x00, 0xe0, 0x7b, 0x1f, 0x0f, 0x00, 0xbe, 0xe7, 0x01, 0xc0, 0x87, 0x1f, 0xe0, 0x0f, 0x1f, 0xf8, 0x00, 0xe0, 0x7b, 0x1e, 0x0f, 0x00, 0x3e, 0xe7, 0x01, 0xc0, 0xe7, 0x3f, 0xe0, 0x3f, 0x1f, 0xf0, 0x00, 0xe0, 0x7b, 0x1e, 0x0f, 0x00, 0x3e, 0xe7, 0x01, 0xc0, 0xe7, 0x3f, 0xe0, 0x3f, 0x1f, 0xf0, 0x00, 0x60, 0x71, 0x1e, 0x0f, 0x00, 0x34, 0xe7, 0x01, 0xc0, 0xe7, 0x07, 0x00, 0x3f, 0x1f, 0xf0, 0x00, 0x00, 0x70, 0x00, 0x1f, 0x00, 0x00, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0xc0, 0x73, 0x1e, 0x1f, 0x00, 0x3c, 0xc7, 0x01, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0xc0, 0x73, 0x1e, 0x1f, 0x00, 0x7c, 0xe7, 0x01, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0xc0, 0x73, 0x1e, 0x1f, 0x00, 0x7c, 0xef, 0x01, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x01, 0xc0, 0x77, 0x1e, 0x1e, 0x00, 0x7c, 0xef, 0x01, 0xc0, 0x07, 0x00, 0x03, 0x00, 0x1f, 0xf0, 0xff, 0xc1, 0xf7, 0x1e, 0xfe, 0x1f, 0x78, 0xef, 0x01, 0xc0, 0x07, 0x70, 0x37, 0x00, 0x1f, 0xe0, 0xff, 0x87, 0xf7, 0x1e, 0xfe, 0xff, 0x78, 0xee, 0x01, 0xc0, 0x07, 0xe0, 0x3f, 0x00, 0x1f, 0xe0, 0xff, 0x9f, 0xf7, 0x1e, 0xfe, 0xff, 0x79, 0xce, 0x01, 0xc0, 0x07, 0xc0, 0x18, 0x00, 0x1f, 0xe0, 0xff, 0xbf, 0xe7, 0x1e, 0xfe, 0xff, 0x7b, 0xce, 0x01, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0xc7, 0xbf, 0xe7, 0x1e, 0xfe, 0xf8, 0x77, 0xce, 0x01, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x0f, 0x3f, 0xe7, 0x1c, 0xfe, 0xf0, 0x77, 0xce, 0x03, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0xcf, 0x3f, 0xe7, 0x1c, 0xfe, 0xf8, 0xf3, 0xce, 0x03, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xe0, 0xef, 0x1f, 0xe7, 0x1c, 0xfe, 0xfe, 0xf1, 0xce, 0x03, 0x80, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xe0, 0xff, 0x0f, 0xcf, 0x1c, 0xfc, 0xff, 0xf0, 0xc0, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0x07, 0xe0, 0xff, 0x03, 0x06, 0x1c, 0xfc, 0x7f, 0x60, 0xc0, 0x01, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x03, 0xe0, 0xff, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
// width: 128, height: 48
const unsigned char three_support[] U8X8_PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x80, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x80, 0x0f, 0xf0, 0x01, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0x00, 0xc0, 0xfd, 0xff, 0x00, 0x00, 0xc0, 0x7f, 0xfe, 0x01, 0x00, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x01, 0x00, 0xc0, 0x1f, 0xf8, 0x03, 0x00, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x01, 0x00, 0xc0, 0x0f, 0xf0, 0x03, 0x00, 0x00, 0xfe, 0xff, 0x07, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x01, 0x00, 0xc0, 0x67, 0xe6, 0x03, 0x00, 0x00, 0xfc, 0xff, 0x03, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x01, 0x00, 0xc0, 0x67, 0xe6, 0x03, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x00, 0x00, 0xc0, 0x67, 0xe6, 0x03, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x00, 0x00, 0xc0, 0x67, 0xee, 0x03, 0x00, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x00, 0x00, 0x80, 0x7f, 0xfe, 0x01, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x00, 0x00, 0x80, 0x7f, 0xfe, 0x01, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x00, 0xf8, 0xf9, 0x01, 0x00, 0x00, 0xe0, 0xfd, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0xf8, 0xf0, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0x1f, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
void testDrawXBM(u8g2_t *u8g2)
{
int t = 1000;
u8g2_ClearBuffer(u8g2);
u8g2_DrawStr(u8g2,0, 14, "DrawXBM");
u8g2_DrawXBM(u8g2,0, 16, 128, 48, bilibili);
SEND_BUFFER_DISPLAY_MS(u8g2,t);
u8g2_ClearBuffer(u8g2);
u8g2_DrawStr(u8g2,0, 14, "bilibili");
u8g2_DrawXBM(u8g2,0, 16, 128, 48, three_support);
SEND_BUFFER_DISPLAY_MS(u8g2,t);
}
void u8g2DrawTest(u8g2_t *u8g2)
{
testDrawProcess(u8g2);
testDrawMulti(u8g2);
//testDrawFrame(u8g2);
//testDrawRBox(u8g2);
//testDrawCircle(u8g2);
//testDrawFilledEllipse(u8g2);
testShowFont(u8g2);
testDrawXBM(u8g2);
}
(三)test.h
#ifndef __TEST_H
#define __TEST_H
#include "main.h"
#include "u8g2.h"
void testDrawProcess(u8g2_t *u8g2);
void testShowFont(u8g2_t *u8g2);
void testDrawFrame(u8g2_t *u8g2);
void testDrawRBox(u8g2_t *u8g2);
void testDrawCircle(u8g2_t *u8g2);
void testDrawFilledEllipse(u8g2_t *u8g2);
void testDrawMulti(u8g2_t *u8g2);
void testDrawXBM(u8g2_t *u8g2);
void u8g2DrawTest(u8g2_t *u8g2);
#endif
(四)demo部分完成效果
demo部分
三、显示你自己的学号和名字(或网名昵称)+掌握上下、左右滑动显示方法
(一)关于编码和字体的问题
keil最好采用utf-8编码,不然使用u8g2中的函数DrawUTF8不会显示任何汉字
如果原来用的gb2312编码,改完后也就是main.c,test.c中文注释会乱码,可以改用B站江科大oled课程里面的转换编码软件来转换成utf-8编码,这样能兼容的语言多一些
这里说一下关于字体的问题,u8g2库自带有一些中文字体
可以参考此篇文章描述:
https://blog.csdn.net/oyanzhishiyue/article/details/139355667
除了gb2312字库,其他的库只有部分汉字包含在内,其实也不是很多,如果不能显示,可能需要自己添加自定义的字库或者取模软件取字模数组
这里我没有用文章中提到的最全的gb2312字库,是因为我用了之后报了190+ error,错误开头No space xxx,大概是说内存空间不够,我换成其他字符数少一些的字库就无错误了
但是字符数少的哪些字库刚好缺少了我要的字,文件已经很精简了,该删的都删了,还是空间不够,就这个项目而言,大概只能改用取模软件取字模数组来实现了
(二)任务2+3的实现
1.test.c加入代码
//任务2:显示你自己的学号和名字(或网名昵称)+任务3:分别实现上下、左右滚动显示
void scrollTextTogether(u8g2_t *u8g2, const char *text1, const char *text2, int y, int stepSize, int delayMs) {
int len1 = strlen(text1);
int len2 = strlen(text2);
int x1 = (128 - u8g2_GetUTF8Width(u8g2, text1)) / 2;
int x2 = (128 - u8g2_GetUTF8Width(u8g2, text2)) / 2;
int i, j;
// 上下滚动
for(i = y; i >= -(u8g2_GetMaxCharHeight(u8g2) + 2); i -= stepSize) {
u8g2_ClearBuffer(u8g2);
u8g2_DrawUTF8(u8g2, x1, i, text1);
u8g2_DrawUTF8(u8g2, x2, i + 16, text2); // 16为两行文字的垂直间距
u8g2_SendBuffer(u8g2);
HAL_Delay(delayMs);
}
// 左右滚动
for(j = 0; j <= (128 - u8g2_GetUTF8Width(u8g2, text1)); j += stepSize) {
u8g2_ClearBuffer(u8g2);
u8g2_DrawUTF8(u8g2, x1 + j, y, text1);
u8g2_DrawUTF8(u8g2, x2 + j, y + 16, text2); // 16为两行文字的垂直间距
u8g2_SendBuffer(u8g2);
HAL_Delay(delayMs);
}
}
void testDisplayNumberName(u8g2_t *u8g2) {
u8g2_ClearBuffer(u8g2);
// 设置字体
u8g2_SetFont(u8g2, u8g2_font_wqy12_t_chinese3);
const char *text1 = "632207060317";
const char *text2 = "水上由歧";
int y = 24; // 初始Y坐标
int stepSize = 2; // 滚动步长
int delayMs = 50; // 每帧显示时间
// 上下滚动,再左右滚动
scrollTextTogether(u8g2, text1, text2, y, stepSize, delayMs);
SEND_BUFFER_DISPLAY_MS(u8g2, 3000); // 确保有足够的显示时间
}
大致思路:
计算两行文本的长度,并根据屏幕宽度将文本居中显示。然后,使用一个循环来实现上下滚动效果,通过不断减小Y坐标,并在每次移动后显示文本,同时使用HAL_Delay函数来控制滚动的速度。
上下滚动完成后,代码再次使用一个循环来实现左右滚动效果,这次是通过增加文本的X坐标来实现的。
最后,SEND_BUFFER_DISPLAY_MS宏用于确保显示滚动文本的时间足够长,以便显示。
2.实验效果
任务2+3_x264
四、显示一个图案(比如你的头像肖像),最好有动态效果
(一)任选图片,利用windows自带“图画”转化为bmp单色图
原图:
选中图片右键,打开方式选择windows自带应用“画图”(没有的可以用格式工厂等方式转格式)
选择文件-另存为-bmp格式的单色位图,记得长宽改成128* 64
效果如上图bmp所示
然后下载PCtoLCD2002,用来取模
蓝奏云链接:https://wwp.lanzoue.com/iEz8G20u07vg
进入软件,选择模式-图形模式
再单击选项,配置如下,点击生成字模,即可完成取模
(二)编写函数
将得到的字模数组放进你自己写的函数就行
//任务4:显示一个图案(比如你的头像肖像),最好有动态效果。
const unsigned char Yuki[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x7F,0x09,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x80,0x3F,0x00,0xFE,0x1F,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x80,0x1F,0x00,0xCC,0x83,0x7F,0x00,0xC0,0xFF,0x00,0x00,0x00,
0x00,0x00,0x10,0x03,0x00,0x38,0x00,0xC0,0xFF,0x3F,0x00,0x00,0xFE,0x07,0x00,0x00,
0x00,0x06,0x03,0x00,0x00,0xC0,0x01,0x40,0x9F,0xFF,0x00,0x00,0xC0,0x1F,0x00,0x00,
0xC0,0xFF,0xC1,0x00,0x00,0x20,0x7E,0xC0,0x1F,0x78,0x00,0x00,0x00,0x70,0x00,0x00,
0xF8,0x7F,0x00,0x00,0x00,0x80,0x01,0x80,0x1F,0xDF,0xCF,0x01,0x00,0x00,0x04,0x00,
0xFF,0x3F,0x00,0x00,0x00,0x18,0xE7,0xBF,0xFF,0xFF,0xFF,0x81,0x01,0x00,0x00,0x00,
0xFF,0x1F,0x00,0x00,0x00,0x20,0xCC,0xFF,0xFF,0xFF,0xFF,0xF7,0x0F,0x00,0x00,0x00,
0xFF,0x1F,0x00,0x00,0x54,0x68,0x9C,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,
0xFF,0x0F,0x00,0x00,0xEE,0xD1,0x6C,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,
0xFF,0x07,0x00,0x00,0x5D,0xE7,0xD9,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0xFF,0x07,0x80,0x00,0xBD,0xCF,0xDF,0xFF,0xFF,0xFF,0x1F,0xFE,0xFF,0x81,0x0F,0x00,
0x3F,0x02,0x00,0x01,0xFF,0xFF,0xB7,0xFF,0xFF,0xFF,0xFF,0xFC,0xFF,0x83,0xFF,0x00,
0x83,0x03,0x00,0x03,0xF2,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0x0F,
0xE1,0x06,0x00,0x01,0xE4,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,
0x18,0x07,0x00,0x02,0xC6,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
0x08,0x3F,0x00,0x06,0x80,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,
0x04,0xCF,0x7F,0x0E,0x04,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,
0x81,0x1F,0x18,0x3F,0x04,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x81,0xFF,0xF3,0x3F,0x8C,0xC0,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x81,0xFF,0xFF,0x63,0x08,0xC0,0xFF,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,
0x81,0xFF,0xFF,0xC3,0x18,0xC0,0xFF,0x1F,0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0x8F,0x1F,
0xC1,0xFF,0xFF,0x83,0x11,0xE0,0xFF,0x3F,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x08,
0xC3,0xFF,0xFF,0x03,0x33,0xE0,0xFF,0x7F,0x00,0xFE,0xEF,0xFF,0xFF,0xFF,0xFF,0x01,
0xCF,0xFF,0xFF,0x0F,0x26,0xF0,0xFF,0xFF,0x01,0xF8,0xC7,0xFF,0xFF,0xFF,0xFF,0x03,
0xCB,0xFF,0xFF,0x07,0x4C,0xF0,0xFF,0xFF,0x07,0xE0,0x03,0xFF,0xFF,0xFF,0xFF,0x1F,
0xDB,0xFF,0xFF,0x07,0x7C,0xFC,0xFF,0xFF,0x0F,0x00,0x00,0xFC,0xFF,0xFF,0xFF,0xFF,
0xCB,0xFF,0xFF,0x03,0xC4,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,
0xEB,0xFF,0xFF,0x03,0x04,0xFD,0xFF,0xFF,0x7F,0x00,0x00,0xC0,0xFF,0xFF,0xFF,0x7F,
0xEB,0xFF,0xFF,0x07,0x05,0xF0,0xFF,0xFF,0x3F,0x0E,0xC0,0xFF,0x7F,0xFE,0xFF,0xDF,
0xEB,0xFF,0xFF,0xFF,0x02,0xF0,0xFD,0xFF,0x7F,0x1C,0x00,0xFC,0x9F,0xFF,0xFF,0xFF,
0xEF,0xFF,0xFF,0xFB,0x01,0xC0,0xFF,0xFF,0xF7,0x18,0x00,0xF8,0xE7,0xE7,0xFF,0x7F,
0xF7,0xFF,0xFF,0x03,0x00,0xC0,0xFF,0xFF,0xC0,0x3D,0x00,0xFC,0xF9,0xF9,0xFF,0xFF,
0xF5,0xFF,0xFF,0x07,0x00,0x80,0xFF,0x1F,0xC0,0xFF,0x00,0x60,0x7F,0xFE,0xFF,0xFF,
0xF9,0xFF,0xFF,0x07,0x00,0x80,0xFF,0x01,0xC0,0xFF,0x03,0x80,0x9F,0xFF,0xF3,0xFF,
0xFB,0xFF,0xFF,0x0F,0x00,0x00,0xFF,0x01,0xF0,0xFF,0x07,0x00,0xE7,0x7F,0xFC,0xFF,
0xFB,0xFF,0xFF,0x0F,0x7C,0x30,0xFF,0x07,0xFC,0xFF,0x1F,0x00,0xF8,0x1F,0xFF,0xFC,
0xDB,0xFF,0xFF,0x1F,0x03,0x00,0xFF,0x0F,0xFF,0xFF,0x7F,0x00,0xF0,0xC7,0x1F,0xFF,
0xDF,0xFF,0xFF,0x9F,0x00,0x00,0xFE,0xDF,0xFF,0xFF,0xFF,0x01,0xC0,0x79,0xC7,0xFB,
0xDF,0xFF,0xFF,0xBF,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0xFE,0x71,0x76,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x60,0xDC,0x1D,
0xFF,0xDF,0xFF,0xFF,0x01,0x00,0xF0,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x80,0x77,0x87,
0xFF,0xFF,0xFF,0xFF,0x01,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,0x00,0xFD,0xE1,
0xBF,0xFF,0xFF,0xFF,0x07,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x7E,0x78,
0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0xFC,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x1C,0xDF,
0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0xF0,0xFF,0x3F,0x00,0x00,0x00,0x00,0xC0,0x73,
0xFF,0xFF,0xFF,0xFF,0xFF,0x40,0x00,0xC0,0x9F,0x00,0x00,0xC0,0x0F,0x00,0xC0,0x1D,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x1F,0x00,0x00,0xFC,0xFF,0x00,0x00,0x87,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x80,0xFF,0xFF,0x03,0x00,0xF0,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0xF0,0xFF,0xFF,0x07,0x00,0x70,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0xFE,0xFF,0xFF,0x1F,0x00,0xC0,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0xC0,0xFF,0xFF,0xFF,0x3F,0x00,0x40,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0xF8,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x81,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF1,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC3,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};
//画出指定的图像
void testDrawXBM1(u8g2_t *u8g2)
{
int t=3000;
u8g2_ClearBuffer(u8g2);
u8g2_DrawXBM(u8g2,0, 0, 128, 64, Yuki);
SEND_BUFFER_DISPLAY_MS(u8g2,t);
}
大概熟悉u8g2的库就容易上手了
(三)实现效果
与原图一致,实现了一个人在弹琴的画面
任务4_x264
五、关于本文章项目的源码仓库
https://gitee.com/qoiso/porting-u8g2-graphics-library.git