思路分析
1.初始化
2.显示位置
3.显示内容
IIC的相关内容
IIC的上拉电阻 把scl和sda 拉成高电平
IIC的速率
如果是标准模式速度为(100kb/s) 在一个周期内(10us 1/100000)绿色框起来 传输一个位 一个bit的数据 要是想传一个字节的数据 就再八个周期里完成
1.初始化
把OLED看成是12864个LED组成
把led人为的分为两个部分
1.12864的led灯
2. 128*64的表格 要是往表格中写入1 对应的第一部分的led就亮
3.
在每一个单元格中写1对应的led灯就亮
举例;在屏幕的任意位置显示一个点 要显示数字,字符 汉字图形 这些图案的基本组成单元都是点
1.初始化
第一个iic的初始信号 start
IIC开始信号 第二步承接地址
高七位 最后一位b0 b0为1就是读取 为0就是写(发送)这里我们要写入就是0 转化成16进制
这里就是
第三步.经过slave address后到达ack 回复一个ack信号
第四步
c0为0表示发送字节(数据字节) D/C为0表示发送命令 为1表示发送数据 这里我们要发送命令故为0
后面都为0
同样 在赋值完control byte 后还需要一个ack应答信号
第四步
在contro byte 完成后 ack应答信号完成后 进入data byte 字节 写入命令 这里要写入的命令是cmd
同样写完一个data byte后要写入一个ack应答信号 最后是IIC的停止 Stop
整个初始化的命令函数为
同理发送数据的函数如下
2.显示位置
之前说过 把OLED人为的分为两部分 1是带有12864个的led 2是一个12864的单元表格 表格中每一个单元格对应着以一个小led灯 为0就灭 为1就亮
表格如图所示 令0-7行为page 8-14行为page1 每个8行都取名page 一共有64行 所以一共有page0-page7 那么这样就可以便于分一个字节
写一个0x08进去 可能对应的oled的 col0的第四个led就亮(转化为二进制去看)如果再次写入一个0x08进去可能是想下或向有的第二行或第一列的led灯亮
如图 再写入一个0x08可能是向右边一列 或向下一行
这里我们以向右为例子 一直写入0x08则一行的led灯都亮起来 那到底是向右边还是向下 就涉及的了寻址模式
寻址模式
这里我们选用页寻址模式
确定第几列 col 然后要写入到的数据
确定页寻址模式 page模式 就是要选中page
说明书上的page模式 最高四位1011(对应的16进制为b) 后面四位就是选取page 0xb0就是选取page0
0xb0+i i=0就是选取page0 i=1就是选取page1 依次选取
选定page之后 选定第几列 (不细说)
然后写入数据
点的显示完成了 要实现字符 汉字之类的要借助字模工具
IIC代码的模拟
#include "IIC.h"
#include "reg52.h"
#include "main.h"
#include "Delay.h"
#include "reg52.h"
void IIC_Start()
{
IIC_SCL=1;//模拟iic的起始拉高
IIC_SDA=1;
Delay5us();
IIC_SDA=0;
Delay5us();
IIC_SCL=0;
}
void IIC_Stop()//模拟iic的停止
{
IIC_SCL=1;
IIC_SDA=0;
Delay5us();
IIC_SDA=1;
Delay5us();
}
void IIC_Write_byte(unsigned char byte)//模拟iic的写入数据
{
unsigned char i;
for(i=0;i<8;i++)
{
byte<<1;
IIC_SDA=CY;//传进来的byte数据左移一位 把最高位丢掉 cy就是把最高位拿回给IIC_SDA
IIC_SCL=1;
Delay5us();
IIC_SCL=0;
Delay5us();
}
IIC_SCL=1;//模仿IIC的应答
Delay5us();
IIC_SCL=0;
Delay5us();
}