一、硬件准备

使用的主控是:立创梁山派GD32F450ZGT6

使用的OLED是:0.96寸4针IIC通信的OLED屏

二、u8g2介绍

U8g2 是一个用于嵌入式设备的单色图形库。U8g2支持单色OLED和LCD,并支持如SSD1306等多种类型的OLED驱动,显示丝滑。

三、精简u8g2

首先去下载u8g2的源码

U8g2源码的开源库地址:https://github.com/olikraus/u8g2

(因为是外网,所以会有一点慢)

源码下载下来之后,我们只需要关注文件夹里面的【csrc】文件夹下的文件。

因为u8g2支持很多的驱动芯片,所以整个文件对我们的工程来说非常大。我们只需要我们屏幕的驱动文件,其他无用的文件可以删除。

3.1删除其他不需要的驱动文件

这些驱动文件通常是u8x8_d_xxx.c,xxx包括驱动的型号和屏幕分辨率。我们使用的是ssd1306驱动芯片的OLED,分辨率是128*64。在u8g2里使用的是u8x8_ssd1306_128x64_noname.c这个文件,其它的屏幕驱动和分辨率的文件可以删掉。(我这里已经把其他的驱动文件删除,只剩下需要的)

3.2 删除其他的驱动入口函数

在u8g2_d_setup.c里,因为我们的OLED是IIC的接口,所以只留一个我们要用到的【u8g2_Setup_ssd1306_i2c_128x64_noname_f】函数就好,其他的可以删除或者注释

在函数结尾加上

/* 注意要加上这一句 不然无法显示*/

u8g2_SetupBuffer(u8g2, buf, tile_buf_height, u8g2_ll_hvline_vertical_top_lsb, rotation);

(如果你嫌弃删除麻烦,可以直接复制下面的代码)

/*该文件属于 u8g2_d_setup.c */
#include "u8g2.h"/** 给IIC接口的OLED用的* 函数最后的数字或字母,代表显示时的buf大小:1:128字节2:256字节f:1024字节
*/
void u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb)
{uint8_t tile_buf_height;uint8_t *buf;u8g2_SetupDisplay(u8g2, u8x8_d_ssd1306_128x64_noname, u8x8_cad_ssd13xx_fast_i2c, byte_cb, gpio_and_delay_cb);buf = u8g2_m_16_8_f(&tile_buf_height);
/* 注意要加上这一句 不然无法显示*/u8g2_SetupBuffer(u8g2, buf, tile_buf_height, u8g2_ll_hvline_vertical_top_lsb, rotation);
}

3.3删除内存文件中的其他函数

由于用到的u8g2_Setup_ssd1306_i2c_128x64_noname_f函数中,只调用了u8g2_m_16_8_f这个函数,这个函数在【u8g2_d_memory.c】里面,留下这个函数,其它的函数一定要删掉或注释掉,否则编译时很可能会提示内存不足。

#include "u8g2.h"
/*该文件属于 u8g2_d_memory.c */uint8_t *u8g2_m_16_8_f(uint8_t *page_cnt)
{#ifdef U8G2_USE_DYNAMIC_ALLOC*page_cnt = 8;return 0;#elsestatic uint8_t buf[1024];*page_cnt = 8;return buf;#endif
}
//记得给新行,不然有警告

3.4 IIC初始化及回调函数编写

我们的屏幕是需要IIC进行通信的,这里选择使用的是软件IIC。因为u8g2里自带了软件IIC代码,我们只需要提供用的是哪一个引脚,还有提供IIC需要的延时函数即可。

/*该代码位于oled.c 和 oled.h */
//需要修改的引脚时钟
#define     RCU_SCL                     RCU_GPIOF
#define     RCU_SDA                     RCU_GPIOC//需要修改的引脚  SCL SDA
#define     GPIO_periph_SCL      GPIOF
#define     GPIO_pin_SCL          GPIO_PIN_8            #define      GPIO_periph_SDA      GPIOC
#define      GPIO_pin_SDA          GPIO_PIN_3            void IIC_software_init(void)
{rcu_periph_clock_enable(RCU_SCL);rcu_periph_clock_enable(RCU_SDA);//SCLgpio_mode_set(GPIO_periph_SCL, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_pin_SCL);gpio_output_options_set(GPIO_periph_SCL, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_pin_SCL);//SDAgpio_mode_set(GPIO_periph_SDA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_pin_SDA);gpio_output_options_set(GPIO_periph_SDA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_pin_SDA);    gpio_bit_write(GPIO_periph_SCL, GPIO_pin_SCL, SET);gpio_bit_write(GPIO_periph_SDA, GPIO_pin_SDA, SET);
}

回调函数的主要功能有

1、赋予U8g2相应的延时函数,比如下面的delay_ms和delay_us

2、为U8g2提供IIC接口的高低电平调用:

U8X8_MSG_GPIO_I2C_CLOCK:IIC的SCL

U8X8_MSG_GPIO_I2C_DATA:IIC的SDA

