OLED学习记录

一、硬件介绍: 

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.购买

                                OLED学习记录_第1张图片

                        注:以下案例采用的是STM32F103C6T6

二、硬件连接

1、选择通讯方式

通过重新焊接模块后BS1、和BS2设置通信方式(8位8080并口是默认设置)

左图是正点原子的OLED,通过焊接BS1和BS2改变通信方式。右图是淘宝购买(我们用的)的通过焊接Rx选择通信方式(焊接的是R3和R4)

OLED学习记录_第2张图片OLED学习记录_第3张图片

2、引脚说明

OLED学习记录_第4张图片

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根信号线

CSOLED片选信号

RST(RES):硬复位OLED

DC:命令/数据标志(0读写命令,1读写数据)

SCLK(D0):串行时钟线,作为时钟线SCLK

SDIN(D1):串行数据线,作为数据线SDIN

(2)SPI的时序图

每个数据有8位,在SCLK(时钟)的上升沿将数据写入到SSD1306(高位在前)时序图如下

 

 OLED学习记录_第5张图片

 

5.显存与指令

SSD1306(驱动)的显存总共位128*64bit(细心会发现显存大小与分辨率一致)

OLED学习记录_第6张图片

(1)写操作

每次写是按字节为单位写入的(1个字节的大小是8),每次写入时都会控制1个点(1个字节控制一个点)。所以在写入前就要获取要设置的点所在字节的每一个位的信息,否则就会覆盖之前的信息。

注:我用人话说一下 8个像素点捆在一起,要想设置某个像素点就要把这一捆都要取出来然后再操作。

但是IICSPI无法进行读操作所以要在单片机(你写的代码)中建立一个OLEDSRAM(二维数组)

(2)指令

以下就是常用指令

 OLED学习记录_第7张图片

 三、初始化

  1. 简述

OLED的驱动IC是SSD1306,对OLED模块的初始化就是对SSD1306的初始化

(1)SSD1306驱动的初始化

OLED学习记录_第8张图片

(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上的GPIOARCC_APB2Periph_AFIO使能被重新映射到的I/O端口时钟。

        GPIO_PinRemapConfig()该函数的功能就是重映射

重映射的是GPIO_Remap_SWJ_JTAGDisableGPIO_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

        在选用其它引脚时一定要注意更改

 OLED学习记录_第9张图片

 

(2)初始化SSD1306驱动

        参考厂家的源代码即可,详细见源代码

四、接口函数

1.定义

        (1)端口的定义

                在oled.h中有对端口的定义

OLED学习记录_第10张图片

(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)软件用法

字模选项

OLED学习记录_第11张图片

当前自定义格式生成的字模直接复制粘贴到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

这些都会报错

 所以在使用前一定要设置好,正确设置如下:

OLED学习记录_第12张图片

这是在keil(c语言)中正确的格式

 

资料来源于正点原子

资料链接:https://pan.baidu.com/s/1Zk9TNOgKqgC3wH_bTdVR8g

提取码:6j1c

 

 

 

 

 

你可能感兴趣的:(单片机,stm32,嵌入式硬件)