(五)STM32F407 cubemx IIC驱动OLED(3)软件篇

  这篇文章主要是个人的学习经验,想分享出来供大家提供思路,如果其中有不足之处请批评指正哈。
  废话不多说直接开始主题,本人是基于STM32F407VET6芯片,但是意在你看懂这篇文章后,不管是F1,F4,H7等一系列系统硬件IIC配置都能明白如何通过参考手册、数据手册去学习配置。而不是Ctrl c,Ctrl v。这篇文章是对OLED 软件配置方面的介绍,如何参考数据手册编写代码。
  废话不多说,直接开始根据上文的寄存器步骤指示编写代码。

一、CubeMX初始化工作

1)时钟配置
  在这里插入图片描述  本人时钟使用的都是外部晶振,时钟树配置见下图。
  在这里插入图片描述

2)下载器配置
在这里插入图片描述


3)IIC配置
在这里插入图片描述

4)项目地址
在这里插入图片描述5)



5)生成代码
在这里插入图片描述
以上就是工程的大致配置。

二、软件程序编写

1)按照数据手册指示,编写寄存器数据步骤,详见硬件篇
在这里插入图片描述寄存器数组构建

/**********************************************************
 * 初始化命令,根据芯片手册书写,详细步骤见上图以及注意事项
 ***********************************************************/
uint8_t CMD_Data[]={
0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40,0xA1, 0xC8, 0xDA,

0x12, 0x81, 0xCF, 0xD9, 0xF1, 0xDB, 0x40, 0xA4, 0xA6,0x8D, 0x14,

0xAF};

1.如果Co位设置为逻辑"0",则以下信息的传输将仅包含数据字节。
2.D/C#位决定下一个数据字节是作为命令还是数据。如果D/C#位设置为逻辑"0",则将以下数据字节定义为命令。如果D/C#位被设置为逻辑"1",则其将以下数据字节定义为将被存储在GDDRAM中的数据。GDDRAM列地址指针将在每次数据写入后自动增加1。

  总结:发送命令时地址为0x00,发送数据时地址为0x40而且其会递增,这也是书写代码的关键部分。
详细请参考硬件篇------3)I2C总线时钟信号(SCL)

2)构造IIC发送函数 IIC1,地址0x78,命令格式地址0x00,数据格式地址0x40

//为数组命令发送方式
void WriteCmd(void)
{
	uint8_t i = 0;
	for(i=0; i<23; i++)
	{
		HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x00,I2C_MEMADD_SIZE_8BIT,&CMD_Data[i],1,0x100);
	}
}
/**
 * @function: void OLED_WR_CMD(uint8_t cmd)
 * @description: 向设备写控制命令,单字节发送方式
 * @param {uint8_t} cmd 芯片手册规定的命令
 * @return {*}
 */
void OLED_WR_CMD(uint8_t cmd)
{
	HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x00,I2C_MEMADD_SIZE_8BIT,&cmd,1,0x100);
}

/**
 * @function: void OLED_WR_DATA(uint8_t data)
 * @description: 向设备写控制数据
 * @param {uint8_t} data 数据
 * @return {*}
 */
void OLED_WR_DATA(uint8_t data)
{
	HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x40,I2C_MEMADD_SIZE_8BIT,&data,1,0x100);
}

3)显示以及清空
1.设置页寻址模式的较高列起始地址(10 h ~1Fh)此命令指定页寻址模式下显示数据RAM的8位列起始地址的较高半字节。列地址将随着每次数据访问而递增。
2.设置页面寻址模式的页面起始地址(B 0 h ~ B7 h)此命令在页面寻址模式下将GDDRAM中的页面起始地址从0定位到7,不会递增。
在这段代码中,你就要明白寄存器地址0x00对应的是行,而且会不断递增,首先你要明白第一步需要设置页0xb0,然后设置列,从第零列开始0x00,它会自行递增所以只要配一个循环即可,通过写入0xff=1111,1111控制8个位都点亮。

