亿阳电子0.96寸IIC接口4引脚OLED驱动

本文详细介绍了采用SSD1306驱动芯片的0.96寸IIC接口OLED模块,包括其显示模式、128x64分辨率、引脚定义、各种命令集、寻址模式及GDDRAM的工作原理。同时,提供了源码文件供参考。
摘要由CSDN通过智能技术生成

IIC

OLED模块

特征

显示模式

无源矩阵

分辨率

分辨率128x64: 128行 64列.
在这里插入图片描述

驱动IC

SSD1306

引脚

VCC 3.3V 电源
GND 接地
SCL IIC时钟引脚
SDA IIC数据引脚

模块命令

基础命令

0xA4
0xA5
0xA6 正常显示.
0xA7 反转显示
0xAE 显示关闭,进入睡眠模式.
0xAF 显示打开, 进入正常模式.

滚动命令

寻址设置命令

0x00 ~ 0x0F 设置页寻址模式的起始地址的低4位
0x10 ~ 0x1F 设置页寻址模式的起始地址的高4位
0x20 设置寻址模式
00b 在0x20命令后, 设置水平寻址模式
01b 在0x20命令后, 设置垂直寻址模式
10b 在0x20命令后, 设置页寻址模式
0x21 设置列起始地址和结束地址(注:只对水平寻址模式和垂直寻址模式有效)
0000000b ~ 1111111b (0 ~ 127) 在0x21命令后, 设置起始地址
0000000b ~ 1111111b (0 ~ 127) 在0x21命令的起始地址后, 设置结束地址
0x22 设置页起始地址和页结束地址(注:只对水平寻址模式和垂直寻址模式有效)
000b ~ 111b (0 ~ 3) 在0x22命令后, 设置页起始地址
000b ~ 111b (0 ~ 3) 在0x22命令的页起始地址后, 设置页结束地址
0xB0 ~ 0xB7

硬件配置命令

0x40 ~ 0x7F 设置RAM显示起始行, 范围0 ~ 63行.
0xA0 水平镜像命令: 列地址0映射到 左边开始第0列.
0xA1 水平镜像命令: 列地址127映射到 左边开始第127列.
0xA8
在0xA8命令后,
0xC0 垂直镜像命令: 扫描从0行到127行.
0xC8 垂直镜像命令: 扫描从127行到0行.
0xD3 设置显示偏移量
000000b ~ 111111b (0 ~ 63) 在0xD3命令后, 设置显示偏移量.
0xDA
在0xDA命令后,

时序与驱动方式设置命令

0xD5
在0xD5命令后,
0xD9
在0xD9命令后,
0xDB
在0xDB命令后,
0xE3

高级图像命令

0x23
在0x23命令后,
0xD6
在0xD6命令后,

充电命令

0x8D
在0x8D命令后,

寻址模式

水平寻址

0x0

垂直寻址

0x1

页寻址

0x0 ~ 0xF 设置起始列地址的低4位
0x10 ~ 0x1F 设置起始列地址的高4位
0xB0 ~ 0xB7 设置起始页地址
0x2 设置页寻址模式

Graphic Display Data RAM (GDDRAM)

GDDRAM容量

GDDRAM是一个128x64位的内存.

GDDRAM 页

GDDRAM被分为8页: PAGE0 ~ PAGE7.
每一页由8行构成.

行有2种映射方式:

方式一 方式二
PAGE0 0 ~ 7 行 63 ~ 56 行
PAGE1 8 ~ 15 行 55 ~ 48 行
PAGE2 16 ~ 23 行 47 ~ 40 行
PAGE3 24 ~ 31 行 39 ~ 32 行
PAGE4 32 ~ 39 行 31 ~ 24 行
PAGE5 40 ~ 47 行 23 ~ 16 行
PAGE6 48 ~ 55 行 15 ~ 8 行
PAGE7 56 ~ 63 行 7 ~ 0 行

在这里插入图片描述

水平镜像:

列地址可以从屏幕左边或者右边开始.

正常显示方式: 命令A0设置 映射, 从左向右显示.
水平镜像显示方式: 命令A1设置, 从右向左显示.

列地址 正常显示方式 水平镜像显示方式
0 左边开始第0列 左边开始第127列
N 左边开始第N列 左边开始第127-N列
127 左边开始第127列 左边开始第0列

在这里插入图片描述

在这里插入图片描述

垂直镜像

行地址可以从屏幕上边或者下边开始.

正常显示方式: 命令0xC0设置 映射, 从上向下显示.
垂直镜像显示方式: 命令0xC8设置, 从下向上显示.

行地址 正常显示方式 垂直镜像显示方式
0 上边开始第0行 上边开始第63行
N 上边开始第N行 上边开始第63-N行
63 上边开始第63行 上边开始第0行

在这里插入图片描述

在这里插入图片描述

像素镜像

