1.简介 名称:ATK-0.96’OLED (0.96寸)
分辨率:128*64
驱动IC:SSD1306
工作电压3.3v
2.颜色
前16行为黄色,后48行为蓝色
3.通信
支持:4线SPI、IIC、8位6800、8位8080
4.购买
注:以下案例采用的是STM32F103C6T6
1、选择通讯方式
通过重新焊接模块后BS1、和BS2设置通信方式(8位8080并口是默认设置)
左图是正点原子的OLED,通过焊接BS1和BS2改变通信方式。右图是淘宝购买(我们用的)的通过焊接Rx选择通信方式(焊接的是R3和R4)
2、引脚说明
GND——接地
VCC——3.3V电压
D0——数据线0
D1——数据线1
RES——复位(低电平有效)
DC——数据/指令 控制
CS——片选信号,低电平有效
(1)D0
数据线0在4线SPI模式下作为SCLK
在IIC模式下,作为IIC的SCL
(2)D1
数据线1在4线SPI模式下做SDIN
(3)DC 数据/指令 控制
DC = 1传输数据;DC = 0,传输指令
在IIC模式下,作为SA0,用于设置IIC器件地址
(4)CS片选信号
低电平有效
注意:IIC和4线SPI不支持读操作。6800或8080并口模式支持读操作
3.与单片机相连接(以下案例是用这种连接方式)
GND —— 电源地
VCC —— 3.3v电源
D0 —— PA0(SCL)
D1 —— PA1(SDA)
RES —— PA2
DC —— PA3
CS —— PA4
4.4线SPI原理
(1)4根信号线
CS:OLED片选信号
RST(RES):硬复位OLED
DC:命令/数据标志(0读写命令,1读写数据)
SCLK(D0):串行时钟线,作为时钟线SCLK
SDIN(D1):串行数据线,作为数据线SDIN
(2)SPI的时序图
每个数据有8位,在SCLK(时钟)的上升沿将数据写入到SSD1306(高位在前)时序图如下
5.显存与指令
SSD1306(驱动)的显存总共位128*64bit(细心会发现显存大小与分辨率一致)
(1)写操作
每次写是按字节为单位写入的(1个字节的大小是8位),每次写入时都会控制1个点(1个字节控制一个点)。所以在写入前就要获取要设置的点所在字节的每一个位的信息,否则就会覆盖之前的信息。
注:我用人话说一下 8个像素点捆在一起,要想设置某个像素点就要把这一捆都要取出来然后再操作。
但是IIC和SPI无法进行读操作所以要在单片机(你写的代码)中建立一个OLED的SRAM(二维数组)
(2)指令
以下就是常用指令
OLED的驱动IC是SSD1306,对OLED模块的初始化就是对SSD1306的初始化
(1)SSD1306驱动的初始化
(2)单片机(GPIO)的初始化
刚开始看初始化我也是一头雾水,查阅资料后也不一定严谨,所以大佬看了如果有问题还请指点。
先看代码,难点主要在于红色和蓝色字体。
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //使能A端口时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); 看里面的两个参数
RCC_APB2Periph_GPIOA使能APB2上的GPIOA。RCC_APB2Periph_AFIO使能被重新映射到的I/O端口时钟。
GPIO_PinRemapConfig()该函数的功能就是重映射
重映射的是GPIO_Remap_SWJ_JTAGDisable,GPIO_Remap_SWJ_JTAGDisable的意思是避免端口不能正常使用
那为什么要用GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);这个函数呢?
首先,STM32F10x系列的MCU复位后,PA13/14/15 & PB3/4默认配置为JTAG功能。有时我们为了充分利用MCU I/O口的资源,会把这些 端口设置为普通I/O口。
2.代码
在oled.c文件的 OLED_Init函数
(1)初始化GPIO
在选用其它引脚时一定要注意更改
(2)初始化SSD1306驱动
参考厂家的源代码即可,详细见源代码
1.定义
(1)端口的定义
在oled.h中有对端口的定义
(2)指令的定义
(3)字库
英文和中文字库都在oledfont.h
2、接口函数
(1)OLED_WR_Byte 写一个字节到OLED中
最重要的函数没有之一,注释很清楚,必须看懂
名称:OLED_WR_Byte
参数:dat 传输数据;CMD 传输指令
#define OLED_CMD 0
#define OLED_DATA 1
简述:传输8位(1个字节)数据或者通过指令设置OLED
用法:OLED_WR_Byte(0xAE,OLED_CMD); 关闭显示
(2)设置OLED的相关函数
void OLED_Clear(void) 清屏函数 将OLED128*64都置0
void OLED_Refresh(void) 更新显存到OLED 将工程中OLED_GRAM[][]的数据输入到OLED的GRAM中
void OLED_DisPlay_On(void) 开启OLED显示
Void OLED_DisPlay_Off(void) 关闭OLED显示
void OLED_DisplayTurn(u8 i) 屏幕旋转180
void OLED_ColorTurn(u8 i) 返显函数(反色)
(3)画相关函数
void OLED_DrawPoint(u8 x,u8 y,u8 t) 画点
void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode); 画线
void OLED_DrawCircle(u8 x,u8 y,u8 r)画圆
(4)字符相关函数
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode);显示一个字符
必须看懂这个函数-后面显示有关字符的函数都跟这个有关。函数内的一些循环必须了解字库的原理才能看懂(看本篇文章的五-(3))
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode);显示字符串
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode);显示数字
void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode);显示中文字
汉字库需要自己建立
void OLED_ScrollDisplay(u8 num,u8 space,u8 mode);显示汉字字符串
(5)显示图片函数
void OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[],u8 mode)显示图片
可以看看正点原子的原码跑一下就明白了,或者看一下我们的代码注释也很清楚。
1.显存
显存全程是显卡内存。
用途:存储图形信息数据—芯片处理过或者要提取的数据
2.自创字库
(1)建立字库的软件
该软件位于该目录下
(2)软件用法
字模选项
当前自定义格式生成的字模直接复制粘贴到keil中会报错,原因如下:
假设我们生成一个“王朝璇”三个字
DB 40H 00H 47H C2H 44H 41H 44H 42H 7CH 7CH 01H 00H 01H 00H FFH FFH 01H 02H 05H 84H 09H 60H 11H 10H;
DB 61H 08H 01H 04H 01H 02H 00H 00H;"王",0
DB 08H 20H 08H C0H 0BH 00H FFH FFH 09H 00H 48H 80H 47H FFH 44H 12H 7FH E2H 44H 02H 44H 02H 7FH E2H;
DB 44H 22H 47H FFH 40H 00H 00H 00H;"朝",1
DB 21H 08H 21H 0CH 3FH F8H 21H 11H 21H 12H 10H 0CH 9FH F0H 72H 04H 13H FDH 08H 02H 12H 7CH F2H 02H;
DB 13H FEH 12H 22H 13H 22H 00H 00H;"璇",2
这些都会报错
所以在使用前一定要设置好,正确设置如下:
这是在keil(c语言)中正确的格式
资料来源于正点原子
资料链接:https://pan.baidu.com/s/1Zk9TNOgKqgC3wH_bTdVR8g
提取码:6j1c