stm32f103c8t6移植U8g2

U8g2代码下载:

https://github.com/olikraus/u8g2

1,准备一个正常运行的KEIL5 MDK模板
2,下载u8g2的源码和 u8g2的STM32实例模板
源码: https://github.com/olikraus/u8g2
STM32实例模板: https://github.com/nikola-v/u8g2_template_stm32f103c8t6

3,去掉无用的驱动文件,只保留u8x8_d_ssd1306_128x64_noname.c 
4,精简u8g2_d_setup.c,只保留u8g2_Setup_ssd1306_i2c_128x64_noname_f()

5,精简u8g2_d_memory.c,只保留u8g2_m_16_8_f()
6,对工程进行设置并剔除编译错误
7,更改u8x8_gpio_and_delay() 

 1.在csrc文件中,保留驱动文件u8x8_d_ssd1306_128*64_noname_f

2.将这些文件,放到keil中

在main.c中包含头文件:

#include "u8g2.h" 

并包含路径

3.移植好OLED的驱动

4.精简u8g2_d_setup.c,只保留u8g2_Setup_ssd1306_i2c_128x64_noname_f()

5.精简u8g2_d_memory.c,只保留u8g2_m_16_8_f()

6,对工程进行设置并剔除编译错误
7,更改u8x8_gpio_and_delay()

uint8_t gpio_and_delay_stm32(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
	switch(msg)
		{
			case U8X8_MSG_DELAY_MILLI://Function which implements a delay, arg_int contains the amount of ms
				Delayxms(arg_int);
			break;
		
			case U8X8_MSG_DELAY_10MICRO://Function which delays 10us
				Delayxus(10);
			break;
		
			case U8X8_MSG_DELAY_100NANO://Function which delays 100ns
				__NOP();
			break;
			case U8X8_MSG_GPIO_I2C_CLOCK:
				if (arg_int) GPIO_WriteBit(GPIOB, GPIO_Pin_8,Bit_SET );
				else GPIO_WriteBit(GPIOB, GPIO_Pin_8,Bit_RESET );
			break;
			case U8X8_MSG_GPIO_I2C_DATA:
				if (arg_int) GPIO_WriteBit(GPIOB, GPIO_Pin_9, Bit_SET);
				else GPIO_WriteBit(GPIOB, GPIO_Pin_9, Bit_RESET);
			break;
			default:
				return 0; //A message was received which is not implemented, return 0 to indicate an error
	}
	return 1; // command processed successfully.
}

8.main.c的代码

#include "stm32f10x.h"                  // Device header
#include "led.h"
#include "u8g2.h"
#include "OLED.h"
#include "Delay.h"

u8g2_t u8g2;
static const unsigned char u8g_logo_bits[] U8X8_PROGMEM =
{
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xF0,0x01,0x00,0x00,0xF8,0x01,0x00,0x00,0xFC,0x01,0x00,0x00,0xFE,0x01,0x00,
	0x30,0xFE,0xFF,0x01,0x3C,0xFE,0xFF,0x01,0x3C,0xFE,0xFF,0x01,0x3C,0xFE,0xFF,0x01,0x3C,0xFE,0xFF,0x01,0x3C,0xFE,0xFF,0x01,0x3C,0xFE,0xFF,0x01,0x3C,0xFE,0xFF,0x01,
	0x3C,0xFE,0xFF,0x00,0x3C,0xFE,0xFF,0x00,0x3C,0xFE,0xFF,0x00,0x3C,0xFE,0x7F,0x00,0x3C,0xFE,0x7F,0x00,0x3C,0xFE,0x7F,0x00,0x3C,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,/*G:\正在开工\U8g2相关资料20230324\相关资料\点赞.bmp*/0
};



uint8_t gpio_and_delay_stm32(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);
void u8g2_init(void);
void draw(u8g2_t *u8g2);

int main(void)
{
    OLED_Init();
    u8g2_init();
    
    Delayxms(1000);
	u8g2_DrawLine(&u8g2, 0,0, 127, 63);//测试:起点:横坐标,纵坐标;终点:横坐标,纵坐标
	u8g2_DrawLine(&u8g2, 127,0, 0, 63);
	u8g2_SendBuffer(&u8g2);
	Delayxms(1000);
	u8g2_ClearBuffer(&u8g2);
    draw(&u8g2);//官方测试函数,显示U8g2的logo
    Delayxms(1000);
	u8g2_ClearBuffer(&u8g2);
    u8g2_DrawXBMP(&u8g2, 30, 20, 25, 25, u8g_logo_bits);//显示点赞图案
    u8g2_SendBuffer(&u8g2);

    while(1)
	{
		

	}
}


