7.2.4 I2C驱动程序

 

#define OLED_CMD 0 //写命令

#define OLED_DATA 1 //写数据

 

//延时

void IIC_delay(void)

{

u16 t=90;

while(t--);

}

 

//起始信号

void I2C_Start(void)

{

OLED_SDA_Set();

OLED_SCL_Set();

IIC_delay();

OLED_SDA_Clr();

IIC_delay();

OLED_SCL_Clr();

IIC_delay();

}

 

//结束信号

void I2C_Stop(void)

{

OLED_SDA_Clr();

OLED_SCL_Set();

IIC_delay();

OLED_SDA_Set();

}

 

//等待信号响应

void I2C_WaitAck(void) //测数据信号的电平

{

OLED_SDA_Set();

IIC_delay();

OLED_SCL_Set();

IIC_delay();

OLED_SCL_Clr();

IIC_delay();

}

 

//写入一个字节

void Send_Byte(u8 dat)

{

u8 i;

for(i=0;i<8;i++)

{

if(dat&0x80)//将dat的8位从最高位依次写入

{

OLED_SDA_Set();

}else{

OLED_SDA_Clr();

}

IIC_delay();

OLED_SCL_Set();

IIC_delay();

OLED_SCL_Clr();//将时钟信号设置为低电平

dat<<=1;

}

}

 

//发送一个字节

//mode:数据/命令标志 0,表示命令;1,表示数据;

void OLED_WR_Byte(u8 dat,u8 mode)

{

I2C_Start();

Send_Byte(0x78);

I2C_WaitAck();

if(mode){Send_Byte(0x40);}

else{Send_Byte(0x00);}

I2C_WaitAck();

Send_Byte(dat);

I2C_WaitAck();

I2C_Stop();

}

//OLED的初始化

void OLED_Init(void)

{

IIC_Init();

 

OLED_RES_Clr();

delay_ms(200);

OLED_RES_Set();

OLED_WR_Byte(0xAE,OLED_CMD); //Display Off

OLED_WR_Byte(0xD5,OLED_CMD); //SET DISPLAY CLOCK

OLED_WR_Byte(0x80,OLED_CMD); //105HZ

OLED_WR_Byte(0xA8,OLED_CMD); //Select Multiplex Ratio

OLED_WR_Byte(0x3F,OLED_CMD); //Default => 0x3F (1/64 Duty)

OLED_WR_Byte(0xD3,OLED_CMD); //Setting Display Offset

OLED_WR_Byte(0x00,OLED_CMD); //00H Reset

OLED_WR_Byte(0x40,OLED_CMD); //Set Display Start Line

OLED_WR_Byte(0x8D,OLED_CMD); //Set Charge Pump

//OLED_WR_Byte(0x10,OLED_CMD);//Disable Charge Pump

OLED_WR_Byte(0x14,OLED_CMD); //Enable Charge Pump

OLED_WR_Byte(0xAD,OLED_CMD); // Internal IREF Setting

OLED_WR_Byte(0x20,OLED_CMD); // Disable internal IREF

//OLED_WR_Byte(0x30,OLED_CMD);// Enable internal IREF

OLED_WR_Byte(0xA1,OLED_CMD); //Set Segment Re-Map Default

OLED_WR_Byte(0xC8,OLED_CMD); //Set COM Output Scan Direction

OLED_WR_Byte(0xDA,OLED_CMD); //Set COM Hardware Configuration

OLED_WR_Byte(0x12,OLED_CMD); //Alternative COM Pin

OLED_WR_Byte(0x81,OLED_CMD); //Set Contrast Control

OLED_WR_Byte(0XCF,OLED_CMD);

OLED_WR_Byte(0xD9,OLED_CMD); //Set Pre-Charge period

OLED_WR_Byte(0xF1,OLED_CMD);

OLED_WR_Byte(0xDB,OLED_CMD); //Set Deselect Vcomh level

OLED_WR_Byte(0x30,OLED_CMD);

OLED_WR_Byte(0xA4,OLED_CMD); //Entire Display ON

OLED_WR_Byte(0xA6,OLED_CMD); //Set Normal Display

//Clear_Ram();

OLED_WR_Byte(0xAF,OLED_CMD); //Display ON

}

void lcd_addr(unsigned char page,unsigned char column)

{

column=column-1; //我们平常所说的第 1 列,在 LCD 驱动 IC 里是第 0 列。所以在这里减去 1.

page=page-1;

//设置页地址。每页是 8 行。一个画面的 64 行被分成 8 个页。我们平常所说的第 1 页,在 LCD 驱动IC 里是第 0 页,所以在这里减去 1

OLED_WR_Byte(0xb0+page,OLED_CMD);

OLED_WR_Byte(((column>>4)&0x0f)+0x10,OLED_CMD); //设置列地址的高 4 位

OLED_WR_Byte(column&0x0f,OLED_CMD); //设置列地址的低 4 位

}

//全屏清屏

void full_display(unsigned short color)

{

unsigned char data1,data2, i,j;

data1 = color >> 8;

data2 = color;

for(i=0;i<8;i++)

{

lcd_addr(i+1,1);

for(j=0;j<64;j++)

{

OLED_WR_Byte(data1, OLED_DATA);

OLED_WR_Byte(data2, OLED_DATA);

}

}

}

uint8_t OLED_GRAM1[128][8];

 

//更新显存到OLED

void OLED_Refresh(void)

{

u8 i,n;

for(i=0;i<8;i++)

{

OLED_WR_Byte(0xb0+i,OLED_CMD); //设置行起始地址

OLED_WR_Byte(0x00,OLED_CMD); //设置低列起始地址

OLED_WR_Byte(0x10,OLED_CMD); //设置高列起始地址

I2C_Start();

Send_Byte(0x78);

I2C_WaitAck();

Send_Byte(0x40);

I2C_WaitAck();

for(n=0;n<128;n++)

{

Send_Byte(OLED_GRAM[n][i]);

I2C_WaitAck();

}

I2C_Stop();

}

}

//画点

//x:0~127

//y:0~63

//t:1 填充 0,清空

void OLED_DrawPoint(u8 x,u8 y,u8 t)

{

u8 i,m,n;

i=y/8;

m=y%8;

n=1<<m;

if(t){OLED_GRAM[x][i]|=n;}

else

{

OLED_GRAM[x][i]=~OLED_GRAM[x][i];

OLED_GRAM[x][i]|=n;

OLED_GRAM[x][i]=~OLED_GRAM[x][i];

}

OLED_Refresh();//更新显示

}

 

下一页
上一页
    • 联系电话

    • 0755—83453881
    • 服务时间

    • 周一至周五 9:00-18:00
    • 高通GT-HMI交流群