OLED写命令
#include "reg52.h"
#include "intrins.h"
sbit sc1 = P0^1;
sbit sda = P0^3;
void IIC_Start()
{
sda = 1;
sc1 = 1;
_nop_();
sda = 0;
_nop_();
}
void IIC_Stop()
{
sda = 0;
sc1 = 1;
_nop_();
sda = 1;
_nop_();
}
char IIC_ACK()
{
char flag;
sda = 1;
_nop_();
sc1 = 1;
flag = sda;
_nop_();
sc1 = 0;
_nop_();
return flag;
}
void IIC_Send_Byte(char dataSend)
{
int i;
for(i = 0; i < 8; i++){
sc1 = 0; //scl拉低,让sda做好数据准备
sda = dataSend & 0x80; //1000 0000获得dataSend的最高位,给sda
_nop_();
sc1 = 1;
_nop_();
sc1 = 0;
_nop_();
dataSend = dataSend << 1;
}
}
void Oled_Write_Cmd(char dataCmd)
{
// 1. start()
IIC_Start();
// 2. 写入从机地址 b0111 1000 0x78
IIC_Send_Byte(0x78);
// 3. ACK
IIC_ACK();
// 4. cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据
IIC_Send_Byte(0x00);
// 5. ACK
IIC_ACK();
// 6. 写入指令/数据
IIC_Send_Byte(dataCmd);
// 7. ACK
IIC_ACK();
// 8. STOP
IIC_Stop();
}
void Oled_Write_Data(char dataData)
{
// 1. start()
IIC_Start();
// 2. 写入从机地址 b0111 1000 0x78
IIC_Send_Byte(0x78);
// 3. ACK
IIC_ACK();
// 4. cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据
IIC_Send_Byte(0x00);
// 5. ACK
IIC_ACK();
// 6. 写入指令/数据
IIC_Send_Byte(dataData);
// 7. ACK
IIC_ACK();
// 8. STOP
IIC_Stop();
}
void main()
{
IIC_Start();
}
OLED的寻址模式
如何显示一个点?
有三种,分别位页地址模式,水平地址模式和垂直地址模式,可以通过一下表格进行配置
内存管理
水平地址模式
列地址选择
如果写入0x08(b00001000)会显示什么呢
一个字节负责一个Page的一列显示