#include "PCF8574.h"
#include "delay.h"
void I2C_GPIO_Init(void)
{ //I2C接口初始化
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); //启动I2C功能
GPIO_InitStructure.GPIO_Pin = SCL | SDA; //选择端口号
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //选择IO接口工作方式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)
GPIO_Init(I2CPORT, &GPIO_InitStructure);
}
void I2C_Configuration(void){ //I2C初始化
I2C_InitTypeDef I2C_InitStructure;
I2C_GPIO_Init(); //先设置GPIO接口的状态
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//设置为I2C模式
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = HostAddress; //主机地址(从机不得用此地址)
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;//允许应答
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //7位地址模式
I2C_InitStructure.I2C_ClockSpeed = BusSpeed; //总线速度设置
I2C_Init(I2C1,&I2C_InitStructure);
I2C_Cmd(I2C1,ENABLE);//开启I2C
}
void PCFSendAByte(u8 addr,u8 dat)
{
I2C_GenerateSTART(I2C1,ENABLE); //发送开始信号
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //等待完成
I2C_Send7bitAddress(I2C1,addr,I2C_Direction_Transmitter);
//while(I2C_GetFlagStatus(I2C2,I2C_FLAG_AF));
while(SUCCESS != I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//EV6
// I2C_SendData(I2C1,addr); //发送从器件内部寄存器地址
//while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
I2C_SendData(I2C1,dat); //发送要写入的内容
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
I2C_GenerateSTOP(I2C1,ENABLE); //发送结束信号
}
/***************以下为1602****************/
void WriteCom1602(u8 com)
{
u8 tmp,mmp;
I2C_GenerateSTART(I2C1,ENABLE); //发送开始信号
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //等待完成
// I2C_SendData(I2C1,WriteADDR); //发送从器件内部寄存器地址
// while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
I2C_Send7bitAddress(I2C1,WriteADDR,I2C_Direction_Transmitter);
//while(I2C_GetFlagStatus(I2C2,I2C_FLAG_AF));
while(SUCCESS != I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//EV6
tmp=com&0xf0;
I2C_SendData(I2C1,CSReset|COMSet); //EN=0 RS.RW=0 无数据
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
mmp=tmp|CSReset|COMSet;
I2C_SendData(I2C1,mmp);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
mmp|=CSSet; //EN=1 RS.RW=0 有数据(高四位)
I2C_SendData(I2C1,mmp);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
mmp&=(0xf0|COMSet);
I2C_SendData(I2C1,mmp);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
tmp=com<<4;
I2C_SendData(I2C1,CSReset|COMSet); //EN=0 RS.RW=0 无数据
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
mmp=tmp|CSReset|COMSet;
I2C_SendData(I2C1,mmp);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
mmp|=CSSet; //EN=1 RS.RW=0 有数据(高四位)
I2C_SendData(I2C1,mmp);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
mmp&=(0xf0|COMSet);
I2C_SendData(I2C1,mmp);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C1,ENABLE);//产生停止信号
}
void WriteDat1602(u8 dat)
{
u8 tmp,mmp;
I2C_GenerateSTART(I2C1,ENABLE); //发送开始信号
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //等待完成
//I2C_SendData(I2C1,WriteADDR); //发送从器件内部寄存器地址
//while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
I2C_Send7bitAddress(I2C1,WriteADDR,I2C_Direction_Transmitter);
//while(I2C_GetFlagStatus(I2C2,I2C_FLAG_AF));
while(SUCCESS != I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//EV6
tmp=dat&0xf0;
I2C_SendData(I2C1,CSReset|DATSet); //EN=0 RS.RW=0 无数据
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
mmp=tmp|CSReset|DATSet;
I2C_SendData(I2C1,mmp);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
mmp|=CSSet; //EN=1 RS.RW=0 有数据(高四位)
I2C_SendData(I2C1,mmp);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
mmp&=(0xf0|DATSet);
I2C_SendData(I2C1,mmp);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
tmp=dat<<4;
I2C_SendData(I2C1,CSReset|DATSet); //EN=0 RS.RW=0 无数据
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
mmp=tmp|CSReset|DATSet;
I2C_SendData(I2C1,mmp);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
mmp|=CSSet; //EN=1 RS.RW=0 有数据(高四位)
I2C_SendData(I2C1,mmp);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
mmp&=(0xf0|DATSet);
I2C_SendData(I2C1,mmp);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C1,ENABLE);//产生停止信号
}
void PCF1602Init()
{
WriteCom1602(0x28);
delay_ms(15);
WriteCom1602(0x28);
delay_ms(15);
WriteCom1602(0x28);
delay_ms(15);
PCFSendAByte(WriteADDR,0x04);
delay_ms(15);
WriteCom1602(0x28);
WriteCom1602(0x0c);
WriteCom1602(0x01);
delay_ms(5);
}
void SetXY(u8 x,u8 y)
{
u8 addr;
addr=0x80+0x40*y+x;
WriteCom1602(addr);
}
void StrinWrite(u8 x,u8 y,u8 *string)
{
SetXY(x,y);
while(*string)
{
WriteDat1602(*string++);
}
}