OLED即有机发光管(Organic Light-Emitting Diode,OLED)。OLED显示技术具有自发光、广视角、几乎无穷高的对比度、较低功耗、极高反应速度、可用于绕曲性面板、使用温度范围广、构造及制程简单等有点,被认为是下一代的平面显示屏新兴应用技术。
OLED显示和传统的LCD显示不同,其可以自发光,所以不需要背光灯,这使得OLED显示屏相对于LCD显示屏尺寸更薄,同时显示效果更优。
常用的oled 一般都是 0.96寸 128*64个像素点的 简单了解就行了
1 模块尺寸:23.7 *23.8mm
2 电源电压:3.3-5.5V
3 驱动芯片:SSD1306
4 测试平台:提供 k60/k10,9s12XS128,51,stm32,stm8等单片机。
SSD1306 把像素为 128*64 我们按列行式规则来说 有128列 64行 64行又分成了8列 一列有8行 这玩意很多说法 确实要好好体会
==序号0 命令 0x81 设置亮度 == 值越大就越亮 值为最后一位 A[6:0]
==序号1 命令 0xAE/0xAF 关与不关显示 ==
==序号2 命令 0x8d 关闭电荷泵 == 这个名词不需要纠结来由 用就完事了
==序号3 命令 0xb0-0xb7 设置页地址 == 对应 0-7 页
==序号4 命令 0x00-0x0F 设置列的低四位 ==
==序号4 命令 0x10-0x1F 设置列的高四位 ==
注意 图一 的参数
IIC通讯协议是飞利浦公司开发的 引脚少 硬件实现简单,不需要UASRT CAN的 外部收发设备。
他是支持多设备的总线 。总线就是多个设备共用信号线 可连接多个iic通信设备
支持多个通信主机及通信从机
一个 iic只有 两个线路 1是 SCL SCL 就是时钟 ,用于数据收发同步
2 是SDA 表示数据 也就是数据线
硬件iic 对应芯片的外设 引脚是固定的 使用的iic管教也是固定的
软件 iic 引脚灵活 一般用于控制管教状态及模拟iic通信波形
明显的区别
硬件iic通信速度快 软件iic的引脚灵活
区分
硬件iic 用法 复杂 软件IIC 流程更清楚
硬件iic 速度更快
软件iic 接口 灵活
提醒 : 下面开始最重要的内容 很重要
IIC协议层 定义了 通信的起始信号 停止信号 数据有效性 响应 仲裁 时钟同步和地址广播等等
1 IIC 的基本读写过程
主机写数据到从机
S:相当于是一个起始地址
从机地址 起始信号产生以后 ,所有的从机就接下来广播地址信号 。
IIC 总线 ,每个设备地址都是唯一的 。当主机的广播地址和某个从机地址相同时,
设备就被选中了 ,没被选中的就忽略数据信号。
我举个例子
刚好今天第一节是数字课 老师说开始点名了 结果你被选中 而你就是 从机
你站的位置就是从机地址 老师就是主机 老师站的位置就是主机地址 而其他同学老师就忽略了
选择传输方向 :0:表示从主机传输数据到从机 1:相反
应答信号 :只有从机应答了 主机才能继续发送数据
你被选中了 却一句都不回答 老师也没办法。
SCL SDA 同时处于 高电平 就是空闲状态 输出场效应管处在截止状态
释放总线 用上拉电阻把两条信号线 初始化电平拉高
SCL 处于 高电平期间 SDA 是1 --0的跳变; 注意不是一个电平信号
3 停止信号
SCL 处于 高电平期间 SDA 是0--1的跳变; 注意不是一个电平信号
开始和停止信号 都由主机产生
发送器每发送一个字节 在第九个脉冲前释放总线 也就是 结束传输
最后到接收器反馈一个应答信号 ,应答信号 为低电平 就可以认为是有效应答位
表示接收器成功接收该字节了 相反就是没有成功。
对于ack应答位要求
接收在第九个脉冲之前必须释放总线 马上把数据总线拉低
确保 该时钟的高电平期间为稳定低电平。
5 数据有效性
数据在SCL的上升沿来之前就需要准备好 并且在下降压之前 数据一定要稳定
6 数据传输
在SCL时钟的配合下 SDA 传输数据 。数据位的输出时边沿触发
边沿触发无非 两种 :0---1 (上升沿触发) 1-0 (下降沿触发)
1)硬件实现 协议
只要配置好该外设 他就会自动根据协议产生通讯信号 ,收发数据并缓存起来
这种硬件iic协议减轻了 CPU工作 设计比较简单。
STM32 IIC 支持 100KBIT/S 400KBITS/S 的速率 支持 7位 10位设备地址。
2 时钟控制逻辑
SCL 的时钟线 由iic接口根据 CCR控制寄存器控制 控制参数的主要位的时钟频率
选择 标志模式 或 快速模式 分别对应 100/400kbits/s 的速率
时钟占空比
标准:T(low)/T(high)=2
快速 :T(low)/T(high)=16/9 =2.0111
其实都差不多
计算 时钟频率
标准模式
Thigh=CCR*Tpck1 , Tlow=CCR*Tpclk1
标准模式 Tlow/Thigh=2
Thigh=CCR*Tpck1 , Tlow=2*CCR*Tpclk1
快速模式 Tlow/Thigh=16/9
Thigh=9*CCR*Tpck1 , Tlow=16*CCR*Tpclk1
3 数据控制逻辑
IIC 的SDA 信号 主要连接到 数据移位寄存器上,数据移位寄存器来源和目标主要是
数据寄存器(DR)地址寄存器 (OAR) PEC寄存器 以及SDA数据线
当向外发送数据时候,数据移位寄存器以“数据寄存器”为数据来源 把数据一个字节一个字节通过SDA 发送出去。
而相反的话 就是把接收到的数据存到“数据寄存器”里面。
控制产生起始信号(s)当发生起始信号之后 产生EV5事件 并对SR1寄存器的SB1位置 1
表示完成起始信号了
发生设备地址 并等待 应答信号 ,如果有应答信号产生 ,则会产生时间EV6和EV8 并且对应的寄存器位ADDR=1 表示已经发送了,TEX:接收 也就是 主机停止发送数据了 从机停止接收。
1)结构体
typedef struct
{
uint32_t I2C_ClockSpeed;//设置SCL 频率
uint16_t I2C_Mode; //工作模式
uint16_t I2C_DutyCycle;//占空比
uint16_t I2C_OwnAddress1;//IIC设备地址
uint16_t I2C_Ack; //应答使能
uint16_t I2C_AcknowledgedAddress; //地址长度 7或10
}I2C_InitTypeDef;
结构体参数配置注意事项
uint32_t I2C_ClockSpeed;//设置SCL 频率
在调用初始化函数时 函数会根据我们输入的参数 经过运算把 时钟因子写入 IIC 的CCR
寄存器 而我们 写入的参数不得高于 400khz
uint16_t I2C_Mode; //工作模式
iic不需要 在此处 区分 主从模式
结构体参数 配置
void oled_Structconfig(void)
{
GPIO_InitTypeDef GPIO_I2CInitStruct;
I2C_InitTypeDef I2C_InitStruct;
//RCC
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
//GPIO PB6--SCL, PB7---SDA
GPIO_I2CInitStruct.GPIO_Mode =GPIO_Mode_AF_OD;
GPIO_I2CInitStruct.GPIO_Pin =GPIO_Pin_6|GPIO_Pin_7;
GPIO_I2CInitStruct.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_I2CInitStruct);
I2C_DeInit(I2C1);
I2C_InitStruct.I2C_Ack =I2C_Ack_Enable;
I2C_InitStruct.I2C_AcknowledgedAddress =I2C_AcknowledgedAddress_7bit;
I2C_InitStruct.I2C_ClockSpeed =400000;
I2C_InitStruct.I2C_Mode =I2C_Mode_I2C;
I2C_InitStruct.I2C_DutyCycle =I2C_DutyCycle_2;
I2C_InitStruct.I2C_OwnAddress1 =0x30;
I2C_Init(I2C1,&I2C_InitStruct);
I2C_Cmd(I2C1, ENABLE);
}
写入一个字节
//дÈëÒ»¸ö×Ö½Ú
void Write_databyte(uint16_t addr,uint16_t data)
{
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));//µÈ´ýÊÇ·ñ·±Ã¦
I2C_GenerateSTART(I2C1,ENABLE);//ÆðʼÐźÅ
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));//ÅжÏÊÇ·ñ ÒѾÍê³ÉÆðʼÐźŠ¾ÍÊÇ°Ñ EV5µÄ sb1 ÖÃÒ»
I2C_Send7bitAddress(I2C1,0X78,I2C_Direction_Transmitter);//·¢ËÍ·½Ïò ºÍ 0ledµÄµØÖ·
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//ÅжÏÊÇ·ñ·¢ËÍÍê³É ¾ÍÊÇ°ÑEV6 µÄaddÖÃÒ»
// I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED
I2C_SendData(I2C1, addr); //·¢ËͼĴæÆ÷µØÖ· ¾ÍÊÇ°Ñ EV8µÄÏà¶Ô¼Ä´æÆ÷ ÖÃÒ»
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTING)); //·¢ËÍÊý¾Ý ¾ÍÊÇ°Ñ EV8µÄÏà¶Ô¼Ä´æÆ÷ ÖÃÒ»
//I2C_EVENT_MASTER_BYTE_TRANSMITTING
I2C_SendData(I2C1, data);//·¢ËÍÊý¾Ý
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTING));
I2C_GenerateSTOP(I2C1,ENABLE);//Í£Ö¹·¢ËÍ
}
写命令
void WriteCmd(unsigned char cmoodcmd)
{
Write_databyte(0x00,cmoodcmd);
}
写数据
void WriteDATA(unsigned char ic2data)
{
Write_databyte(0x40,ic2data);
}
起始坐标
void Starting_point(unsigned char x,unsigned char y)
{
WriteCmd(0xb0+y);//YµÄ×ø±ê
WriteCmd((x&0xf0)>>4|0x10); //1111 0000 ->0000 1111|0X10=0001 1111
WriteCmd((x&0x0f)|0x01);//0000 1111 | 0000 0001 =0000 1111
}
全屏填充
void oled_fill(unsigned char Flii_data)
{
unsigned char m,n;
for(m=0;m<9;m++)
{
WriteCmd(0xb0+m);
WriteCmd(0x00);
WriteCmd(0x10);
for(n=0;n<128;n++)
{
WriteDATA(Flii_data);
}
}
}
清屏
void oled_Clear(void)
{
oled_fill(0x00);
}
屏幕全亮
void OLED_CN(void)
{
WriteCmd(0X8D);//设置电荷泵
WriteCmd(0X14);//开电荷泵
WriteCmd(0XAF);//开显示
}
屏幕全灭
void OLED_OFF(void)
{
WriteCmd(0X8D);//设置电荷泵
WriteCmd(0X10);//开电荷泵
WriteCmd(0XAE);//开显示
}
oled 初始化
void oled_init(void)
{
delay_ms(1000);
WriteCmd(0xAE); //display off
WriteCmd(0x20); //Set Memory Addressing Mode
WriteCmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
WriteCmd(0xb0); //Set Page Start Address for Page Addressing Mode,0-7
WriteCmd(0xc8); //Set COM Output Scan Direction
WriteCmd(0x00); //---set low column address
WriteCmd(0x10); //---set high column address
WriteCmd(0x40); //--set start line address
WriteCmd(0x81); //--set contrast control register
WriteCmd(0xff); //ÁÁ¶Èµ÷½Ú 0x00~0xff
WriteCmd(0xa1); //--set segment re-map 0 to 127
WriteCmd(0xa6); //--set normal display
WriteCmd(0xa8); //--set multiplex ratio(1 to 64)
WriteCmd(0x3F); //
WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
WriteCmd(0xd3); //-set display offset
WriteCmd(0x00); //-not offset
WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency
WriteCmd(0xf0); //--set divide ratio
WriteCmd(0xd9); //--set pre-charge period
WriteCmd(0x22); //
WriteCmd(0xda); //--set com pins hardware configuration
WriteCmd(0x12);
WriteCmd(0xdb); //--set vcomh
WriteCmd(0x20); //0x20,0.77xVcc
WriteCmd(0x8d); //--set DC-DC enable
WriteCmd(0x14); //
WriteCmd(0xaf); //--turn on oled panel
}
显示字符
void OLED_showstr(unsigned char x,unsigned char y,unsigned char ch[],unsigned temp)
{
unsigned char c=0;
unsigned char i=0;
unsigned char j=0;
switch(temp)
{
case 1:
{
while( ch[j] != '\0')
{
c = ch[j]-32;
if(x>126)
{
x=0;
y=y+1;
}
Starting_point(x,y); //坐标
for(i=0;i<6;i++) //6*8 列行式 列产生 行 列又有行 行就是行
//一行有6列 (列产生行 有列才有行)
// 一列有 8行
//行就是行
WriteDATA(F6x8[c][i]); //(F6x8[c][i]);
//的二维数组的[C][i] C是行 i是列 *********
//一行有6列 (列产生行 有列才有行)
//i 就是 列
x+=6; //就算偏移了6个位置 还是会到下一个十六进制
j=j+1; // 偏移到一个位置
}
}break;
case 2:
{
while( ch[j] != '\0')
{
c = ch[j]-32;
if(x>126)
{
x=0;
y=y+1;
}
Starting_point(x,y);
for(i=0;i<8;i++)
WriteDATA(F8X16[c*16+i]);
Starting_point(x,y+1);
for(i=0;i<8;i++)
WriteDATA(F8X16[c*16+i+8]);
x+=8;
j=j+1;
}
}break;
}
}
主函数
#include "stm32f10x.h"
#include "oled.h"
#include "led.h"//µ÷ÊÔ
extern const unsigned char gImage_LU[1022];
void main(void)
{
unsigned int i;
NVIC_Configuration();
delay_init(); //更新数据
oled_Structconfig();
oled_init();
oled_fill(0XFF);//ÆÁÄ»µãÁÁ
delay_ms(2000);
oled_fill(0X00);//ÆÁÄ»Ãð
delay_ms(2000);
OLED_showstr(0,1,"mou mou jiao yu",1);//6*8
OLED_showstr(1,2,"mou mou jiao yu",2);//8*16
while(1)
{
}
}
取模 #include “oledfront.h”
#ifndef __oledfront_H
#define __oledfront_H
const unsigned char F6x8[][6] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp
0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !
0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "
0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #
0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $
0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %
0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &
0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '
0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (
0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )
0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *
0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +
0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,
0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -
0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .
0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /
0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1
0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2
0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3
0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4
0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5
0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7
0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8
0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9
0x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :
0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;
0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <
0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =
0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >
0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?
0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @
0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A
0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B
0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C
0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D
0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E
0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F
0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G
0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H
0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I
0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J
0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K
0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L
0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M
0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N
0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O
0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P
0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R
0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S
0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T
0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U
0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V
0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W
0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X
0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y
0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z
0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [
0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 55
0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]
0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^
0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _
0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '
0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a
0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b
0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c
0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d
0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e
0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f
0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g
0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h
0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i
0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j
0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k
0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l
0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m
0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n
0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o
0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p
0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q
0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r
0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s
0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t
0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u
0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v
0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w
0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x
0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y
0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z
0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines
};
#endif