uint8_t gpio_and_delay_stm32(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
	switch(msg)
		{
			case U8X8_MSG_DELAY_MILLI://Function which implements a delay, arg_int contains the amount of ms
				Delayxms(arg_int);
			break;
		
			case U8X8_MSG_DELAY_10MICRO://Function which delays 10us
				Delayxus(10);
			break;
		
			case U8X8_MSG_DELAY_100NANO://Function which delays 100ns
				__NOP();
			break;
			case U8X8_MSG_GPIO_I2C_CLOCK:
				if (arg_int) GPIO_WriteBit(GPIOB, GPIO_Pin_8,Bit_SET );
				else GPIO_WriteBit(GPIOB, GPIO_Pin_8,Bit_RESET );
			break;
			case U8X8_MSG_GPIO_I2C_DATA:
				if (arg_int) GPIO_WriteBit(GPIOB, GPIO_Pin_9, Bit_SET);
				else GPIO_WriteBit(GPIOB, GPIO_Pin_9, Bit_RESET);
			break;
			default:
				return 0; //A message was received which is not implemented, return 0 to indicate an error
	}
	return 1; // command processed successfully.
}
void u8g2_init(void)
{
    u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_sw_i2c,  gpio_and_delay_stm32);
    u8g2_InitDisplay(&u8g2); 
	u8g2_SetPowerSave(&u8g2, 0); 
	u8g2_ClearBuffer(&u8g2);
}

void draw(u8g2_t *u8g2)
{
	u8g2_ClearBuffer(u8g2); 
    u8g2_SetFontMode(u8g2, 1); 
    u8g2_SetFontDirection(u8g2, 0); 
    u8g2_SetFont(u8g2, u8g2_font_inb24_mf);
    u8g2_DrawStr(u8g2, 0, 20, "U");
    
    u8g2_SetFontDirection(u8g2, 1);
    u8g2_SetFont(u8g2, u8g2_font_inb30_mn);
    u8g2_DrawStr(u8g2, 21,8,"8");
        
    u8g2_SetFontDirection(u8g2, 0);
    u8g2_SetFont(u8g2, u8g2_font_inb24_mf);
    u8g2_DrawStr(u8g2, 51,30,"g");
    u8g2_DrawStr(u8g2, 67,30,"\xb2");
    
    u8g2_DrawHLine(u8g2, 2, 35, 47);
    u8g2_DrawHLine(u8g2, 3, 36, 47);
    u8g2_DrawVLine(u8g2, 45, 32, 12);
    u8g2_DrawVLine(u8g2, 46, 33, 12);
  
    u8g2_SetFont(u8g2, u8g2_font_4x6_tr);
    u8g2_DrawStr(u8g2, 1,54,"github.com/olikraus/u8g2");
//	u8g2_ClearDisplay(u8g2);
	u8g2_SendBuffer(u8g2);
	Delayxms(1000);
}

移植的代码链接:

链接:https://pan.baidu.com/s/1TfzhoXhK8OaRLax6CmnC6Q?pwd=tikd 
提取码:tikd 
--来自百度网盘超级会员V6的分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/32668.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PHP 基础知识

目录 PHP基础 2 PHP代码标记 2 PHP注释 2 PHP语句分隔符 2 PHP变量 3 常量 3 数据类型 4 流程控制 6 文件 7 函数 9 闭包 11 常用系统函数 12 错误处理 13 错误显示设置 15 字符串类型 17 字符串相关函数 19 数组 21 遍历数组 22 数组的相关函数 25 PHP基础 PHP是一种运行在服务…

【Kubernetes资源篇】StatefulSet无状态服务管理入门实战详解

文章目录 一、StatefulSet理论知识1、StatefulSet Pod控制器特性2、什么是有状态服务和无状态服务?3、Deployment和StatefulSet区别 二、案例:StatefulSet资源实战演示1、创建WEB站点并验证StatefulSet特点2、StatefulSet滚动更新 三、总结 一、Stateful…

PSD笔记

在实际应用中,一个信号我们不可能获得无穷长时间段内的点,对于数字信号,只能通过采样的方式获得N个离散的点。上文提到,实际信号基本上是随机信号,由于不可能对所有点进行考察,我们也就不可能获得其精确的功…

Modbus协议学习方法

在刚开始接触modbus协议的时候,很容易被里面的各种功能码搞晕,同时在编写程序的时候也容易搞不清楚每一位数据代表的含义。如果在学习的过程中有实际的发送和接收数据的例子话,那么理解modbus协议就会更容易一些。   下面我将自己借助软件学…

如何用低代码开发平台快速实现单据打印功能?

每家企业在日常工作中,业务流转时,都经常需要在线打印各种纸质文件,如凭证、采购单、出入库单据、销售合同等,不同企业都有个性化的排版要求,每一次需要在固定文档模板的基础上重新填充业务数据,过程中难免…

目前有哪些比较好用的工单系统?如何选择合适的工单管理系统?

目前有哪些比较好用的工单系统??推荐一个性价比高的“工单管理系统”?好用免费的工单管理软件系统有哪些? 作为一个工程项目管理人员,是离不开工单系统的。每当遇到工程量大的时期要去管理很多杂乱无章的工单可太难了…

