📄 iic_io.c
字号:
#include <c8051f040.h>
#include "intrins.h"
/**********************另外相关的定义*********************************/
#define HIGH 1
#define LOW 0
#define TURE 1
#define FALSE 0
#define uchar unsigned char
#define uint unsigned int
void delay_ms(uint n);
/*********************结束***********************************************/
/***************************DS1307开始*****************************************************************/
#define Wait1us _nop_();
#define Wait2us {_nop_();_nop_();}
#define Wait4us {Wait2us;Wait2us;}
#define Wait8us {Wait4us;Wait4us;}
#define Wait10us {Wait8us;Wait2us;}
#define WRITEDS1307 0xD0
#define READDS1307 0xD1
sbit SDA=P0^2; //DS1307 Serial-Data Input pin 5
sbit SCL=P0^3; //DS1307 Serial-Clock Input pin 6
/************************************************************/
void I2C_start(void);//I2C start function
void I2C_stop(void);//I2C stop function
//void I2C_send_ack(void);//I2C send responsion function
void I2C_send_noack(void);
void I2C_write_byte(unsigned char IIC_data);//I2C bus write byte function
unsigned char I2C_read_byte(void);//I2C bus read byte function
/***********************************************************************/
void Write1307(unsigned char add,unsigned char dat);//write information to ds1307
unsigned char Read1307(unsigned char add);//read information from ds1307
void Read_RTC(void);//read RTC
void Set_RTC(void);//set RTC
void OSCILLATOR_Init (void);
void PORT_Init (void);
/***********************************************************************/
code unsigned char set_rtc_code[7]={0x00,0x34,0x16,0x1,0x03,0x11,0x08};
code unsigned char rtc_address[7]={0x02,0x03,0x04,0x05,0x06,0x07,0x08};//DS1307
code unsigned char *day[7]={"Mon","Tue","Wen","Thu","Fri","Sat","Sun"};
unsigned char read_rtc_code[7];
/***********************************************************************/
void Initial(void);//system initize function
/***********************************************************************/
/***********************************************************************/
void main(void)
{
WDTCN = 0xde; /*关看门狗*/
WDTCN = 0xad;
OSCILLATOR_Init ();
PORT_Init (); // Initialize crossbar and GPIO
Set_RTC();
while(1)
{
Write1307(0x00,0x01);
Read_RTC();
Write1307(0x00,0x00);
}
}
void OSCILLATOR_Init (void)
{
int i = 0;
SFRPAGE = CONFIG_PAGE;
OSCXCN = 0x77;
for (i = 0; i < 256; i++); // Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0);
CLKSEL = 0x01;
}
void PORT_Init (void)
{
SFRPAGE = CONFIG_PAGE; // Switch to configuration page
XBR2 = 0x40; // Enable crossbar and weak pull-ups
P0MDOUT |= 0xff; // enable P0 (LED) as push-pull output
P1MDOUT |= 0xff; // enable P1 (LED) as push-pull output
P4MDOUT |= 0xff; // enable P5 (LED) as push-pull output
P5MDOUT |= 0xff; // enable P5 (LED) as push-pull output
P6MDOUT |= 0xff; // enable P5 (LED) as push-pull output
P7MDOUT |= 0xff; // enable P5 (LED) as push-pull output
P4 = 0;
P5 = 0;
P6 = 0;
P7 = 0;
}
/***********************************************************************/
void I2C_start(void)
{
SDA=1;
SCL=1;
Wait8us;
SDA=0;
Wait8us;
SCL=0;
}
/***********************************************************************/
void I2C_stop(void)
{
SDA=0;
SCL=1;
Wait8us;
SDA=1;
Wait4us;
SCL=0;
}
/***********************************************************************/
void I2C_send_ack(void)
{
SDA=0;
Wait2us;
SCL=1;
Wait4us;
SCL=0;
Wait2us;
}
/*************************************************************************/
void I2C_send_noack(void)
{
SDA=1;
Wait2us;
SCL=1;
Wait4us;
SCL=0;
Wait2us;
}
unsigned char IICCheckAcknowledge() /*IIC总线检测从机应答位*/
{
unsigned char IICAckFlag;
SDA=1; /*SDA=1; 线与吗?应为SDA=0?*/
Wait2us;
SCL=1;
Wait2us;
IICAckFlag=0;
if(SDA==0) /*应答正常*/
{
Wait2us;
SCL=0;
return(IICAckFlag);
}
else
{
IICAckFlag=1; /*应答不正常*/
Wait2us;
SCL=0;
return(IICAckFlag);
}
}
/***********************************************************************/
void I2C_write_byte(unsigned char IIC_data)
{
unsigned char i;
for(i=0;i<8;i++)
{
SCL=0;
if((IIC_data<<i) & 0x80)
SDA=1; //判断发送位
else SDA=0;
Wait2us;
SCL=1;
Wait4us;
SCL=0;
}
Wait4us;
SDA=1; //发送完8bit,释放总线准备接收应答位
Wait2us;
SCL=1;
Wait4us; //sda上数据即是从应答位
SCL=0; //不考虑从应答位|但要控制好时序
}
/***********************************************************************/
unsigned char I2C_read_byte(void)
{
unsigned char i,dat;
dat=0;
SDA=1;
for (i=0;i<8;i++)
{
dat=dat<<1;
SCL=1;
Wait2us;
if(SDA==1)
{
dat++;
}
SCL=0;
}
return (dat);
}
/***********************************************************************/
/******************************** DS1307 PART START ****************/
void Write1307(unsigned char add,unsigned char dat)
{
I2C_start();
I2C_write_byte(WRITEDS1307);
I2C_write_byte(add);
I2C_write_byte(dat);
I2C_stop();
}
/***********************************************************************/
unsigned char Read1307(unsigned char add)
{
unsigned char dat;
I2C_start();
I2C_write_byte(WRITEDS1307);
I2C_write_byte(add);
I2C_start();
I2C_write_byte(READDS1307);
dat=I2C_read_byte();
I2C_send_noack();
I2C_stop();
return (dat);
}
/****************************读DS1307的寄存器*******************************************/
void Read_RTC(void)
{
unsigned char i,*p;
p=rtc_address;
for(i=0;i<7;i++)
{
read_rtc_code[i]=Read1307(*p);
p++;
}
}
/***************************DS1307的初始化********************************************/
void Set_RTC(void)
{
unsigned char i,*p;
p=rtc_address;
Write1307(0x00,0x02);
for(i=0;i<7;i++)
{
Write1307(*p,set_rtc_code[i]);
p++;
}
Write1307(0x00,0x00);
Write1307(0x01,0x00);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -