目录
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,