void OLED_On(void)
{
	uint8_t i,n;
	for(i=0;i<8;i++)
	{
		OLED_WR_CMD(0xb0+i);    //设置页地址(0~7)
		OLED_WR_CMD(0x00);      //设置显示位置—列低地址
		OLED_WR_CMD(0x10);      //设置显示位置—列高地址
		for(n=0;n<128;n++)
		OLED_WR_DATA(0xff);
	}
}

在这里插入图片描述

/**
 * @function: OLED_Clear(void)
 * @description: 清屏
 * @return {*}
 */
void OLED_Clear(void)
{
	uint8_t i,n;
	for(i=0;i<8;i++)
	{
		OLED_WR_CMD(0xb0+i);    //设置页地址(0~7)
		OLED_WR_CMD(0x00);      //设置显示位置—列低地址
		//OLED_WR_CMD(0x10);      //设置显示位置—列高地址
		for(n=0;n<128;n++)
		OLED_WR_DATA(0x0);
	}
}

在这里插入图片描述

4)坐标显示代码
  坐标显示就得明白使用的是哪两个寄存器,一个是X坐标寄存器(列指标),一个是Y坐标寄存器(行坐标页)。(00h~1Fh)列坐标x、(B0-B7h)行坐标y。但是x坐标需要注意的是当想要点亮127列时,127=0x7f=0111,1111。0x7f这个数据需要拆分成高位数据以及低位数据。即命令行需要发送0x0f、0x17即可。基于此编写一种分别读取高位数据以及低位数据的算法并分别发送命令行。

OLED_Set_Pos(64,4);  //居中显示函数
/**
 * @function: void OLED_Set_Pos(uint8_t x, uint8_t y)
 * @description: 坐标设置
 * @param {uint8_t} x,y注意x是0-15,y是0-7
 * @return {*}
 */
void OLED_Set_Pos(uint8_t x, uint8_t y)
{
	OLED_WR_CMD(0xb0+y);	//设置页地址(0~7)
	OLED_WR_CMD(((x&0xf0)>>4)|0x10); //设置显示位置—列低地址
	OLED_WR_CMD(x&0x0f);	//设置显示位置—列高地址
	OLED_WR_DATA(0X18);  //00011000中间两个亮
}

在这里插入图片描述
5)显示图片
显示图片函数

/**
 * @function: void OLED_DrawBMP(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t *  BMP,uint8_t Color_Turn)
 * @description: 在OLED特定区域显示BMP图片
 * @param {uint8_t} x0图像开始显示横坐标  x0:0~127
 * @param {uint8_t} y0图像开始显示纵坐标  y0:0~7
 * @param {uint8_t} x1图像结束显示横坐标  x1:1~128
 * @param {uint8_t} y1图像结束显示纵坐标  y1:1~8
 * @param {uint8_t} *BMP待显示的图像数据
 * @param {uint8_t} Color_Turn是否反相显示(1反相、0不反相)
 * @return {*}
 */
void OLED_DrawBMP(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t *  BMP,uint8_t Color_Turn)
{
   uint32_t j = 0;
   uint8_t x = 0, y = 0;

  if(y1%8==0)
		y = y1/8;
  else
		y = y1/8 + 1;
	for(y=y0;y<y1;y++)
	{
		OLED_Set_Pos(x0,y);
    for(x=x0;x<x1;x++)
		{
			if (Color_Turn)
				OLED_WR_DATA(~BMP[j++]);//显示反相图片
			else
				OLED_WR_DATA(BMP[j++]);//显示图片

		}
	}
}

图片字符代码需要使用取模软件编写字符。

显示图片字模软件本人是用的视频中的网址链接此处加个引用符号:

led.baud-dance.com
点不开的话复制一下打开。
页面视图如下图所示
在这里插入图片描述导入图片后,自动生成的字符代码

unsigned char bearData[] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x5f, 0x9f, 0xdf, 0xef, 0xef, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0x17, 
0xd7, 0xe7, 0x07, 0x0f, 0x9f, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
0xff, 0xff, 0xff, 0x00, 0xfe, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf8, 0xe3, 
0x8f, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x07, 0xf3, 0xfd, 0xec, 0xe7, 0x91, 0x2f, 0x5d, 
0x7c, 0xfc, 0xdc, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7c, 0x01, 0x1f, 0xff, 0xff, 0xff, 0xff, 
0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x07, 0x03, 0x01, 0x00, 0x01, 0x03, 0x07, 0x07, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
0x14, 0x0e, 0x1f, 0x1f, 0x1f, 0x0f, 0x07, 0x03, 0x00, 0x00, 0x00, 0x80, 0xc1, 0xe1, 0xff, 0xff, 0xfe, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xf8, 0xf8, 
0xf8, 0xf8, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 
0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
};
//const Image bearImg = {64, 64, bearData};

图片显示如下。
在这里插入图片描述

  至此OLED的基本工作原理大致有所了解,如有不足之处请批评指正哈。整体项目代码以及数据手册放在以下链接中了。
链接:https://pan.baidu.com/s/1l9G2n4-04w95X_IeJ7DZgg?pwd=1p8q
提取码:1p8q

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

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

相关文章

搭建网站式个人网盘-超仿Windows界面

搭建网站式个人网盘-超仿Windows界面 效果图部分源码领取源码下期更新预报 效果图 一款网站式个人网盘源码-Windows界面相等于一个网站式电脑可以放照片&#xff0c;视频-支持在线播放&#xff08;你懂的&#xff09;我觉得式一款很不错的个人网盘提醒&#xff1a;千万不要升级…

Docker学习(带图详细)

一、安装docker 参考官方文档&#xff1a;https://docs.docker.com/engine/install/centos/ 查看系统版本 [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]# [rootlocalhost ~]# uname -a Linux localhost.localdomai…

图生视频,Stable Diffusion WebUI Forge内置SVD了!

在 Stable Diffusion WebUI Forge 版本中内置了一个SVD插件&#xff0c;也就是 Stable Video Diffusion&#xff08;稳定视频扩散&#xff09;&#xff0c;之前我介绍过这个工具的使用方法&#xff1a;图片生成视频&#xff08;独立部署SVD) 但是当时还不能集成到Stable Diffu…

【CSP CCF记录】202012-1 期末预测之安全指数

题目 代码 #include<bits/stdc.h> using namespace std; int main() {int n;cin>>n;int sum0;for(int i0;i<n;i){int score0,w0;cin>>score>>w;sumscore*w;}summax(sum,0);cout<<sum;return 0; } 结果

每个开发者都应该拥有的-云服务器!

每个开发者都应该拥有的-云服务器&#xff01; 第一台云服务器ECS言归正传云服务器妙用 每个开发者都该拥有一台云服务器 作为开发者&#xff0c;总是会时不时的跟服务器打交道&#xff0c;不管你是部署应用程序&#xff0c;还是在服务器上面搭建安装基础环境&#xff0c;比如J…

pdf 版面分析与优化策略

1. 简介 版面分析作为RAG的第一步工作&#xff0c;其效果对于下游工作至关重要。 前常见的 PDF 解析方法包括三种 基于规则&#xff1a;根据 PDF 的组织特征确定每个部分的规则&#xff08;风格和内容&#xff09;缺点&#xff1a;不通用&#xff08;PDF格式不固定&#xf…

学校能源消耗监测管理系统,打造智能监测系统

学校能源消耗监测管理系统是一款针对&#xff0c;水、电、煤、气、热等能源的在线监测、分析与处理的系统&#xff0c;为学校管理者提供全面的能源使用情况&#xff0c;为学校管理工作提供了有力的支持。 为什么要建设能源管理系统&#xff1f; 用能需求增加 随着学校的快速…

视频号小店能做吗?聊聊做视频号一年来的感受

大家好&#xff0c;我是电商笨笨熊 做电商这件事&#xff0c;我已经持续了6年多的时间&#xff1b; 面对众多项目&#xff0c;从最初的闲鱼到天猫&#xff0c;再到抖店和视频号小店&#xff1b; 这期间从传统电商到直播电商&#xff0c;也看到了很多玩家的纠结&#xff1b; …

深度学习技术之加宽前馈全连接神经网络

