本帖最后由 qjp1988113 于 2020-11-30 16:02 编辑
说起咱单片机用的gui,目前还是比较多的了。有面向小型的ZLGgui,u8glib,ugui等,面向中大型的UCGUI,emwin,TOUCHGFX,littlevGL,ThreadX GUI等。
今天我们移植的叫u8glib,现在已经有升级版本u8g2了。u8glib是一个优秀的比较实用于绘制单色屏的gui的库。它是一个用来处理用户显示接口的中间层。
例如,绘制线条/文本/其他元素——这个库都能做。玩ardunio的应该会更熟悉一点,因为它大量运用在ardunio上。我们今天就来把它移植到我们的GD32V103上面,
来驱动IIC接口的OLED。这样就离移植ardunio的游戏就更近一步了。
我们下载好u8glib
u8glib.rar
(213.95 KB)
,将其复制到我们的工程目录下。这里我们要新建适用于我们当前平台的头文件及C文件:
u8_risc.h
#ifndef _U8G_RISC_H
#define _U8G_RISC_H
#include "u8g.h"
//定义缓存大小
#define DATA_BUFFER_SIZE 1000
//定义真正的OLED回调函数
uint8_t u8g_com_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr);
#endif
u8_risc.c
#include "u8g_risc.h"
#include "debug.h"
#include "oled.h"//要用到之前OLED的底层,所以包含
uint8_t buffer[DATA_BUFFER_SIZE];
static uint8_t control = 0;
void u8g_Delay(uint16_t val)
{
Delay_Us(val);
}
void u8g_MicroDelay(void)
{
int i;
for (i = 0; i < 1000; i++);
}
void u8g_10MicroDelay(void)
{
int i;
for (i = 0; i < 10000; i++);
}
uint8_t u8g_com_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
{
//uint8_t *ptr ;
switch(msg)
{
case U8G_COM_MSG_STOP:
break;
case U8G_COM_MSG_INIT:
OLED_Init();
u8g_MicroDelay();
break;
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
u8g_10MicroDelay();
if (arg_val == 0)
{
control = 0;
}
else
{
control = 0x40;
}
u8g_10MicroDelay();
break;
case U8G_COM_MSG_RESET:
//没有RESET
//pin 9 is my reset pin
//GPIO_WriteBit(GPIOB, GPIO_Pin_9, arg_val);
u8g_10MicroDelay();
break;
case U8G_COM_MSG_WRITE_BYTE:
{
OLED_WR_Byte(arg_val,control);//OLED单写
}
break;
case U8G_COM_MSG_WRITE_SEQ:
case U8G_COM_MSG_WRITE_SEQ_P:
{
OLED_WR_BUFF(arg_ptr,arg_val,control);//OLED多写
}
break;
}
return 1;
}
添加进工程,在main函数里面调用:
static u8g_t u8g;
void draw(void)
{
u8g_SetFont(&u8g,u8g_font_profont10);//set current font
u8g_DrawStr(&u8g, 2, 12, "Hello world!");//write string - you set coordinates and string
u8g_SetFont(&u8g,u8g_font_profont10r);//set current font
u8g_DrawStr(&u8g, 2, 24, "I LOVE 21IC!");//write string - you set coordinates and string
u8g_DrawBox(&u8g, 10, 30, 25, 25);//draw some box
u8g_DrawCircle(&u8g, 45+30, 45, 15, U8G_DRAW_ALL);
u8g_DrawRFrame(&u8g,0,0,127,63,4);
}
int main(void)
{
...
OLED_Init();
OLED_ColorTurn(0);//0正常显示,1 反色显示
OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
...
//U8GLIB
u8g_InitComFn(&u8g, &u8g_dev_ssd1306_128x64_i2c, u8g_com_hw_i2c_fn);//红色标志的为之前写的回调函数
...
while(1)
u8g_FirstPage(&u8g);
do
{
draw();
} while ( u8g_NextPage(&u8g) );
u8g_Delay(100);
}
}
编译下载,查看屏幕输出:
移植好U8glib,离移植游戏又进了一步。
|