#include <reg52.h>
#define OLED_CMD 0 //写命令
#define OLED_DATA 1 //写数据
#define OLED_MODE
sbit IIC_CLK = P4^3;
sbit IIC_DATA = P4^0;
void OLED_Clear (void);
void OLED_Set_Pos(unsigned char x, unsigned char y);
void OLED_WR_Byte(unsigned char dat, unsigned char cmd);
void OLED_WritrDate(unsigned char dat);
void OLED_WriteCommand(unsigned char dat);
void IIC_Start(void);
void IIC_Stop(void);
unsigned char IIC_Wait_Ack(void);
void Write_IIC_Byte(unsigned char IIC_Byte);
void main (void)
{
while(1)
{
OLED_Clear ();
}
}
void OLED_Clear (void)
{
unsigned char i, n;
for (i = 0; i <8; i++)
{
OLED_Set_Pos(0, i);
for (n =0; n<128; n++)OLED_WR_Byte(0x00, OLED_DATA);
}
}
void OLED_Set_Pos(unsigned char x, unsigned char y)
{
OLED_WR_Byte(0xb0+y,OLED_CMD);
OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);//高地址
OLED_WR_Byte((x&0x0f),OLED_CMD); //低地址
}
void OLED_WR_Byte(unsigned char dat, unsigned char cmd)
{
if (cmd == OLED_DATA)
OLED_WritrDate(dat);
else
OLED_WriteCommand(dat);
}
void OLED_WritrDate(unsigned char dat)
{
IIC_Start();
Write_IIC_Byte (0x78);
IIC_Wait_Ack();
Write_IIC_Byte(0x40);//数字寄存器
IIC_Wait_Ack();
Write_IIC_Byte(dat);
IIC_Wait_Ack();
IIC_Stop();
}
void OLED_WriteCommand(unsigned char dat)
{
IIC_Start();
Write_IIC_Byte (0x78);
IIC_Wait_Ack();
Write_IIC_Byte(0x00);//命令寄存器
IIC_Wait_Ack();
Write_IIC_Byte(dat);
IIC_Wait_Ack();
IIC_Stop();
}
void IIC_Start(void)
{
IIC_CLK = 1;
IIC_DATA = 1;
//delay();
IIC_DATA = 0;
//delay();
IIC_CLK = 0;
//delay();
}
void IIC_Stop(void)
{
IIC_DATA = 0;
//delay();
IIC_CLK = 1;
//delay();
IIC_DATA = 0;
//delay();
}
unsigned char IIC_Wait_Ack(void)
{
unsigned char ucErrTime=0;
IIC_DATA=1; //准备、待拉低
//_nop_();_nop_();
IIC_CLK=1;
//_nop_();_nop_();
while(IIC_DATA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
//SendString("ERORR\n");
return 1;
}
}
IIC_CLK=0;
//delay();
return 0;
}
void Write_IIC_Byte(unsigned char IIC_Byte)
{
unsigned char i;
unsigned char m,da;
da=IIC_Byte;
//IIC_CLK = 0;
for(i=0;i<8;i++)
{
//delay();
m=da&0x80;
if(m==0x80)
{
IIC_DATA = 1;
}
else IIC_DATA = 0;
da=da<<1; //移往下一位
//delay();
IIC_CLK = 1; //开始传输
//delay();
IIC_CLK = 0; //传输完毕
}
}
|