深度学习技术 加宽前馈全连接神经网络1. Functional API 搭建神经网络模型1.1 利用Functional API编写宽深神经网络模型进行手写数字识别1.1.1 导入需要的库1.1.2 加载虹膜&#xff08;Iris&#xff09;数据集1.1.3 分割训练集和测试集1.1.4 定义模型输入层1.1.5 添加隐藏层1.1…

Linux基础之进程-fork()函数的详解

目录 一、前言 二、fork()函数 2.1 fork()函数的基本概念 2.2 问题一的解答 2.3 问题二的解答 2.4 问题三的解答 2.5 问题四的解答 2.6 问题五的解答 一、前言 在上节内容中我们已经学会了使用我们的getpid()和我们的getppid()去查看我们进程的pid&#xff0c;并且学习到…

dockerFile制作镜像、并远程发布

1、FORM 用于指定基础镜像&#xff0c;也就是在指定的镜像上&#xff0c;增加上后续dockerFIle中设置的内容&#xff08;新的软件、新的服务等&#xff09; FROM openjdk:8-jre 在这个容器中&#xff0c;就能直接使用java命令。 2、ENV 用于设置环境变量&#xff0c;在后续的R…

Android Compose 一:基础控件

Flutter 与 Compose 组件辣么像&#xff0c;难道是同一个google团队整的&#xff1b;也未深究&#xff0c;只是猜测。 创建项目 需要使用新版本Android studio&#xff0c;忽略步骤… 项目目录 MainActivity说明 1 系统默认页面 Preview 修饰的方法&#xff0c;只用来供开发…

物联网实战--平台篇之(七)应用界面设计

目录 一、米家APP分析 二、应用展示 三、应用列表 四、新建应用 五、重命名应用 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.…

快速配置 Nginx 来实现 GPT 流式传输

目录 1. Nginx 参考配置2. Nginx 核心参数3. 其他参数 场景&#xff1a;代理 ChatGPT、代理各种 GPT 工具套壳等。 1. Nginx 参考配置 支持 GPT 流式访问的配置如下&#xff0c;请根据实际需求适当取舍即可&#xff1a; server {listen 80;server_name chat.test.com; # 绑…

PCIE协议-2-事务层规范-Message Request Rules-Vendor_Defined Messages

2.2.8.6 厂商定义消息 厂商定义消息允许扩展PCI Express消息功能&#xff0c;可以作为PCI Express规范的一般扩展&#xff0c;也可以是厂商特定的扩展。本节通用地定义了与这些消息相关的规则。 厂商定义消息&#xff08;见表2-25&#xff09;使用图2-28中显示的头标格式。re…

Nios实验使用串口输出“Hello Nios-II”字符到笔记本电脑

目录 实验过程 创建工程 修改程序 编译工程 运行项目 效果实现 总结 参考 实验过程 硬件设计见博主上篇博客 软件部分设计 下面使用 Nios II Software Build Tools for Eclipse 来完成当前项目的软件开发。 启动 Nios II SBT 按照下图所示点击 Nios II Software Build…

计算机网络复习-传输层

概念 传输层是进程与进程之间的通信使用端口(Port)来标记不同的网络进程端口(Port)使用16比特位表示(0~65535) UDP协议详解 UDP&#xff1a;用户数据报协议数据报&#xff1a;应用层传输过来的一个完整的数据不合并&#xff0c;不拆分 UDP的头部 UDP特点 UDP是无连接协…

【R语言篇】医学生福音,全球疾病负担数据库GBD 2021即将更新!!!

今天介绍即将于5月16日更新的全球疾病负担数据库GBD 2021&#xff0c;相信数据一经发表&#xff0c;过不了多久pubmed又将涌现一大波疾病负担相关文章。 Global Burden of Disease Study 2021 (GBD 2021) Data Resources | GHDx 在查找GBD相关文献方面&#xff0c;我个人还是比…

PS的文字点阵 文字边缘虚 为什么在Ps中打出来的字是带有锯齿状模糊的?

此方法主要针对低像素文字 关键部分 (4 封私信 / 80 条消息) 为什么在Ps中打出来的字是带有锯齿状模糊的&#xff1f; - 知乎 (zhihu.com)https://www.zhihu.com/question/54412515