首先在github克隆项目源码到本地硬盘
复制该文件夹到工程的core目录 并改个名字,方便自己明天还能记得起来这是干毛用的文件夹,哈哈哈哈
这个文件夹里边有121个文件 包含了很多芯片的驱动,也就是名字中有_d_和芯片型号的文件
先不管这些 直接打开
u8g2_d_setup.c
搜索关键字,比如屏幕驱动用的SSD1306,那就定位到SSD1306
这些就是屏幕的初始化函数
看好了屏幕接口和分辨率选一个对的
比如我这里选个另类的 128*32吧,反正12864网上教程都写烂了
可以先用一个顺手的工具找到函数名并且折叠起来看
然后花了半天时间,终于找到 SSD1306 128*32的初始化函数了
遇到不懂的,本篇教程没有的东西,那就自己查一下,反正我又不知道你会啥你不会啥子
比如
winstar和univision
反正我只找到了winstar是华菱光电,univision没找到,估计是个外国厂家吧
反正现在也不知道屏啥情况,只知道能用,是好的,随便选一个
u8g2_Setup_ssd1306_i2c_128x32_winstar_f
在main.c中引入头文件
#include "u8g2.h"
声明结构体
u8g2_t u8g2;
把初始化函数贴到main。c的main函数
u8g2_Setup_ssd1306_128x32_winstar_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb)
然后再把参数修改一下 去掉声明
第一个参数&u8g2
第二个参数U8G2_R0
第三个参数u8x8_byte_4wire_hw_spi
第四个参数u8x8_gpio_and_delay_stm32HwspiSoftcs
第一个就是刚才声明的结构体
第二个是屏幕旋转角度,暂且选择不旋转,不合适一会再修改就好了
第三个需要自己编写的一个数据传输方式
第四个是GPIO和延时啥的,u8g2需要调用这个函数实现一些功能
弄完是这样的
然后把第三个参数的函数找地方写一下,比如这个位置,丢在main.c里边就行了,先跑通再说模块化问题
uint8_t u8x8_byte_4wire_hw_spi(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) { switch (msg) { case U8X8_MSG_BYTE_SEND: HAL_SPI_Transmit(&hspi1,(uint8_t *)arg_ptr,arg_int,20);//SPI break; case U8X8_MSG_BYTE_START_TRANSFER: u8x8_gpio_SetCS(u8x8, u8x8->display_info->chip_enable_level); u8x8->gpio_and_delay_cb(u8x8, U8X8_MSG_DELAY_NANO, u8x8->display_info->post_chip_enable_wait_ns, NULL); break; case U8X8_MSG_BYTE_END_TRANSFER: u8x8->gpio_and_delay_cb(u8x8, U8X8_MSG_DELAY_NANO, u8x8->display_info->pre_chip_disable_wait_ns, NULL); u8x8_gpio_SetCS(u8x8, u8x8->display_info->chip_disable_level); break; default: return 0; } return 1; }
然后
uint8_t u8x8_gpio_and_delay_stm32HwspiSoftcs(U8X8_UNUSED u8x8_t *u8x8, U8X8_UNUSED uint8_t msg, U8X8_UNUSED uint8_t arg_int, U8X8_UNUSED void *arg_ptr) { switch (msg) { case U8X8_MSG_GPIO_AND_DELAY_INIT: /*delay和GPIO的初始化,在main中已经初始化完成�?????????*/ break; case U8X8_MSG_DELAY_MILLI: //hal delay HAL_Delay(arg_int); break; //software cs case U8X8_MSG_GPIO_CS: HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, arg_int); break; case U8X8_MSG_GPIO_DC:
if (arg_int)
LCD_DC_H;//
else
LCD_DC_L;
break;
break; case U8X8_MSG_GPIO_RESET: break; } return 1; }
全文完