#include "bsp_ht16c22.h"
static u8 HT16C22_Address=0x7e; //器件地址
static u32 TimeOut=0; //超时计时
static void HT16C22_GPIO_Config(void);
void HT16C22_Init(void)
{
u8 ReadStr[2];
I2C_InitTypeDef I2C_InitStructure;
HT16C22_GPIO_Config();
UserDelay(50000); //等待芯片稳定
UserDelay(50);
HT16C22_WriteCmd(0x82,0x0f); //1/16 duty
UserDelay(50);
HT16C22_WriteCmd(0x86,0x01); //80HZ
UserDelay(50);
HT16C22_WriteCmd(0x8a,0x00); //内部电压调整关闭
UserDelay(50);
HT16C22_WriteCmd(0x88,0x00); //关闭闪烁
UserDelay(50);
HT16C22_WriteCmd(0x84,0x03); //打开显示
UserDelay(50);
}
/*
初始化HT16C22引脚
*/
static void HT16C22_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* sEE_I2C_SCL_GPIO_CLK and sEE_I2C_SDA_GPIO_CLK Periph clock enable */
RCC_APB2PeriphClockCmd(HT16C22_I2C_SCL_GPIO_CLK | HT16C22_I2C_SDA_GPIO_CLK|LCD_BL_CLK, ENABLE);
/* sEE_I2C Periph clock enable */
RCC_APB1PeriphClockCmd(HT16C22_I2C_CLK, ENABLE);
/* GPIO configuration */
/* Configure sEE_I2C pins: SCL */
GPIO_InitStructure.GPIO_Pin = HT16C22_I2C_SCL_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; // 开漏输出
GPIO_Init(HT16C22_I2C_SCL_GPIO_PORT, &GPIO_InitStructure);
/* Configure sEE_I2C pins: SDA */
GPIO_InitStructure.GPIO_Pin = HT16C22_I2C_SDA_PIN;
GPIO_Init(HT16C22_I2C_SDA_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = LCD_BL_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_InitStruct.Alternate = GPIO_AF1_I2C1;
GPIO_Init(LCD_BL_PORT, &GPIO_InitStructure); //背光
OPEN_LCD_BL;
}
static void HT16C22_IIC_Start(void)
{
HT16C22_SDA_H();
HT16C22_SCL_H();
UserDelay(5);
HT16C22_SDA_L();
UserDelay(5);
HT16C22_SDA_L();
UserDelay(5);
}
static void HT16C22_IIC_Stop(void)
{
HT16C22_SCL_L(); //1
UserDelay(5); // 2
HT16C22_SDA_L(); // 3. 1,2,3???????
UserDelay(5);
HT16C22_SCL_H();
UserDelay(5);
HT16C22_SDA_H();
UserDelay(5);
}
static void HT16C22_IIC_WaitAck(void)
{
u16 k;
HT16C22_SCL_L();
HT16C22_SDA_H();
UserDelay(5);
HT16C22_SCL_H();
k = 0;
while((Read_HT16C22_SDA()!= 0) /*&& (k < 60000)*/)k++;
UserDelay(5);
HT16C22_SCL_L();
UserDelay(5);
}
static void HT16C22_IIC_WriteByte(u8 byte)
{
u8 i = 0;
for(i = 0; i < 8; i++)
{
HT16C22_SCL_L();
UserDelay(5);
if(byte & 0x80)
{
HT16C22_SDA_H();
}
else
{
HT16C22_SDA_L();
}
UserDelay(5);
HT16C22_SCL_H();
UserDelay(5);
byte<<=1;
}
HT16C22_SCL_L();
UserDelay(5);
}
static u8 HT16C22_IIC_ReadByte(void)
{
u8 i,ReadByte;
HT16C22_SDA_H();
for(i = 0; i < 8; i++)
{
ReadByte <<= 1;
HT16C22_SCL_L();
UserDelay(5);
HT16C22_SCL_H();
UserDelay(5);
if(Read_HT16C22_SDA())
{
ReadByte |= 0x01;
}
else
{
ReadByte &= ~(0x01);
}
}
return ReadByte;
}
static void HT16C22_I2C_Ack(void)
{
HT16C22_SCL_L();
UserDelay(5);
HT16C22_SDA_L();
UserDelay(5);
HT16C22_SCL_H();
UserDelay(5);
HT16C22_SCL_L();
UserDelay(5);
}
static void HT16C22_I2C_NoAck(void)
{
HT16C22_SCL_L();
UserDelay(5);
HT16C22_SDA_H();
UserDelay(5);
HT16C22_SCL_H();
UserDelay(5);
HT16C22_SCL_L();
UserDelay(1);
}
/*
发送命令指令
*/
u8 HT16C22_WriteCmd(u8 Cmd,u8 CmdSet)
{
HT16C22_IIC_Start();
HT16C22_IIC_WriteByte(0x7a);
HT16C22_IIC_WaitAck();
HT16C22_IIC_WriteByte(Cmd);
HT16C22_IIC_WaitAck();
HT16C22_IIC_WriteByte(CmdSet);
HT16C22_IIC_WaitAck();
HT16C22_IIC_Stop();
}
u8 HT16C22_WriteRom(u8* pBuffer,u8 RomAdd,u8 NumByteToWrite)
{
u8 i;
HT16C22_IIC_Start();
HT16C22_IIC_WriteByte(0x7a);
HT16C22_IIC_WaitAck();
HT16C22_IIC_WriteByte(0x80);
HT16C22_IIC_WaitAck();
HT16C22_IIC_WriteByte(RomAdd);
HT16C22_IIC_WaitAck();
for(i=0; i<NumByteToWrite; i++)
{
HT16C22_IIC_WriteByte(pBuffer[i]);
HT16C22_IIC_WaitAck();
HT16C22_IIC_WriteByte(pBuffer[i]);
HT16C22_IIC_WaitAck();
}
HT16C22_IIC_Stop();
}
/*
读取数据
*/
u8 HT16C22_ReadRom(u8* pBuffer,u8 RomAdd,u8 NumByteToWrite)
{
u8 i;
HT16C22_IIC_Start();
HT16C22_IIC_WriteByte(0x7a);
HT16C22_IIC_WaitAck();
HT16C22_IIC_WriteByte(0x80);
HT16C22_IIC_WaitAck();
HT16C22_IIC_WriteByte(RomAdd);
HT16C22_IIC_WaitAck();
HT16C22_IIC_Stop();
HT16C22_IIC_Start();
HT16C22_IIC_WriteByte(0x7b);
HT16C22_IIC_WaitAck();
for(i=0; i<NumByteToWrite; i++)
{
pBuffer[i]=HT16C22_IIC_ReadByte();
if(i==(NumByteToWrite-1)) HT16C22_I2C_NoAck();
else HT16C22_I2C_Ack();
}
HT16C22_IIC_Stop();
}