pcf8574c语言测试程序,STM32F103 PCF8574硬件IIC程序

#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++);

}

}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值