搭建selenoid环境

1、拉取浏览器镜像 docker pull selenoid/vnc:chrome_103.02、拉取selenoid-ui容器镜像 docker pull aerokube/selenoid-ui:1.10.43、拉取selenoid容器镜像 docker pull aerokube/selenoid4、编写配置文件 vi /selenoid/config/browsers.json volumes可以做容器路径映射&…

TP composer 新创建一个vendor2,作为新库下载目录

站点目录新建一个vendor2文件夹: 在里面新建一个 composer.json 文件:(只写一个花括号就行) {} 然后这个vendor2目录里,使用宝塔终端执行: composer require zoujingli/ip2region 这样,vendor2目录里就会再多出 v…

java 设计模式--创建者模式

参考:Java常见设计模式总结 概念 概念理解一:将复杂对象的创建过程分解在不同的方法中,不同的创建过程组装成不同对象。对象的创建与产品本身分离开,使得对象的创建过程更加清晰。例如:旅游套餐售卖场景。 一个套餐大…

flutter Android 自定义输出路径 apk名称

默认 Flutter flutter build apk, 是默认的名字 默认的路径,直接修改输出路径 会造成 打包可以,直接运行 会提示找不到 apk 文件; 这里的解决思路是:打包完成后 拷贝目标路径的 APK 到自定义的路径,这样既可以正常打…

Windows软件架构概念

我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来聊聊Windows软件架构的概念。 Shaw和Garlan在他们划时代的著作中以如下方式讨论了软件的体系结构:从第一个程序被划分成模块开始,软件系统就有了体系结构。现在&#xff0c…

分布式系统消息通信技术:MOM与RPC

一、中间件 什么是中间件 中间件(Middleware)是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。人们在使用中间件时,往往是一组中间件集成在一起,构成一个平台(包括开发平台…

剑指 Offer 55 - I. 二叉树的深度 / LeetCode 104. 二叉树的最大深度(二叉树后序遍历,回溯传递值)

题目: 链接:剑指 Offer 55 - I. 二叉树的深度;LeetCode 104. 二叉树的最大深度 难度:简单 输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条…

【框架源码】Spring源码解析之BeanDefinition加载流程解析

观看本文之前,我们先思考一个问题,Spring是如何描述Bean对象的? Spring是根据BeanDefinition来创建Bean对象,BeanDefinition就是Spring中表示Bean定义。BeanDefinition用来存储Bean的相关信息,主要包括:Be…

智能文档图像处理技术应用与实践

写在前面智能文档处理面临的技术难题智能文档处理的研究领域● 文档图像分析与预处理● 手写板反光擦除● 版面分析与文档还原 写在最后 写在前面 VALSE 2023 无锡视觉与学习青年学者研讨会近期在无锡国际博览中心举办,由江南大学和无锡新吴区联合承办。本次会议旨…

企业级ChatGPT开发的三大核心内幕及案例实战(三)

企业级ChatGPT开发的三大核心内幕及案例实战(三) 2.3 Notion 问答对话AI案例演示及源码分析 Gavin老师:NLP_Matrix_Space 如图2-2所示,我们先看一下Notion 问答对话AI案例的效果。你问一个问题,它会进行回答,然后它会告诉你,信息来源在什么地方,要看具体的信息,可以…

生产者与消费者问题

本篇文章我们使用C探讨一下生产者与消费者问题. 1. 多线程的引入 我们学习了操作系统, 知道了进程和线程的概念, 但是如果不进行代码实战的话, 会很难理解它们. 特别是编程的初学者(比如我), 在了解了进程和线程后通常会感到疑惑: 多线程怎么用? 为啥我平时写代码没有使用到…

TCP协议的相关特性

目录 TCP特点概要 TCP协议段格式 TCP原理 确认应答 超时重传 连接管理(三次握手,四次挥手) 三次握手 四次挥手 流水线传输 滑动窗口 滑动窗口ACK丢失 滑动窗口数据报丢失 流量控制 拥塞控制 延迟应答 停止等待协议 回退N帧协议 面向字节流 缓冲区 粘包问题 TCP异常 &…

Nginx Rewrite的应用

目录 一、Nginx Rewrite 二、Rewrite的功能 1.Rewrite 跳转场景 2.Rewrite 跳转实现 3.Rewrite 实际场景 4.Rewrite 正则表达式 5.Rewrite 命令/语法格式 6.location 分类 7.location 优先级 8.Rewrite和location比较 9.根据以上了解,小案例来操…

python实现Canny算子边缘检测算法

边缘检测是一种将图片中关键信息表现出来的一种图片技术,它的结果并不是字面意思上的获取图片边缘,而是将图片有用的信息勾勒出来,类似素描的结果,但是已经去掉了很多信息。如下所示,一张原始的图片是这样的&#xff1…