回调函数:

/*
u8x8回调函数
/*该代码属于 u8g2_d_setup.c */
*/
uint8_t u8x8_gpio_and_delay_gd32f450(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{switch(msg){case U8X8_MSG_GPIO_AND_DELAY_INIT:    // called once during init phase of u8g2/u8x8IIC_software_init();break;                                                        // can be used to setup pinscase U8X8_MSG_DELAY_MILLI:                    // delay arg_int * 1 milli seconddelay_1ms(1);break;case U8X8_MSG_DELAY_I2C:       // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHzif(arg_int == 1)delay_us(5);else if(arg_int == 4){;}break;                  // arg_int=1: delay by 5us, arg_int = 4: delay by 1.25uscase U8X8_MSG_GPIO_RESET:     // Reset pin: Output level in arg_intbreak;case U8X8_MSG_GPIO_I2C_CLOCK:    // arg_int=0: Output low at I2C clock pin//SCL输出gpio_bit_write(GPIO_periph_SCL, GPIO_pin_SCL, (bit_status)arg_int);break;     // arg_int=1: Input dir with pullup high for I2C clock pincase U8X8_MSG_GPIO_I2C_DATA:  // arg_int=0: Output low at I2C data pin//SDA输出gpio_bit_write(GPIO_periph_SDA, GPIO_pin_SDA, (bit_status)arg_int);break;         // arg_int=1: Input dir with pullup high for I2C data pin
//下面是按键设置
//    case U8X8_MSG_GPIO_MENU_SELECT:
//      u8x8_SetGPIOResult(u8x8, /* get menu select pin state */ key_state_get(BSP_KEY1_PIN));
//            //printf("u8g2 get key sel\r\n");
//      break;
//    case U8X8_MSG_GPIO_MENU_NEXT:
//      u8x8_SetGPIOResult(u8x8, /* get menu next pin state */ key_state_get(BSP_KEY2_PIN));
//            //printf("u8g2 get key next\r\n");
//      break;
//    case U8X8_MSG_GPIO_MENU_PREV:
//      u8x8_SetGPIOResult(u8x8, /* get menu prev pin state */ key_state_get(BSP_KEY3_PIN));
//            //printf("u8g2 get key prev\r\n");
//      break;
//    case U8X8_MSG_GPIO_MENU_HOME:
//      u8x8_SetGPIOResult(u8x8, /* get menu home pin state */ key_state_get(BSP_KEY4_PIN));
//            //printf("u8g2 get key home\r\n");break;default:u8x8_SetGPIOResult(u8x8, 1);            // default return valuebreak;}return 1;
}

四、显示测试

将改好的文件复制到过程文件夹里。(我放在工程目录APP里的u8g2文件夹下)

打开工程导入u8g2的.c文件(创建一个新目录)

导入完成的样子

main.c

#include "gd32f4xx.h"
#include "systick.h"
#include "led.h"
#include "oled.h"
#include "u8g2.h"
#include "stdio.h"//请在魔法棒处,勾选 Use MicroLIBu8g2_t u8g2;void u8g2Init(u8g2_t *u8g2)
{// 初始化 u8g2 结构体u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8x8_gpio_and_delay_gd32f450); u8g2_InitDisplay(u8g2);         //根据所选的芯片进行初始化工作,初始化完成后,显示器处于关闭状态u8g2_SetPowerSave(u8g2, 0);    //打开显示器u8g2_SetFont(u8g2, u8g2_font_unifont_t_chinese2); //设置字体u8g2_SetFontDirection(u8g2, 0);                   //字体方向向右
} int main(void)
{char temp[20], i = 0, j = 0, k = 0;nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3);  // 中断分组3systick_config();                                  //系统滴答定时器   定时1us    LED_Init();             //LED初始化IIC_software_init();    //IIC的GPIO初始化u8g2Init(&u8g2);        //u8g2初始化while(1){u8g2_ClearBuffer((u8g2_t*)&u8g2);//先清除缓冲区数据u8g2_DrawRFrame(&u8g2, 5, 10, 128-(12*1),40, 5);//显示圆角空心矩形sprintf(temp,"i = %d",i++);u8g2_DrawStr(&u8g2,6,29,temp);               //显示字符串sprintf(temp,"j = %d",j+=2);u8g2_DrawStr(&u8g2,62,29,temp);              //显示字符串sprintf(temp,"k = %d",k+=3);u8g2_DrawStr(&u8g2,38,43,temp);              //显示字符串u8g2_SendBuffer((u8g2_t*)&u8g2);//发送缓冲区数据到屏幕delay_1ms(50);  }
}

如果编译后发现有几百个的错误,像下面。

那么需要开启优化,最少开1级。

开启后重新编译即可。

实际效果:

实测效果视频展示

代码链接:

链接:https://pan.baidu.com/s/1DU0uHcqeBtcHSRBLjOJLxQ?pwd=1234

提取码:1234

立创梁山派GD32F450ZGT6--0.96IIC屏移植u8g2相关推荐

  1. 立创梁山派GD32F450ZGT6--屏幕扩展板LVGL应用

    该文章工程是基于裸机情况下运行的LVGL,通过GUI-Guider-1.4.0进行页面布局配置. 一.介绍 GUI Guider是恩智浦为LVGL开发了一个上位机GUI设计工具,可以通过拖放控件的方式 ...

  2. 立创梁山派GD32F450ZGT6--通过PCA9685控制16路舵机

    PCA9685芯片,每一路LED输出端均可自由调节PWM波的频率 (40~1000Hz) 和占空比 (0%~100%) .这款芯片主要通过输出不同占空比的PWM脉冲信号来控制舵机转动的角度.是16通道 ...

  3. 立创梁山派学习笔记——GPIO输出控制

    梁山派 前言 开发板简介 GD32F407ZGT6官方资源 数据手册 1.系统框图 2. 引脚复用表 3.命名规则 4.其他 用户手册 固件库与PACK包 开发环境搭建 立创官方的资料包 资料齐活,开 ...

  4. 立创梁山派GD32F450ZGT6--使用DMA实现多通道ADC采集

    这次调试有些久,缺乏的知识很多,最重要的是ADC的引脚配置为浮空之后,如果没有接入东西,其读取的ADC值是不确定的,所以在测试的时候,一定要把对应的电压接入ADC引脚,测量的值才是准确的. 上代码. ...

  5. 【立创开发板】梁山派初体验

    昨天到的板子,一开始也下不进,现在烧录正常了[破涕为笑]串口isp要先按住boot0再短按Reset后松开boot0,daplink没识别到装了新版keil后解决了 1 开发板简介 立创·梁山派开发板 ...

  6. 【STM32H7】第19章 ThreadX GUIX的OLED单色屏移植

    最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429 第19章       ThreadX GUIX的OLED单色屏移植 ...

  7. Android 4.0 截屏(Screenshot)代码流程小结

    Android 4.0 截屏 在Android 4.0 之前,Android手机上如果要使用截屏功能,只能通过Root手机,且使用第3方截图软件来实现截屏功能. Android4.0中,系统自带了截屏 ...

  8. as3.0全屏代码…

    as3.0全屏代码- 代码如下 var isFull:Boolean=false btn.addEventListener(MouseEvent.CLICK,onClick) function onC ...

  9. 三星android6.0推送,三星推送Android6.0 满屏小清新的风味!

    原标题:三星推送Android6.0 满屏小清新的风味! 最新消息,三星已经开始陆续为韩版S6\S6 Edge用户推送Android6.0"棉花糖"更新,可能再过一段时间会陆续扩展 ...

最新文章

  1. SVM讲的成体系的,自圆其说较好的一篇,上午没读完,KKT第二部分不等式有疑问没弄懂,复制后继续读完
  2. linux shell 查看 cpu核数
  3. Harbor仓库的管理
  4. Android编译小结(新建android项目)
  5. 集成 jpush-react-native 常见问题汇总 ( iOS 篇)
  6. canopen服务器协议,ZOPC_Server(ZLG通用OPC服务器)CANopen协议插件
  7. 新补丁更新(RU和RUR),新的版本(Release 18和19)
  8. linux shell删除所有文件夹下指定扩展名(关键字)的所有文件
  9. 玩转 SpringBoot 2 之整合 JWT 下篇
  10. js对象深拷贝的简单实现
  11. Vue项目实战——实现GitHub搜索案例(学以致用,两小时带你巩固和强化Vue知识点)
  12. [论文写作-词汇] 这么多特别,该用哪个?special especial specific particular peculiar exceptional extraordinary
  13. 计算机 word 节是什么,Word的分节符是什么
  14. css3里面的放大镜特效,用纯css3实现的图片放大镜特效效果非常不错
  15. mysql utc_MySQL的时区是否应该设置为UTC?
  16. 从爆款单品到全屋智能 Aqara如何引领行业变革
  17. EXCEL中日期的加减函数
  18. qbittorrent 等待_qBittorrent下载BT电影教程
  19. 点云公开数据集:S3DIS
  20. 使用 FFmpeg 开发播放器基础--使用 ffmpeg 解码视频文件

热门文章

  1. 定时器的使用(学习计时器软件开发…
  2. Hibernate多表查询实践总结
  3. 图像形态学:开运算和闭运算
  4. 200-Smart学习笔记:置位和复位编程案例
  5. linux rdac管理,Linux® RDAC Multipath Drivers
  6. 苹果cmsv10首涂第十一套会员中心功能增强版独立手机模板
  7. LINUX 不删除指定文件其余文件全部删除
  8. UCanCode发布升级E-Form++可视化源码组件库2015全新版 (V23.01)!
  9. CentOS Linux 8 - AppStream 错误
  10. 吃鸡ios和android灵敏度,和平精英抖音燃茶灵敏度分享