// I2C接口EEPROM:24Cxx读写实验
// 使用I2C1模块
// 连线:PortB输入:高8位接8位拨动开关(设置读/写地址)
// PortE输出:低8位接发光管(G6区)(显示读出的内容);
// 8位拨动开关状态改变时,读出开关指定地址的内容,并显示在8位发光管上
//
// 文件名: I2C_exam1.c
// 处理器型号: PIC24FJ64GA006
// 采用外部晶振: 16MHz
// 编译器: MPLAB C30 V3.0
//
// 作者 日期 修改内容
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 解永军 2008.12.08 上电时所有单元写入取反后的地址值
// 解永军 2008.12.08 删除读函数
//
///////////////////////////////////////////////////////////////////////////
#include <p24FJ64GA006.h>
unsigned char RESERED[100]; //预留区,供ICD2调试使用
#define WR_24CXX 0xA8 // 24Cxx写模式
#define RD_24CXX 0xA9 // 24Cxx读模式
// 函数声明
void DelayMS(unsigned int ); //延时程序(毫秒级)
void Write_Byte(unsigned char I2C_Addr,unsigned char OutData); //指定地址写1个字节
void I2CWRByte(unsigned char single_byte); //发送一个字节
unsigned char Read_Byte(unsigned char I2C_Addr); //指定地址读1个字节
unsigned char I2CRDByte(void); //接收一个字节
void WaitIdel( void ); //等待I2C模块空闲
void I2C1Start( void ); //启动
void I2C1RStart( void ); //重复启动
void I2C1Stop( void ); //停止
void I2C1RCEN( void ); //接收使能
void I2C1ACK( void ); //发送应答
void I2C1NACK( void ); //发送非应答
//------------------------------------------------------------------------------
void WaitIdel(void)
{
while(I2C1CON & 0x001F); //等待I2C模块空闲
while(I2C1STATbits.TRSTAT);
}
//------------------------------------------------------------------------------
void I2C1Start( void )
{
WaitIdel();
I2C1CONbits.SEN=1; //启动
}
//------------------------------------------------------------------------------
void I2C1RStart( void )
{
WaitIdel();
I2C1CONbits.RSEN=1; //重复启动
}
//------------------------------------------------------------------------------
void I2C1Stop( void )
{
WaitIdel();
I2C1CONbits.PEN=1; //停止
}
//------------------------------------------------------------------------------
void I2C1RCEN( void )
{
WaitIdel();
I2C1CONbits.RCEN=1; //接收使能
}
//------------------------------------------------------------------------------
void I2C1ACK( void )
{
WaitIdel();
I2C1CONbits.ACKDT=0;
I2C1CONbits.ACKEN=1; //发送应答
}
//------------------------------------------------------------------------------
void I2C1NACK( void )
{
WaitIdel();
I2C1CONbits.ACKDT=1;
I2C1CONbits.ACKEN=1; //发送非应答
}
//------------------------------------------------------------------------------
//函数功能:I2C发送1个字节
//入口参数:发送的数据(1个字节)
//------------------------------------------------------------------------------
void I2CWRByte(unsigned char single_byte)
{
WaitIdel();
while(I2C1STATbits.TBF); //等待I2C1TRN空
I2C1TRN=single_byte;
}
//-----------------------------------------------
// I2C写一个字节到指定地址
//入口参数:I2C_Addr,OutData
//-----------------------------------------------
void Write_Byte(unsigned char I2C_Addr,unsigned char OutData)
{
I2C1Start(); // I2C总线启动
I2CWRByte(WR_24CXX); // "写"模式
I2CWRByte(I2C_Addr); //送地址
I2CWRByte(OutData); //送数据
I2C1Stop(); // I2C总线停止
DelayMS(10); // 等待24C02内部编程完成
}
//------------------------------------------------------------------------------
//函数功能:I2C接收1个字节
//入口参数:无
//出口参数:收到的数据
//------------------------------------------------------------------------------
unsigned char I2CRDByte(void)
{
unsigned char temp;
// 添加代码
return temp;
}
//-----------------------------------------------
// I2C读指定地址的一个字节,调用I2CRDByte() 函数
//入口参数:I2C_Addr
//出口参数:temp(从I2C_Addr地址读取的内容)
//-----------------------------------------------
unsigned char Read_Byte(unsigned char I2C_Addr)
{
unsigned char temp;
// 添加代码
return temp;
}
//------------------------------------------------------------------------------
//函数功能:I2C1模块初始化
//------------------------------------------------------------------------------
void I2C1Init( void )
{
I2C1CONbits.DISSLW=1; // 禁止变化率控制
I2C1BRG=249; //249
I2C1CONbits.I2CEN=1; // I2C模块使能
}
//------------------------------------------------------------------------------
//函数功能:I/O端口初始化
//------------------------------------------------------------------------------
void IOInit( void )
{
AD1PCFG= 0xFFFF; //关闭PORTB端口所有引脚的模拟功能
TRISB= 0xFFFF; // 输入
TRISE= 0xFF00; // 输出,低八位接LED指示灯
}
///////////////////////////////////////////////////////////////////////////
//函数功能:main函数
///////////////////////////////////////////////////////////////////////////
int main( void )
{
unsigned char I2C_Addr1,RD_data,WR_data,WR_dataNew;
unsigned int key_state,i;
IOInit(); // I/O端口初始化
I2C1Init(); // I2C模块1初始化
PORTE=0xFF; //开始写入前,灯全灭
for(i=0;i<=255;i++)
{
Write_Byte(i,0xFF-i); // 写入内容=单元的地址取反
if(i%10==0)
PORTEbits.RE0^=1; // 写入时:RE0闪烁
}
PORTE=0x00; //写入完成,灯全亮
while(1) // !!!确保main()函数闭环!!!
{
//添加代码,完成如下功能:
//读取开关状态作为地址,并从这个地址读出AT24C02的数据显示在LED灯上
}
}
//------------------------------------------------------------------------------
//函数功能:延时程序(毫秒级)
//入口参数:del
//------------------------------------------------------------------------------
void DelayMS(unsigned int del)
{
unsigned int j;
while(del--)
for(j=0;j<1600;j++);
}
// end of main