以oled为例子讲解硬件IIC和软件IIC
一、硬件IIC
IIC结构体
typedef struct
{
uint32_t I2C_ClockSpeed; 时钟速度
uint16_t I2C_Mode; 模式
uint16_t I2C_DutyCycle;
uint16_t I2C_OwnAddress1; 主机地址
uint16_t I2C_Ack; 应答位
uint16_t I2C_AcknowledgedAddress;
}I2C_InitTypeDef;
通过时序电路通过库函数发送字节
void I2C_WriteByte(uint8_t addr,uint8_t data)
{
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); //检查总线是否繁忙
I2C_GenerateSTART(I2C1, ENABLE); //开启IIC
while( !I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //主模式
I2C_Send7bitAddress(I2C1,OLED_ADDRESS, I2C_Direction_Transmitter); //发送器件地址
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1, addr); //发送地址
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING));
I2C_SendData(I2C1, data); //发送数据
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING));
I2C_GenerateSTOP( I2C1, ENABLE); //关闭总线
}
写命令
void WriteCmd(unsigned char I2C_Command)
{
I2C_WriteByte(0X00,I2C_Command);
}
写数据
void WriteDat(unsigned char I2C_Data)
{
I2C_WriteByte(0x40,I2C_Data);
}
完成了IIC的配置和收发就可以对OLED配置了
配置采用厂商提供的代码
//OELD初始化
void OLED_Init(void)
{
delay_ms(100);
WriteCmd(0xAE); //display off
WriteCmd(0x20); //Set Memory Addressing Mode
WriteCmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
WriteCmd(0xb0); //Set Page Start Address for Page Addressing Mode,0-7
WriteCmd(0xc8); //Set COM Output Scan Direction
WriteCmd(0x00); //---set low column address
WriteCmd(0x10); //---set high column address
WriteCmd(0x40); //--set start line address
WriteCmd(0x81); //--set contrast control register
WriteCmd(0xff); //ÁÁ¶Èµ÷½Ú 0x00~0xff
WriteCmd(0xa1); //--set segment re-map 0 to 127
WriteCmd(0xa6); //--set normal display
WriteCmd(0xa8); //--set multiplex ratio(1 to 64)
WriteCmd(0x3F); //
WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
WriteCmd(0xd3); //-set display offset
WriteCmd(0x00); //-not offset
WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency
WriteCmd(0xf0); //--set divide ratio
WriteCmd(0xd9); //--set pre-charge period
WriteCmd(0x22); //
WriteCmd(0xda); //--set com pins hardware configuration
WriteCmd(0x12);
WriteCmd(0xdb); //--set vcomh
WriteCmd(0x20); //0x20,0.77xVcc
WriteCmd(0x8d); //--set DC-DC enable
WriteCmd(0x14); //
WriteCmd(0xaf); //--turn on oled panel
}
通过汉子提取软件提取文字
在demo里编写显示汉子函数
void ShowCN(unsigned char x,unsigned char y,unsigned char N)
{
unsigned char i;
unsigned int addr = 32*N;
if(x>112)
{
x= 0;
y++;
}
OLED_SetPos(x,y);
for(i=0;i<16;i++)
{
WriteDat( F16X16[addr+i] );
}
OLED_SetPos(x,y+1);
for(i=0;i<16;i++)
{
WriteDat( F16X16[addr+i+16] );
}
}