STM32利用库函数驱动OLED
使用的1.3寸OLED是I2C接口的对外有四个引脚,分别是VCC、GND、SCL、SDL。
首先看一下运行的效果图:
成功在小屏幕上显示“你好”。
首先,我们需要配置好STM32的I2C外设,和GPIO的模式。
PB6—>SCL
PB7—>SDA
GPIO口配置为开漏输出模式。
void GPIO_Config()
{GPIO_InitTypeDef GPIO_STRUCT;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_STRUCT.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_STRUCT.GPIO_Mode = GPIO_Mode_AF_OD;GPIO_STRUCT.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_STRUCT);
}void IIC_Config()
{I2C_InitTypeDef I2C_STRUCT;RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);I2C_DeInit(I2C1);I2C_STRUCT.I2C_Mode = I2C_Mode_I2C;I2C_STRUCT.I2C_DutyCycle = I2C_DutyCycle_2;I2C_STRUCT.I2C_OwnAddress1 = 0x90;I2C_STRUCT.I2C_Ack = I2C_Ack_Enable;I2C_STRUCT.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;I2C_STRUCT.I2C_ClockSpeed =400000 ;I2C_Init(I2C1,&I2C_STRUCT);I2C_Cmd(I2C1,ENABLE);}```
I2C的配置:
I2C_Mode:配置I2C的工作模式为I2C。
I2C_DutyCycle:配置时钟线的占空比,这里配置占空比为2:1.
I2C_OwnAddress1:peizhi STM32的I2C设备自己的地址。
I2C_Ack:接收应答,每接收到一个字节就返回一个应答。
I2C_AcknowledgedAddress:选择I2C的寻址模式,这个根据连接的设备来进行选择。
I2C_ClockSpeed:设置I2C的传输速率,最大不得高于400kHz。
配置好以后使能I2C外设。配置完成以后我们就要使用I2C来驱动OLED进行显示了。
第一步我们需要构建一个发送的最小单元,什么意思呢?就是定义一个函数,这个函数主要用来进行命令和数据的发送。为什么要这个样子呢?因为I2C在通信时过程比较繁琐,如果每次发送数据或者命令都要来配置一下的话,代码量会大大增加,并且程序的结构性也会被破坏,不利于阅读。
void WriteByte(uint8_t addr,uint8_t data)
{
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C1,ENABLE);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1,0x78,I2C_Direction_Transmitter);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));I2C_SendData(I2C1,addr);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1,data);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));I2C_GenerateSTOP(I2C1,ENABLE);
}’’’
这个就是发送的最小单元,在这里面接收两个参数,一个是地址,一个是数据。
内部实现的流程如下:
1、利用while循环判断I2C总线是否处于繁忙状态。
2、产生一个开始信号
3,、等待I2C_EVENT_MASTER_MODE_SELECT
4、发送目标设备的地址,也就是OLED屏幕的地址。
5,、等待事件I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED
6、发送地址
7、等待事件I2C_EVENT_MASTER_BYTE_TRANSMITTED
8、发送数据
9、等待事件I2C_EVENT_MASTER_BYTE_TRANSMITTED
10、产生一个停止信号。
到此我们的最小发送单元配置完成。当我们再次发送命令和数据时不需要再这么复杂的敲写代码,直接调用该函数即可。
以下为发送命令和发送数据的封装函数:
void Write_Cmd(unsigned char command)
{WriteByte(0x00,command);
}void Write_Dat(unsigned char data)
{WriteByte(0x40,data);
}
工欲善其事必先利其器,上面我们已经将如何发送数据写好了,下面我们就直接使用上面的函数来进行初始化等就可以了。
OLED屏幕的初始化:
void OLED_Init(void)
{int i = 10000;while(i--);//这个延时是必要的,没有使用定时器,就简单的写了个延时Write_Cmd(0xae);//开显示Write_Cmd(0x20);//设置内存寻址模式Write_Cmd(0x10);//00水平寻址01垂直10页面寻址Write_Cmd(0xb0);//为页面寻址模式设置页面开始地址0-7Write_Cmd(0xc8);//设置COM输出扫描方向Write_Cmd(0x00);//设置低列地址Write_Cmd(0x10);//设置高列地址Write_Cmd(0x40);//设置起始行地址Write_Cmd(0x81);//以下的使用的就去查找手册看一下吧!Write_Cmd(0xff);Write_Cmd(0xa1);Write_Cmd(0xa6);Write_Cmd(0xa8);Write_Cmd(0x3f);Write_Cmd(0xa4);Write_Cmd(0xd3);Write_Cmd(0x00);Write_Cmd(0xd5);Write_Cmd(0xf0);Write_Cmd(0xd9);Write_Cmd(0x22);Write_Cmd(0xda);Write_Cmd(0x12);Write_Cmd(0xdb);Write_Cmd(0x20);Write_Cmd(0x8d);Write_Cmd(0x14);Write_Cmd(0xaf);
}
初始完成,我们先来看一下OLED的屏幕的各个像素地址:
OLED的分别率是128x64.即是有128X64个像素点。所有的像素按照行分为8页,按列分为8段,每段里面有8行16列。
通常像素原点为左上角的(0,0)像素点,我们设置图像时,通常按照坐标来进行设置,但是我们设置的像素坐标需要转换为对应的地址。
void OLED_SetPos(unsigned char x,unsigned char y)
{Write_Cmd(0xb0+y);Write_Cmd(((x&0xf0)>>4)|0x10);Write_Cmd((x&0x0f)|0x01);
}
剩余的代码如下:
void OLED_Fill(unsigned char fill_data)
{unsigned char m,n;for(m = 0;m < 8;m++){Write_Cmd(0xb0+m);Write_Cmd(0x00);Write_Cmd(0x10);for(n = 0;n < 130;n++){Write_Dat(fill_data);}}}void OLED_CLS(void)
{OLED_Fill(0x00);
}void OLED_ON(void)
{Write_Cmd(0x8d);Write_Cmd(0x14);Write_Cmd(0xaf);
}void OLED_OFF(void)
{Write_Cmd(0x8d);Write_Cmd(0x10);Write_Cmd(0xae);
}
其中Write_Dat(0xf0);在屏幕上的像素分布如下:
0 |
---|
0 |
0 |
0 |
1 |
1 |
1 |
1 |
所以在利用取模工具时,需要注意高低位的情况。
STM32利用库函数驱动OLED相关推荐
- STM32硬件SPI驱动OLED
文章目录 一.OLED相关 1.OLED简介 2.0.96寸的OLED模块概述 3.模块引脚说明 4.汉字点阵编码原理 二.硬件SPI 1.SPI简介 2.SPI的引脚映射关系 三.SPI驱动的OLE ...
- 12. STM32——硬件IIC驱动OLED屏幕显示
STM32--硬件IIC驱动OLED屏幕显示 OLED屏幕 OLED屏幕特点 OLED屏幕接线说明 OLED屏幕显存 OLED屏幕原理 OLED屏幕常用指令 OLED屏幕字模软件的使用 写命令 写数据 ...
- STM32利用STM32CubeMX驱动SDRAM
STM32利用STM32CubeMX驱动SDRAM 本次发布FMC总线驱动SDRAM的博客,为下次发布LTDC外设驱动RGB屏的博客做准备.利用STM32CubeMX和HAL库,生成的工程代码具有很强 ...
- 15. STM32——软件IIC驱动OLED屏幕显示字符、字符串、数字、汉字
STM32--软件IIC驱动OLED屏幕显示 OLED屏幕 写命令 写内容 对OLED写入一个字节 设置光标 启动OLED 关闭OLED 全屏填充(清屏) 显示字符 显示字符串 获取次方 显示数字 显 ...
- STM32模拟IIC驱动OLED屏 原理+源码
处理器和芯片间的通信可以形象的比喻成两个人讲话:1.你说的别人得能听懂:双方约定信号的协议.2.你的语速别人得能接受:双方满足时序要求. 一.IIC总线的信号类型 1.开始信号:处理器让SCL时钟保持 ...
- X、合宙Air模块Luat开发:全网首发,通过iic直接驱动OLED,720Sl开始有显时代
目录 点击这里查看所有博文 本系列博客,理论上适用于合宙的Air202.Air268.Air720x.Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持). 先不管支不支 ...
- STM32通过SPI协议驱动OLED屏
坚持就是胜利 一.SPI协议介绍 01 简介 02 SPI物理层 03 SPI基本通讯过程 二.OLED显示器介绍 01 简介 02 接口定义 03 与STM32接线图 三.汉字取模软件介绍 01 下 ...
- K_A28_004 基于STM32等单片机驱动SI4432对发SI4432实现数据传输 OLED显示
K_A28_004 基于STM32等单片机驱动SI4432对发SI4432实现数据传输 OLED显示 所有资源导航 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 时序: 对应程序: 四.部 ...
- STM32 4SPI模式点OLED(SSD1306驱动)屏
参考资料 STM32学习笔记之OLED屏 OLED显示模块(原理讲解.STM32实例操作) 正点原子OLED教学视频 #####占坑待编辑##### SPI使用逻辑分析仪抓的波形分析:[此模块没有CS ...
最新文章
- (C++)1026 程序运行时间
- 高并发第八弹:J.U.C起航(java.util.concurrent)
- ktt算法 约化_推荐系统的多目标优化(4)-PE-LTR
- eclipse中Android模拟器常见的问题解决方法汇总
- jenkins 使用xctool 爆出: line 6: xctool: command not found
- 解决:Intellij idea 启动项目报错 error:java: 无效的源发行版: 8
- 20180110小测
- asp.net网站后台退出后,点后退按钮仍能进,如何安全退出
- 8、饼图(ax.pie)
- vue中先加载数据后加载页面
- ICCAP2016如何调用ads的仿真器hpeesofsim
- 用VB实现的QQ自动登录器
- 揭秘沃尔玛、腾讯、京东、浙商银行的供应链管理方案
- 企业青睐什么样的产品经理
- Shell脚本速查手册
- electron使用下载监听接口(will-download)出现不触发done
- BLE-1の蓝牙4.0协议栈概览
- CMS和G1的对比分析
- 关于facebook登录出现的问题
- Mac 与 Linux Windows 常见使用区别