#include<pic.h>
__CONFIG(0x3b31);
/*************************************************
函数功能:延时1MS 4MHz
函数输入: n 1MS延时的整数倍
函数返回:
*************************************************/
void delay_1ms(unsigned int n)
{
unsigned int j;
unsigned char i;
for(j=0;j<n;j++)
for(i=0;i<110;i++)
NOP();
}
/*************************************************
函数功能:延时微秒
函数输入:
函数返回:
*************************************************/
void delay_us(void)
{
NOP();
NOP();
}
/*************************************************
函数功能:初始化
函数输入:
函数返回:
*************************************************/
void init(void)
{
TRISC =0b00011000; //SCL,SDA设置为输入
SSPCON =0b00101000; //设置I2C主模式
SSPCON2 =0b00000000;
//波特率=Fosc/(4*(SSPADD+1))=>SSPADD+1=(Fosc/Band Rate)/4
SSPADD =0x09; //当主频为4MHz时波特率为100kbps
CKE=0; //使用I2C协议规范电平
SMP=1; //关闭斜率控制
// SSPIF=0; //入使用SSPIF作为信号发送状态位则需要清空此位
// BCLIF=0; //清空总线冲突标志位
}
/*************************************************
函数功能:主机发送起始信号
函数输入:
函数返回:
*************************************************/
void I2C_Start(void)
{
SEN=1; //SEN置1使硬件发送起始信号
//发送完毕后硬件自动把SEN清零
while(SEN) //SEN=1说明正在发送中
; //循环结束说明SEN=0,即起始信号发送完毕
}
/*************************************************
函数功能:主机发送重新起动信号
函数输入:
函数返回:
*************************************************/
void I2C_RptStart(void)
{
RSEN=1; //RSEN置1使硬件发送重启信号
while(RSEN) //RSEN=1说明正在发送中
; //循环结束说明RSEN=0,即重启信号发送完毕
}
/*************************************************
函数功能:主机发送停止信号
函数输入:
函数返回:
*************************************************/
void I2C_Stop(void)
{
PEN=1; //PEN置1使硬件发送停止信号
while(PEN) //PEN=1说明正在发送中
; //循环结束说明PEN=0,即停止信号发送完毕
}
/*************************************************
函数功能:主机发送一位数据
函数输入: cData 待发送的数据
函数返回:
*************************************************/
void I2C_Write_Byte(unsigned char cData)
{
SSPBUF =cData; //
while(RW==1); //主动模式下,判断发送是否完成
while(SSPIF==0);
while(ACKSTAT==1); //等待从机发送应答信号
}
/*************************************************
函数功能:主机向AT24C512写一个字节
函数输入: dat dat 待发送的数据
函数返回:
*************************************************/
void I2C_Write_AT24C512_Byte(unsigned char dat)
{
I2C_Start();
delay_us();
I2C_Write_Byte(0XA0); //向AT24C512发送写命令
I2C_Write_Byte(0x00); //向AT24C512发送待写入数据的地址
I2C_Write_Byte(0x00); //必须先发高8位地址,再发低8位地址
I2C_Write_Byte(dat); //对地址写入数据
I2C_Stop(); //发送停止位
delay_1ms(10);
}
void main(void)
{
TRISB=0X00;
PORTB =0x00;
init();
delay_1ms(100);
I2C_Write_AT24C512_Byte(0xaa);
}
|