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();//更新显示
}
-
- GT-HMI Designer用户手册
- GT-HMI Engine用户手册
- 高通字库芯片开发资料
- GTDB-X7ESP高通智匠AI开发板规格书
- GTC-480480TFT40XP模块使用手册
- GTC-480272TFT43XP模块使用手册
- GTC-800480TFT50G模块使用手册
- GTC-800480TFT70GP模块使用手册
- GTC-1024600TFT101GP模块使用手册
- GT-GUI LCD 1.9寸液晶模组数据手册
- GT-GUI LCD 2.8寸液晶模组数据手册
- GT-GUI LCD 3.5寸液晶模组数据手册
- GT-GUI LCD 7.0寸液晶模组数据手册
- GUI-LCD开发板使用手册
- GT5GL128B标准GUI芯片规格书
- GT5GL64芯片产品规格书
高通字库交流群
GT-HMI交流群