1.0 模块原理图
2.0 0.96OLED简介
资料下载:https://jiangxiekeji.com/download.html
程序介绍:https://jiangxiekeji.com/tutorial/oled.html
SSD1306是一款OLED/PLED点阵显示屏的控制器,可以嵌入在屏幕中,用于执行接收数据、显示存储、扫描刷新等任务
驱动接口:128个SEG引脚和64个COM引脚,对应128x64像素点阵显示屏
内置显示存储器(GDDRAM):128x64 bit(128x8 Byte)SRAM
供电:VDD=1.65~3.3V(IC逻辑),VCC=7~15V(面板驱动)
通信接口:8位6800/8080并行接口,3/4线SPI接口,I2C接口
3.0 SSD1306定义及引脚框图
4.0 通信接口选择与通信线定义
图片解读:
5.0 6800并口协议
提到 "6800",最著名的可能是 Motorola 6800 微处理器。这是由摩托罗拉公司在1974年发布的8位微处理器,它在当时的计算机和嵌入式系统中扮演了重要角色。
6.0 8080并口协议
7.0 4线SPI
8.0 3线SPI
9.0 0.96寸显示屏命令表
10.0 开启指令
11.0 IIC通讯协议
注:IIC协议实现参考这一篇文章:STM32 IIC协议实现-CSDN博客
12.0 程序实现
12.0.1 发送命令
// OLED发送命令
void OLED_WriteCommand(uint8_t command)
{
IIC_Start();
IIC_SendByte(0x78);
IIC_Wait_Ack();
IIC_SendByte(0x00);
IIC_Wait_Ack();
IIC_SendByte(command);
IIC_Wait_Ack();
IIC_Stop();
}
12.0.2 发送数据
// OLED发送数据
void OLED_WriteData(uint8_t data)
{
IIC_Start();
IIC_SendByte(0x78);
IIC_Wait_Ack();
IIC_SendByte(0x40);
MyI2C_ReceiveAck();
IIC_SendByte(data);
IIC_Wait_Ack();
IIC_Stop();
}
12.0.3 设置显示位置
注:以上的内容来自元地址设置命令表,表示x坐标的位置和Y坐标的位置
// OLED显示位置
void OLED_SetCursor(uint8_t x, uint8_t page)
{
// 设置显示的X轴低四位
OLED_WriteCommand(0x00 | (x & 0x0F));
// 设置显示的X地址高四位
OLED_WriteCommand(0x10 | (x & 0xF0) >> 4);
// 设置显示的页地址
OLED_WriteCommand(0xB0 | page);
}
12.0.4 初始化OLED
注:这个操作也就是开启显示器的显示,将显示器从关闭状态转换为打开状态
// 初始化OLED
void OLED_Init(void)
{
// 初始化IIC
IIC_Init();
Delay_ms(100);
OLED_WriteCommand(0xAE);
OLED_WriteCommand(0xD5);
OLED_WriteCommand(0x80);
OLED_WriteCommand(0xA8);
OLED_WriteCommand(0x3F);
OLED_WriteCommand(0xD3);
OLED_WriteCommand(0x00);
OLED_WriteCommand(0x40);
OLED_WriteCommand(0xA1);
OLED_WriteCommand(0xC8);
OLED_WriteCommand(0xDA);
OLED_WriteCommand(0x12);
OLED_WriteCommand(0x81);
OLED_WriteCommand(0xCF);
OLED_WriteCommand(0xD9);
OLED_WriteCommand(0xF1);
OLED_WriteCommand(0xDB);
OLED_WriteCommand(0x30);
OLED_WriteCommand(0xA4);
OLED_WriteCommand(0xA6);
OLED_WriteCommand(0x8D);
OLED_WriteCommand(0x14);
OLED_WriteCommand(0xAF);
Delay_ms(100);
}
12.0.5 清屏函数
// OLED 清屏
void OLED_Clear(void)
{
for (uint8_t j = 0; j < 8; j++)
{
OLED_SetCursor(0, j);
{
for (uint8_t i = 0; i < 128; i++)
{
OLED_WriteData(0x00);
}
}
}
}
12.0.6 OLED显示字符
// OLED显示字符
void OLED_ShowChar(uint8_t x, uint8_t y, char mChar, uint8_t fontSize)
{
if (fontSize == 8)
{
// 设置起始位置
OLED_SetCursor(x, y);
uint8_t i = 0;
for (i = 0; i < 8; i++)
{
// 写入数组指定行的第i个数据
OLED_WriteData(ascii8x16[mChar - ' '][i]);
}
OLED_SetCursor(x, y + 1);
for (i = 0; i < 8; i++)
{
OLED_WriteData(ascii8x16[mChar - ' '][i + 8]);
}
}
}
12.0.7 OLED显示字符串
void OLED_ShowString(uint8_t X, uint8_t Page, char *String, uint8_t FontSize)
{
for (uint8_t i = 0; String[i] != '\0'; i++)
{
OLED_ShowChar(X + i * FontSize, Page, String[i], FontSize);
}
}
12.0.8 OLED显示图片
// OLED显示图片
void OLED_ShowImage(uint8_t x, uint8_t y, uint8_t width, uint8_t height, const uint8_t *Image)
{
for (uint8_t j = 0; j < height; j++)
{
// 设置起始位置
OLED_SetCursor(x, y + j);
uint8_t i = 0;
for (i = 0; i < width; i++)
{
// 写入数组指定行的第i个数据
OLED_WriteData(Image[width * j + i]);
}
}
}
/**
* @brief 补充注释
* 如果高度是1也就是只有8个像素,也就是只有一页
* 那么显示一页的数据就是遍历width页就是字符的宽度个字节
* 然后显示对应的数。
* 如果高度不仅仅是1而是16,也就是代表这个字符是跨2页进行
* 写入的,那么就要再加一个for循环对第二页的数据进行写入
* 也就是第二页开始的字节然后写入【0-9】【】
*
*/
12.0.9 OLED显示汉字
void OLED_ShowChinese(uint8_t X, uint8_t Page, char *Chinese)
{
// 第一步:先把传递过来的汉字串,拆分为一个个独立的汉字
char SigleChinese[4] = {0};
uint8_t pChinese = 0;
uint8_t pIndex;
for (uint8_t i = 0; Chinese[i] != '\0'; i++)
{
SigleChinese[pChinese] = Chinese[i];
pChinese++;
if (pChinese >= 3)
{
pChinese = 0;
for (pIndex = 0; strcmp(OLED_CF16x16[pIndex].Index, "") != 0; pIndex++)
{
if (strcmp(OLED_CF16x16[pIndex].Index, SigleChinese) == 0)
{
break;
}
}
OLED_ShowImage(X + ((i + 1) / 3 - 1) * 16, Page, 16, 2, OLED_CF16x16[pIndex].Data);
}
}
}
12.0.10 OLED头文件
#ifndef _OLED_H_
#define _OLED_H_
#include <stdint.h>
// OLED初始化
void OLED_Init(void);
// OLED发送命令
void OLED_WriteCommand(uint8_t command);
// OLED发送数据
void OLED_WriteData(uint8_t data);
// OLED显示位置
void OLED_SetCursor(uint8_t x, uint8_t page);
// OLED 清屏
void OLED_Clear(void);
// OLED显示字符
void OLED_ShowChar(uint8_t x, uint8_t y, char mChar, uint8_t fontSize);
// OLED显示图片
void OLED_ShowImage(uint8_t x, uint8_t y, uint8_t width, uint8_t height, const uint8_t *Image);
// void OLED_ShowChinese(uint8_t x, uint8_t y, char *chinese);
void OLED_ShowChinese(uint8_t X, uint8_t Page, char *Chinese);
void OLED_ShowString(uint8_t X, uint8_t Page, char *String, uint8_t FontSize);
#endif
12.0.11 字符编码
注:该字符编码放在一个单独的C语言文件中
#include <stdint.h>
#include <stdio.h>
const uint8_t ascii8x16[][16] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*" ",0*/
0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, /*"!",1*/
0x00, 0x10, 0x0C, 0x02, 0x10, 0x0C, 0x02, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*""",2*/
0x00, 0x40, 0xC0, 0x78, 0x40, 0xC0, 0x78, 0x00,
0x00, 0x04, 0x3F, 0x04, 0x04, 0x3F, 0x04, 0x00, /*"#",3*/
0x00, 0x70, 0x88, 0x88, 0xFC, 0x08, 0x30, 0x00,
0x00, 0x18, 0x20, 0x20, 0xFF, 0x21, 0x1E, 0x00, /*"$",4*/
0xF0, 0x08, 0xF0, 0x80, 0x60, 0x18, 0x00, 0x00,
0x00, 0x31, 0x0C, 0x03, 0x1E, 0x21, 0x1E, 0x00, /*"%",5*/
0x00, 0xF0, 0x08, 0x88, 0x70, 0x00, 0x00, 0x00,
0x1E, 0x21, 0x23, 0x2C, 0x19, 0x27, 0x21, 0x10, /*"&",6*/
0x00, 0x12, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*"'",7*/
0x00, 0x00, 0x00, 0xE0, 0x18, 0x04, 0x02, 0x00,
0x00, 0x00, 0x00, 0x07, 0x18, 0x20, 0x40, 0x00, /*"(",8*/
0x00, 0x02, 0x04, 0x18, 0xE0, 0x00, 0x00, 0x00,
0x00, 0x40, 0x20, 0x18, 0x07, 0x00, 0x00, 0x00, /*")",9*/
0x40, 0x40, 0x80, 0xF0, 0x80, 0x40, 0x40, 0x00,
0x02, 0x02, 0x01, 0x0F, 0x01, 0x02, 0x02, 0x00, /*"*",10*/
0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00,
0x00, 0x01, 0x01, 0x01, 0x0F, 0x01, 0x01, 0x01, /*"+",11*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x90, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, /*",",12*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, /*"-",13*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, /*".",14*/
0x00, 0x00, 0x00, 0x00, 0xC0, 0x38, 0x04, 0x00,
0x00, 0x60, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, /*"/",15*/
0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00,
0x00, 0x0F, 0x10, 0x20, 0x20, 0x10, 0x0F, 0x00, /*"0",16*/
0x00, 0x00, 0x10, 0x10, 0xF8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, /*"1",17*/
0x00, 0x70, 0x08, 0x08, 0x08, 0x08, 0xF0, 0x00,
0x00, 0x30, 0x28, 0x24, 0x22, 0x21, 0x30, 0x00, /*"2",18*/
0x00, 0x30, 0x08, 0x08, 0x08, 0x88, 0x70, 0x00,
0x00, 0x18, 0x20, 0x21, 0x21, 0x22, 0x1C, 0x00, /*"3",19*/
0x00, 0x00, 0x80, 0x40, 0x30, 0xF8, 0x00, 0x00,
0x00, 0x06, 0x05, 0x24, 0x24, 0x3F, 0x24, 0x24, /*"4",20*/
0x00, 0xF8, 0x88, 0x88, 0x88, 0x08, 0x08, 0x00,
0x00, 0x19, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00, /*"5",21*/
0x00, 0xE0, 0x10, 0x88, 0x88, 0x90, 0x00, 0x00,
0x00, 0x0F, 0x11, 0x20, 0x20, 0x20, 0x1F, 0x00, /*"6",22*/
0x00, 0x18, 0x08, 0x08, 0x88, 0x68, 0x18, 0x00,
0x00, 0x00, 0x00, 0x3E, 0x01, 0x00, 0x00, 0x00, /*"7",23*/
0x00, 0x70, 0x88, 0x08, 0x08, 0x88, 0x70, 0x00,
0x00, 0x1C, 0x22, 0x21, 0x21, 0x22, 0x1C, 0x00, /*"8",24*/
0x00, 0xF0, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00,
0x00, 0x01, 0x12, 0x22, 0x22, 0x11, 0x0F, 0x00, /*"9",25*/
0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, /*":",26*/
0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, /*";",27*/
0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00,
0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, /*"<",28*/
0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, /*"=",29*/
0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00,
0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, /*">",30*/
0x00, 0x70, 0x48, 0x08, 0x08, 0x88, 0x70, 0x00,
0x00, 0x00, 0x00, 0x30, 0x37, 0x00, 0x00, 0x00, /*"?",31*/
0xC0, 0x30, 0xC8, 0x28, 0xE8, 0x10, 0xE0, 0x00,
0x07, 0x18, 0x27, 0x28, 0x2F, 0x28, 0x17, 0x00, /*"@",32*/
0x00, 0x00, 0xC0, 0x38, 0xE0, 0x00, 0x00, 0x00,
0x20, 0x3C, 0x23, 0x02, 0x02, 0x27, 0x38, 0x20, /*"A",33*/
0x08, 0xF8, 0x88, 0x88, 0x88, 0x70, 0x00, 0x00,
0x20, 0x3F, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00, /*"B",34*/
0xC0, 0x30, 0x08, 0x08, 0x08, 0x08, 0x38, 0x00,
0x07, 0x18, 0x20, 0x20, 0x20, 0x10, 0x08, 0x00, /*"C",35*/
0x08, 0xF8, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00,
0x20, 0x3F, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00, /*"D",36*/
0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00,
0x20, 0x3F, 0x20, 0x20, 0x23, 0x20, 0x18, 0x00, /*"E",37*/
0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00,
0x20, 0x3F, 0x20, 0x00, 0x03, 0x00, 0x00, 0x00, /*"F",38*/
0xC0, 0x30, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00,
0x07, 0x18, 0x20, 0x20, 0x22, 0x1E, 0x02, 0x00, /*"G",39*/
0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08,
0x20, 0x3F, 0x21, 0x01, 0x01, 0x21, 0x3F, 0x20, /*"H",40*/
0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00, 0x00,
0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, /*"I",41*/
0x00, 0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00,
0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, /*"J",42*/
0x08, 0xF8, 0x88, 0xC0, 0x28, 0x18, 0x08, 0x00,
0x20, 0x3F, 0x20, 0x01, 0x26, 0x38, 0x20, 0x00, /*"K",43*/
0x08, 0xF8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
0x20, 0x3F, 0x20, 0x20, 0x20, 0x20, 0x30, 0x00, /*"L",44*/
0x08, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x08, 0x00,
0x20, 0x3F, 0x01, 0x3E, 0x01, 0x3F, 0x20, 0x00, /*"M",45*/
0x08, 0xF8, 0x30, 0xC0, 0x00, 0x08, 0xF8, 0x08,
0x20, 0x3F, 0x20, 0x00, 0x07, 0x18, 0x3F, 0x00, /*"N",46*/
0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00,
0x0F, 0x10, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00, /*"O",47*/
0x08, 0xF8, 0x08, 0x08, 0x08, 0x08, 0xF0, 0x00,
0x20, 0x3F, 0x21, 0x01, 0x01, 0x01, 0x00, 0x00, /*"P",48*/
0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00,
0x0F, 0x10, 0x28, 0x28, 0x30, 0x50, 0x4F, 0x00, /*"Q",49*/
0x08, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x70, 0x00,
0x20, 0x3F, 0x20, 0x00, 0x03, 0x0C, 0x30, 0x20, /*"R",50*/
0x00, 0x70, 0x88, 0x08, 0x08, 0x08, 0x38, 0x00,
0x00, 0x38, 0x20, 0x21, 0x21, 0x22, 0x1C, 0x00, /*"S",51*/
0x18, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x18, 0x00,
0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00, /*"T",52*/
0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08,
0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, /*"U",53*/
0x08, 0x78, 0x88, 0x00, 0x00, 0xC8, 0x38, 0x08,
0x00, 0x00, 0x07, 0x38, 0x0E, 0x01, 0x00, 0x00, /*"V",54*/
0x08, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x08, 0x00,
0x00, 0x03, 0x3E, 0x01, 0x3E, 0x03, 0x00, 0x00, /*"W",55*/
0x08, 0x18, 0x68, 0x80, 0x80, 0x68, 0x18, 0x08,
0x20, 0x30, 0x2C, 0x03, 0x03, 0x2C, 0x30, 0x20, /*"X",56*/
0x08, 0x38, 0xC8, 0x00, 0xC8, 0x38, 0x08, 0x00,
0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00, /*"Y",57*/
0x10, 0x08, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00,
0x20, 0x38, 0x26, 0x21, 0x20, 0x20, 0x18, 0x00, /*"Z",58*/
0x00, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x02, 0x00,
0x00, 0x00, 0x00, 0x7F, 0x40, 0x40, 0x40, 0x00, /*"[",59*/
0x00, 0x04, 0x38, 0xC0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x06, 0x38, 0xC0, 0x00, /*"\",60*/
0x00, 0x02, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00,
0x00, 0x40, 0x40, 0x40, 0x7F, 0x00, 0x00, 0x00, /*"]",61*/
0x00, 0x00, 0x04, 0x02, 0x02, 0x04, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*"^",62*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, /*"_",63*/
0x00, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*"`",64*/
0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00,
0x00, 0x19, 0x24, 0x24, 0x12, 0x3F, 0x20, 0x00, /*"a",65*/
0x10, 0xF0, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00,
0x00, 0x3F, 0x11, 0x20, 0x20, 0x11, 0x0E, 0x00, /*"b",66*/
0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00,
0x00, 0x0E, 0x11, 0x20, 0x20, 0x20, 0x11, 0x00, /*"c",67*/
0x00, 0x00, 0x80, 0x80, 0x80, 0x90, 0xF0, 0x00,
0x00, 0x1F, 0x20, 0x20, 0x20, 0x10, 0x3F, 0x20, /*"d",68*/
0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00,
0x00, 0x1F, 0x24, 0x24, 0x24, 0x24, 0x17, 0x00, /*"e",69*/
0x00, 0x80, 0x80, 0xE0, 0x90, 0x90, 0x20, 0x00,
0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, /*"f",70*/
0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,
0x00, 0x6B, 0x94, 0x94, 0x94, 0x93, 0x60, 0x00, /*"g",71*/
0x10, 0xF0, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00,
0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, /*"h",72*/
0x00, 0x80, 0x98, 0x98, 0x00, 0x00, 0x00, 0x00,
0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, /*"i",73*/
0x00, 0x00, 0x00, 0x80, 0x98, 0x98, 0x00, 0x00,
0x00, 0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, /*"j",74*/
0x10, 0xF0, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00,
0x20, 0x3F, 0x24, 0x06, 0x29, 0x30, 0x20, 0x00, /*"k",75*/
0x00, 0x10, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, /*"l",76*/
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,
0x20, 0x3F, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x3F, /*"m",77*/
0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00,
0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, /*"n",78*/
0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00,
0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, /*"o",79*/
0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00,
0x80, 0xFF, 0x91, 0x20, 0x20, 0x11, 0x0E, 0x00, /*"p",80*/
0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00,
0x00, 0x0E, 0x11, 0x20, 0x20, 0x91, 0xFF, 0x80, /*"q",81*/
0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00,
0x20, 0x20, 0x3F, 0x21, 0x20, 0x00, 0x01, 0x00, /*"r",82*/
0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,
0x00, 0x33, 0x24, 0x24, 0x24, 0x24, 0x19, 0x00, /*"s",83*/
0x00, 0x80, 0x80, 0xE0, 0x80, 0x80, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x10, 0x00, /*"t",84*/
0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00,
0x00, 0x1F, 0x20, 0x20, 0x20, 0x10, 0x3F, 0x20, /*"u",85*/
0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00,
0x00, 0x03, 0x0C, 0x30, 0x0C, 0x03, 0x00, 0x00, /*"v",86*/
0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80,
0x01, 0x0E, 0x30, 0x0C, 0x07, 0x38, 0x06, 0x01, /*"w",87*/
0x00, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00,
0x00, 0x20, 0x31, 0x0E, 0x2E, 0x31, 0x20, 0x00, /*"x",88*/
0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80,
0x00, 0x81, 0x86, 0x78, 0x18, 0x06, 0x01, 0x00, /*"y",89*/
0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,
0x00, 0x21, 0x30, 0x2C, 0x22, 0x21, 0x30, 0x00, /*"z",90*/
0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x02, 0x02,
0x00, 0x00, 0x00, 0x00, 0x01, 0x3E, 0x40, 0x40, /*"{",91*/
0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, /*"|",92*/
0x02, 0x02, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00,
0x40, 0x40, 0x3E, 0x01, 0x00, 0x00, 0x00, 0x00, /*"}",93*/
0x00, 0x02, 0x01, 0x02, 0x02, 0x04, 0x02, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*"~",94*/
};
13.0 主函数文件
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "IIC_Drv.h"
#include "LED.h"
#include "MyI2C.h"
#include "OLED.h"
const uint8_t Img[] =
{
0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00,
0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, /*"n",78*/
};
const uint8_t Image[] =
{
0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0xB0, 0xF0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61,
0xF9, 0x8F, 0x83, 0x01, 0xE1, 0x39, 0x0D, 0x07, 0x21, 0x21, 0x21, 0x21, 0x23, 0x22, 0x20, 0x20, 0xFE, 0x23, 0x31, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x31, 0x1F, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x08, 0x0E, 0x38, 0x60, 0x80, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*"未命名文件",0*/
};
const uint8_t Hao[] =
{
0x10, 0x10, 0xF0, 0x1F, 0x10, 0xF0, 0x00, 0x80, 0x82, 0x82, 0xE2, 0x92, 0x8A, 0x86, 0x80, 0x00, 0x40, 0x22, 0x15, 0x08, 0x16, 0x61, 0x00, 0x00, 0x40, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, /*"好",0*/
};
// const uint8_t MyChar[][32] =
// {
// 0x00, 0x80, 0x60, 0xF8, 0x07, 0x40, 0x20, 0x18, 0x0F, 0x08, 0xC8, 0x08, 0x08, 0x28, 0x18, 0x00, 0x01, 0x00, 0x00, 0xFF, 0x00, 0x10, 0x0C, 0x03, 0x40, 0x80, 0x7F, 0x00, 0x01, 0x06, 0x18, 0x00,
// /*"你",0*/
// 0x10, 0x10, 0xF0, 0x1F, 0x10, 0xF0, 0x00, 0x80, 0x82, 0x82, 0xE2, 0x92, 0x8A, 0x86, 0x80, 0x00, 0x40, 0x22, 0x15, 0x08, 0x16, 0x61, 0x00, 0x00, 0x40, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
// /*"好",1*/
// 0x20, 0x20, 0x20, 0xFE, 0x20, 0x20, 0xFF, 0x20, 0x20, 0x20, 0xFF, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x40, 0x40, 0x47, 0x44, 0x44, 0x44, 0x47, 0x40, 0x40, 0x40, 0x00, 0x00,
// /*"世",2*/
// 0x00, 0x00, 0x00, 0xFE, 0x92, 0x92, 0x92, 0xFE, 0x92, 0x92, 0x92, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x04, 0x84, 0x62, 0x1E, 0x01, 0x00, 0x01, 0xFE, 0x02, 0x04, 0x04, 0x08, 0x08, 0x00,
// /*"界",3*/
// };
extern const uint8_t ascii8x16[][16];
int main(void)
{
OLED_Init();
OLED_Clear();
// OLED_ShowChar(20, 1, 'X', 8);
// OLED_ShowString(0, 0, "helloword!", 8);
// OLED_ShowImage(0, 0, 8, 2, Img);
// OLED_ShowImage(0, 0, 8, 2, ascii8x16[4]);
// OLED_ShowImage(10, 5, 30, 4, Image);
// OLED_ShowImage(0, 0, 16, 2, Hao);
// OLED_ShowImage(20, 1, 16, 2, MyChar[3]);
OLED_ShowChinese(10, 2, "你好世界");
while (1)
{
}
}
OLED_C文件
#include "stm32f10x.h"
#include "MyI2C.h"
#include "IIC_Drv.h"
#include "Delay.h"
#include "OLED.h"
#include <string.h>
extern const uint8_t ascii8x16[][16];
typedef struct {
char Index[6];
uint8_t Data[32];
} ChineseCell_t;
const ChineseCell_t OLED_CF16x16[] = {
"你",
0x00,0x80,0x60,0xF8,0x07,0x40,0x20,0x18,0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00,
0x01,0x00,0x00,0xFF,0x00,0x10,0x0C,0x03,0x40,0x80,0x7F,0x00,0x01,0x06,0x18,0x00,/*0*/
"好",
0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,
0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,/*1*/
"世",
0x20,0x20,0x20,0xFE,0x20,0x20,0xFF,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x00,
0x00,0x00,0x00,0x7F,0x40,0x40,0x47,0x44,0x44,0x44,0x47,0x40,0x40,0x40,0x00,0x00,/*2*/
"界",
0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x00,
0x08,0x08,0x04,0x84,0x62,0x1E,0x01,0x00,0x01,0xFE,0x02,0x04,0x04,0x08,0x08,0x00,/*3*/
//...
"",
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};
// OLED发送命令
void OLED_WriteCommand(uint8_t command)
{
IIC_Start();
IIC_SendByte(0x78);
IIC_Wait_Ack();
IIC_SendByte(0x00);
IIC_Wait_Ack();
IIC_SendByte(command);
IIC_Wait_Ack();
IIC_Stop();
}
// OLED发送数据
void OLED_WriteData(uint8_t data)
{
IIC_Start();
IIC_SendByte(0x78);
IIC_Wait_Ack();
IIC_SendByte(0x40);
MyI2C_ReceiveAck();
IIC_SendByte(data);
IIC_Wait_Ack();
IIC_Stop();
}
// OLED显示位置
void OLED_SetCursor(uint8_t x, uint8_t page)
{
// 设置显示的X轴低四位
OLED_WriteCommand(0x00 | (x & 0x0F));
// 设置显示的X地址高四位
OLED_WriteCommand(0x10 | (x & 0xF0) >> 4);
// 设置显示的页地址
OLED_WriteCommand(0xB0 | page);
}
// 初始化OLED
void OLED_Init(void)
{
// 初始化IIC
IIC_Init();
Delay_ms(100);
OLED_WriteCommand(0xAE);
OLED_WriteCommand(0xD5);
OLED_WriteCommand(0x80);
OLED_WriteCommand(0xA8);
OLED_WriteCommand(0x3F);
OLED_WriteCommand(0xD3);
OLED_WriteCommand(0x00);
OLED_WriteCommand(0x40);
OLED_WriteCommand(0xA1);
OLED_WriteCommand(0xC8);
OLED_WriteCommand(0xDA);
OLED_WriteCommand(0x12);
OLED_WriteCommand(0x81);
OLED_WriteCommand(0xCF);
OLED_WriteCommand(0xD9);
OLED_WriteCommand(0xF1);
OLED_WriteCommand(0xDB);
OLED_WriteCommand(0x30);
OLED_WriteCommand(0xA4);
OLED_WriteCommand(0xA6);
OLED_WriteCommand(0x8D);
OLED_WriteCommand(0x14);
OLED_WriteCommand(0xAF);
Delay_ms(100);
}
// OLED 清屏
void OLED_Clear(void)
{
for (uint8_t j = 0; j < 8; j++)
{
OLED_SetCursor(0, j);
{
for (uint8_t i = 0; i < 128; i++)
{
OLED_WriteData(0x00);
}
}
}
}
// OLED显示字符
void OLED_ShowChar(uint8_t x, uint8_t y, char mChar, uint8_t fontSize)
{
if (fontSize == 8)
{
// 设置起始位置
OLED_SetCursor(x, y);
uint8_t i = 0;
for (i = 0; i < 8; i++)
{
// 写入数组指定行的第i个数据
OLED_WriteData(ascii8x16[mChar - ' '][i]);
}
OLED_SetCursor(x, y + 1);
for (i = 0; i < 8; i++)
{
OLED_WriteData(ascii8x16[mChar - ' '][i + 8]);
}
}
}
// OLED显示字符串
// void OLED_ShowString(uint8_t x, uint8_t y, char *string, uint8_t fontSize)
// {
// uint8_t i = 0;
// for (i = 0; string[i] != '\0'; i++)
// {
// // 每个字符对应的起始坐标等于最初的起始坐标,
// OLED_ShowChar(x + i * fontSize, y, string[i], fontSize);
// }
// }
void OLED_ShowString(uint8_t X, uint8_t Page, char *String, uint8_t FontSize)
{
for (uint8_t i = 0; String[i] != '\0'; i++)
{
OLED_ShowChar(X + i * FontSize, Page, String[i], FontSize);
}
}
// OLED显示图片
void OLED_ShowImage(uint8_t x, uint8_t y, uint8_t width, uint8_t height, const uint8_t *Image)
{
for (uint8_t j = 0; j < height; j++)
{
// 设置起始位置
OLED_SetCursor(x, y + j);
uint8_t i = 0;
for (i = 0; i < width; i++)
{
// 写入数组指定行的第i个数据
OLED_WriteData(Image[width * j + i]);
}
}
}
/**
* @brief 补充注释
* 如果高度是1也就是只有8个像素,也就是只有一页
* 那么显示一页的数据就是遍历width页就是字符的宽度个字节
* 然后显示对应的数。
* 如果高度不仅仅是1而是16,也就是代表这个字符是跨2页进行
* 写入的,那么就要再加一个for循环对第二页的数据进行写入
* 也就是第二页开始的字节然后写入【0-9】【】
*
*/
// void OLED_ShowChinese(uint8_t x, uint8_t y, char *chinese)
// {
// // 第一步:先把传递过来的汉字串,拆分为一个个独立的汉字
// char SigleChinese[4] = {0};
// uint8_t pChinese = 0;
// // 定义一个变量用于存放索引
// uint8_t pIndex;
// // 第二步:遍历汉字字模,一一匹配汉字索引
// for (uint8_t i = 0; chinese[i] != '\0'; i++)
// {
// SigleChinese[pChinese] = chinese[i];
// pChinese++;
// if (pChinese >= 3)
// {
// pChinese = 0;
// for (pIndex = 0; strcmp(OLED_CF16X16[pIndex].Index, "") != 0; pIndex++)
// {
// if (strcmp(OLED_CF16X16[pIndex].Index, SigleChinese) == 0)
// {
// break;
// }
// }
// // 第三步:取出指定位置的字模数据
// OLED_ShowImage(x + ((i + 1) / 3 - 1) * 16, y, 16, 2, OLED_CF16X16[pIndex].Data);
// }
// }
// }
void OLED_ShowChinese(uint8_t X, uint8_t Page, char *Chinese)
{
char SigleChinese[4] = {0};
uint8_t pChinese = 0;
uint8_t pIndex;
for (uint8_t i = 0; Chinese[i] != '\0'; i++)
{
SigleChinese[pChinese] = Chinese[i];
pChinese++;
if (pChinese >= 3)
{
pChinese = 0;
for (pIndex = 0; strcmp(OLED_CF16x16[pIndex].Index, "") != 0; pIndex++)
{
if (strcmp(OLED_CF16x16[pIndex].Index, SigleChinese) == 0)
{
break;
}
}
OLED_ShowImage(X + ((i + 1) / 3 - 1) * 16, Page, 16, 2, OLED_CF16x16[pIndex].Data);
}
}
}
OLED_H文件:
#ifndef _OLED_H_
#define _OLED_H_
#include <stdint.h>
// OLED初始化
void OLED_Init(void);
// OLED发送命令
void OLED_WriteCommand(uint8_t command);
// OLED发送数据
void OLED_WriteData(uint8_t data);
// OLED显示位置
void OLED_SetCursor(uint8_t x, uint8_t page);
// OLED 清屏
void OLED_Clear(void);
// OLED显示字符
void OLED_ShowChar(uint8_t x, uint8_t y, char mChar, uint8_t fontSize);
// OLED显示图片
void OLED_ShowImage(uint8_t x, uint8_t y, uint8_t width, uint8_t height, const uint8_t *Image);
// void OLED_ShowChinese(uint8_t x, uint8_t y, char *chinese);
void OLED_ShowChinese(uint8_t X, uint8_t Page, char *Chinese);
void OLED_ShowString(uint8_t X, uint8_t Page, char *String, uint8_t FontSize);
#endif
编译以上程序输出如下结果:
...