0xA6
0xA7
在这里插入图片描述

在这里插入图片描述

源码

main.c

#include "stm32f10x.h"
#include "gpio.h"
#include "clock.h"
#include "bus_iic.h"
#include "module_oled.h"
#include "module_oled_word.h"
int main(void)
{
   
	IIC_GPIO_INIT();
	OLED_INIT();
	OLED_FILL(0x0);
	OLED_P6x8_STRING(0, 10, "nice day");

	while (1) {
   
			;
	}
	return 0;
}

module_oled.h

#ifndef MODULE_OLED_H
#define MODULE_OLED_H
#include "stm32f10x.h"

#define X_WIDTH 	128
#define Y_WIDTH 	64
#define	BRIGHTNESS	0xCF

void OLED_WRITE_BYTE(u8 byte);
void OLED_WRITE_COMMAND(u8 byte);
void OLED_SET_POS(u8 x, u8 y);
void OLED_CLS(void);
void OLED_FILL(u8 data);
void OLED_INIT(void);
void OLED_P6x8_STRING(u8 x, u8 y, u8 ch[]);
void OLED_P8x16_STRING(u8 x, u8 y,u8 ch[]);
void OLED_P16x16Ch(u8 x, u8 y ,u8 N);
#endif

module_oled.c

#include "module_oled.h"
#include "module_oled_word.h"
#include "bus_iic.h"
void OLED_DELAY(u32 time)
{
   
	while (time--);
}

void OLED_WRITE_BYTE(u8 byte)
{
   
	IIC_START();
	IIC_WRITE_BYTE(0x78);
	IIC_WRITE_BYTE(0x40);			
	IIC_WRITE_BYTE(byte);
	IIC_STOP();
}


void OLED_WRITE_COMMAND(u8 byte)
{
   
	IIC_START();
	IIC_WRITE_BYTE(0x78);     //Slave address,SA0=0
	IIC_WRITE_BYTE(0x00);			//write command
	IIC_WRITE_BYTE(byte);
	IIC_STOP();
}


void OLED_SET_POS(u8 x, u8 y) 
{
    
	OLED_WRITE_COMMAND(0xb0 + y);
	OLED_WRITE_COMMAND(((x & 0xf0) >> 4) | 0x10);
	OLED_WRITE_COMMAND((x & 0x0f) | 0x01);
} 


void OLED_FILL(u8 data) 
{
   
	u8 y,x;
	for (y = 0; y < 8; y++)
	{
   
		OLED_WRITE_COMMAND(0xb0 + y);
		OLED_WRITE_COMMAND(0x01);
		OLED_WRITE_COMMAND(0x10);
		for (x = 0; x < X_WIDTH; x++)
			OLED_WRITE_BYTE(data);
	}
}


void OLED_CLS(void)
{
   
	u8 y,x;
	for (y = 0; y < 8; y++)
	{
   
		OLED_WRITE_COMMAND(0xb0+y);
		OLED_WRITE_COMMAND(0x01);
		OLED_WRITE_COMMAND(0x10);
		for (x = 0; x < X_WIDTH; x++)
			IIC_WRITE_BYTE(0);
	}
}


