oled显示图片,128x64(图片可自己创建)
#include "reg52.h"
#include "intrins.h"
sbit SCL=P0^1;
sbit SDA=P0^3;
void iic_start()
{
SCL=0;//防止雪花,残留数据出现
SDA=1;
SCL=1;
_nop_();
SDA=0;
_nop_();
}
void iic_stop()
{
SCL=1;
SDA=0;
_nop_();
SDA=1;
_nop_();
}
char iic_ack()
{
char flag;
SDA=1;//在时钟脉冲9期间释放数据线
_nop_();
SCL=1;
_nop_();
flag=SDA;
_nop_();
SCL=0;
_nop_();
return flag;
}
void iic_send_byte(char datasend)
{
int i;
for(i=0;i<8;i++){
SCL=0;//拉低,做好数据准备
SDA=datasend &0x80;//获取数据的高位
_nop_();//发送数据建立时间
SCL=1;//拉高传输数据
_nop_();
SCL=0;//发送完1bit数据,手动拉低
_nop_();
datasend=datasend<<1;
}
}
void Oled_Write_Cmd(char data_cmd)
{
iic_start();
iic_send_byte(0x78);//发送从机地址
iic_ack();
iic_send_byte(0x00);//写命令0000 0000
iic_ack();
iic_send_byte(data_cmd);//写入命令
iic_ack();
iic_stop();
}
void Oled_Write_Data(char data_data)
{
iic_start();
iic_send_byte(0x78);
iic_ack();
iic_send_byte(0x40);//写数据0100 0000
iic_ack();
iic_send_byte(data_data);//写入数据
iic_ack();
iic_stop();
}
void Oled_Clean()
{
int i;
int j;
for(i=0;i<8;i++){
Oled_Write_Cmd(0xB0+i);
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0x10);
for(j=0;j<128;j++){
Oled_Write_Data(0);
}
}
}
void oled_init(void)
{
Oled_Write_Cmd(0xAE);//--display off
Oled_Write_Cmd(0x00);//---set low column address
Oled_Write_Cmd(0x10);//---set high column address
Oled_Write_Cmd(0x40)