void OLED_INIT(void)
{
   
	OLED_DELAY(500);
	OLED_WRITE_COMMAND(0xae);//--turn off oled panel
	OLED_WRITE_COMMAND(0x00);//---set low column address
	OLED_WRITE_COMMAND(0x10);//---set high column address
	OLED_WRITE_COMMAND(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)   // ÏÔʾÐÐ
	OLED_WRITE_COMMAND(0x81);//--set contrast control register
	OLED_WRITE_COMMAND(BRIGHTNESS); // Set SEG Output Current Brightness
	OLED_WRITE_COMMAND(0xa1);//--Set SEG/Column Mapping     0xa0???? 0xa1??
	OLED_WRITE_COMMAND(0xc8);//Set COM/Row Scan Direction   0xc0???? 0xc8??
	OLED_WRITE_COMMAND(0xa6);//--set normal display
	OLED_WRITE_COMMAND(0xa8);//--set multiplex ratio(1 to 64)
	OLED_WRITE_COMMAND(0x3f);//--1/64 duty
	OLED_WRITE_COMMAND(0xd3);//-set display offset	Shift Mapping RAM Counter (0x00~0x3F)
	OLED_WRITE_COMMAND(0x00);//-not offset
	OLED_WRITE_COMMAND(0xd5);//--set display clock divide ratio/oscillator frequency
	OLED_WRITE_COMMAND(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
	OLED_WRITE_COMMAND(0xd9);//--set pre-charge period
	OLED_WRITE_COMMAND(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
	OLED_WRITE_COMMAND(0xda);//--set com pins hardware configuration
	OLED_WRITE_COMMAND(0x12);
	OLED_WRITE_COMMAND(0xdb);//--set vcomh
	OLED_WRITE_COMMAND(0x40);//Set VCOM Deselect Level
	OLED_WRITE_COMMAND(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
	OLED_WRITE_COMMAND(0x02);//
	OLED_WRITE_COMMAND(0x8d);//--set Charge Pump enable/disable
	OLED_WRITE_COMMAND(0x14);//--set(0x10) disable
	OLED_WRITE_COMMAND(0xa4);// Disable Entire Display On (0xa4/0xa5)
	OLED_WRITE_COMMAND(0xa6);// Disable Inverse Display On (0xa6/a7) 
	OLED_WRITE_COMMAND(0xaf);//--turn on oled panel
	OLED_FILL(0x00); 
	OLED_SET_POS(0, 0);
} 


// 6ÁÐ 8ÐÐ
void OLED_P6x8_STRING(u8 x, u8 y, u8 ch[])
{
   
	u8 c, i, j;
	c = i = j = 0;
	while ('\0' != ch[j])
	{
   
		c = ch[j] - 32;
		if (x > 126) {
   
			x=0;
			y++;
		}
		OLED_SET_POS(x, y);
		for(i = 0; i < 6; i++) {
   
			OLED_WRITE_BYTE(F6x8[c][i]);
		}
		x += 6;		
		j++;
	}
}



void OLED_P8x16_STRING(u8 x, u8 y,u8 ch[])
{
   
	u8 c, i, j;
	c = i = j = 0;
	while ('\0' != ch[j])
	{
   
		c = ch[j] - 32;
		if (x > 120) {
   
			x=0;
			y++;
		}
		OLED_SET_POS(x,y);
		for (i = 0; i < 8; i++)
			OLED_WRITE_BYTE(F8X16[c * 16 + i]);
		OLED_SET_POS(x, y + 1);
		for (i = 0; i < 8; i++)
			OLED_WRITE_BYTE(F8X16[c * 16 + i + 8]);
		x+=8;
		j++;
	}
}

void OLED_P16x16Ch(u8 x, u8 y ,u8 N)
{
   
	u8 wm=0;
	u32 adder = 32 * N;
	OLED_SET_POS(x , y);
	for(wm = 0; wm < 16; wm++)
	{
   
		OLED_WRITE_BYTE(F16x16[adder]);
		adder += 1;
	}
	OLED_SET_POS(x,y + 1);
	for(wm = 0;wm < 16;wm++)
	{
   
		OLED_WRITE_BYTE(F16x16[adder]);
		adder += 1;
	} 	  	
}



## module_oled_word.h

```c
#ifndef MODULE_OLED_WORD_H
#define MODULE_OLED_WORD_H

/***************************16*16µÄµãÕó×ÖÌåÈ¡Ä£·½Ê½£º¹²Òõ¡ª¡ªÁÐÐÐʽ¡ª¡ªÄæÏòÊä³ö*********/
static const u8 F16x16[] =
{
     	  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/

0x00,0x02,0x02,0xFA,0xFA,0xAA,0xAA,0xFF,0xFF,0xAA,0xAA,0xFA,0xFA,0x02,0x02,0x00,
0x00,0x42,0x72,0x72,0x3A,0x7A,0x42,0x4B,0x5B,0x52,0x62,0x62,0x13,0x77,0x66,0x00,/*"»Ý",1*/

0x20,0x3C,0x1C,0xFF,0xFF,0xB0,0xB4,0x24,0x24,0x3F,0x3F,0xE4,0xE4,0x24,0x24,0x20,
0x02,0x02,0x03,0xFF,0xFF,0x00,0x01,0x05,0x1D,0x59,0xC1,0xFF,0x7F,0x01,0x01,0x01,/*"ÌØ",2*/

0x00,0x00,0x00,0xF8,0xF8,0x48,0x4C,0x4F,0x4B,0x4A,0x48,0x48,0xF8,0xF8,0x00,0x00,
0x00,0x00,0x00,0xFF,0xFF,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFF,0xFF,0x00,0x00,/*"×Ô",3*/

0x20,0x24,0x24,0xE4,0xE4,0x24,0x24,0x24,0x30,0x10,0xFF,0xFF,0x10,0xF0,0xF0,0x00,
0x08,0x1C,0x1F,0x0B,0x0C,0x0D,0x4F,0x6E,0x34,0x1C,0x0F,0x23,0x60,0x7F,0x3F,0x00,/*"¶¯",4*/

0x80,0xC0,0x60,0xF8,0xFF,0x07,0x02,0x00,0xFF,0xFF,0xE0,0x70,0x3C,0x1C,0x08,0x00,
0x00,0x00,0x00,0x7F,0x7F,0x04,0x06,0x03,0x3F,0x7F,0x40,0x40,0x40,0x78,0x78,0x00,/*"»¯",5*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",6*/
0x00,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值