| #include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
 #include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
 //// 液晶没有加,数据已经在 dis_buf_date[]里面了,需要的自行把数据显示在对应的lcd上面就行,格式问题也应该不大,直说我懒得搞了,改这个是为了验证我的模拟的I2C有没有问题,现在没问题,我也懒得继续深究了,后续有需要我在加个显示
 /*端口设置*/
 #define         DS3231_SCL            GpioDataRegs.GPADAT.bit.GPIO20
 
 #define          DS3231_SDA         GpioDataRegs.GPADAT.bit.GPIO21
 #define   DS3231_SDA_IN      GpioCtrlRegs.GPADIR.bit.GPIO21
 
 
 
 #define          LED1        GpioDataRegs.GPADAT.bit.GPIO0
 #define          LED2        GpioDataRegs.GPADAT.bit.GPIO1
 #define          LED3        GpioDataRegs.GPADAT.bit.GPIO2
 #define          LED4        GpioDataRegs.GPADAT.bit.GPIO3
 #define          LED5        GpioDataRegs.GPADAT.bit.GPIO4
 
 
 
 
 
 
 
 #define DS3231_WriteAddress 0xD0    //器件写地址
 #define DS3231_ReadAddress  0xD1    //器件读地址
 #define DS3231_SECOND       0x00    //秒
 #define DS3231_MINUTE       0x01    //分
 #define DS3231_HOUR         0x02    //时
 #define DS3231_WEEK         0x03    //星期
 #define DS3231_DAY          0x04    //日
 #define DS3231_MONTH        0x05    //月
 #define DS3231_YEAR         0x06    //年
 #define u8  unsigned char
 
 
 //IIC所有操作函数
 //void         IIC_Init(void);                        //初始化IIC的IO口
 void         IIC_Start(void);                                //发送IIC开始信号
 void         IIC_Stop(void);                                          //发送IIC停止信号
 void         IIC_Send_Byte(u8 txd);                        //IIC发送一个字节vodi                IIC_Read_Byte(u8);                                //IIC读取一个字节
 u8                IIC_Wait_Ack(void);                         //IIC等待ACK信号
 void         IIC_Ack(void);                                        //IIC发送ACK信号
 void         IIC_NAck(void);                                        //IIC不发送ACK信号
 u8                BCD2_Hex(u8);
 u8                HEX2_Bcd(u8);
 void         DS3231_WriteByte(u8,u8);
 u8                 DS3231_ReadCurrent(void);
 u8               DS3231_ReadRandom(u8);
 void         DS3231_ModifyTime(u8,u8,u8,u8,u8,u8);
 
 void TimeDisplay(u8 Dhour,u8 Dmin,u8 Dsec);
 void DateDisplay(u8 Dyear,u8 Dmonth,u8 Dday);
 void TempDisplay(u8 TempH,u8 TempL);
 void get_show_time(void);
 void get_show_date(void);
 void get_show_Temperature(void);
 void configtestled(void);
 
 u8        dis_buf_date[]={0,0,'-',0,0,' ',0,0,':',0,0,':',0,0,'\0'};
 //u8        dis_buf_temp[]={0,0,'.',0,0,'\0'};
 u8        txd_buf_date[];
 
 u8 Ytemp1,Ytemp2,Mtemp1,Mtemp2,Dtemp1,Dtemp2;
 void main(void)
 {
 InitSysCtrl();
 configtestled();
 
 DINT;
 
 DS3231_ModifyTime(16,9,1,9,21,56);//设定初始时间
 while(1)
 {
 get_show_date(); //日期,年没加进去,需要的自己改
 //        DELAY_US(100);
 get_show_time();//时间
 DELAY_US(100);
 }
 }
 u8 BCD2_Hex(u8 val)
 {
 u8 temp;
 temp = val & 0x0f;
 val>>= 4;
 val &= 0x0f;
 val *= 10;
 temp+= val;
 return temp;
 }
 
 //B转换为BCD
 u8 HEX2_Bcd(u8 val)
 {
 u8 i,j,k;
 i = val/10;
 j = val%10;
 k = j+(i<<4);
 return k;
 }
 
 
 //产生IIC起始信号
 void IIC_Start(void)
 {
 EALLOW;
 GpioCtrlRegs.GPADIR.bit.GPIO21=1;//输出
 EDIS;
 DS3231_SDA=1;
 
 DS3231_SCL=1;
 
 DELAY_US(10);
 DS3231_SDA=0;
 DELAY_US(10);
 DS3231_SCL=0;
 
 
 }
 //产生IIC停止信号
 void IIC_Stop(void)
 {
 EALLOW;
 GpioCtrlRegs.GPADIR.bit.GPIO21=1;// DIR 1是输出 0是输入
 EDIS;
 DELAY_US(10);
 DS3231_SCL=0;
 DS3231_SDA=0;
 DELAY_US(10);
 DS3231_SCL=1;
 DELAY_US(10);
 DS3231_SDA=1;
 DELAY_US(10);
 
 
 }
 //等待应答信号到来
 //返回值:1,接收应答失败
 //        0,接收应答成功
 u8 IIC_Wait_Ack(void)
 {
 u8 ucErrTime=0;
 
 EALLOW;
 GpioCtrlRegs.GPADIR.bit.GPIO21=0;// DIR 1是输出 0是输入
 EDIS;
 
 DS3231_SDA=1;
 DELAY_US(5);
 DS3231_SCL=1;
 DELAY_US(5);
 
 while (GpioDataRegs.GPADAT.bit.GPIO21 == 1)
 {
 ucErrTime++;
 if(ucErrTime>100)
 {
 IIC_Stop();
 return 1;
 }
 }
 
 DS3231_SCL=0;//时钟输出0
 return 0;
 }
 //产生ACK应答
 void IIC_Ack(void)
 {
 DS3231_SCL=0;
 EALLOW;
 GpioCtrlRegs.GPADIR.bit.GPIO21=1;// DIR 1是输出 0是输入
 EDIS;
 DS3231_SDA=0;
 DELAY_US(10);
 DS3231_SCL=1;
 DELAY_US(10);
 DS3231_SCL=0;
 }
 //不产生ACK应答
 void IIC_NAck(void)
 {
 DS3231_SCL=0;
 EALLOW;
 GpioCtrlRegs.GPADIR.bit.GPIO21=1;// DIR 1是输出 0是输入
 EDIS;
 DS3231_SDA=1;
 DELAY_US(10);
 DS3231_SCL=1;
 DELAY_US(10);
 DS3231_SCL=0;
 }
 
 //IIC发送一个字节
 //返回从机有无应答
 //1,有应答
 //0,无应答
 void IIC_Send_Byte(u8 txd)
 {
 u8 t;
 EALLOW;
 GpioCtrlRegs.GPADIR.bit.GPIO21=1;// DIR 1是输出 0是输入
 EDIS;
 DS3231_SCL=0;//拉低时钟开始数据传输
 
 for(t=0;t<8;t++)
 {
 DS3231_SDA=(txd&0x80)>>7;
 txd<<=1;
 
 DELAY_US(10);
 DS3231_SCL=1;
 DELAY_US(10);
 DS3231_SCL=0;
 
 DELAY_US(10);
 }
 }
 //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
 unsigned char IIC_Read_Byte(unsigned char ack)
 {
 unsigned char i,receive=0;
 EALLOW;
 GpioCtrlRegs.GPADIR.bit.GPIO21=0;// DIR 1是输出 0是输入
 EDIS;
 for(i=0;i<8;i++ )
 {
 DS3231_SCL=0;
 DELAY_US(10);
 DS3231_SCL=1;
 receive<<=1;
 if(GpioDataRegs.GPADAT.bit.GPIO21==1)
 receive++;
 DELAY_US(10);
 }
 if (!ack)
 IIC_NAck();//发送nACK
 else
 IIC_Ack(); //发送ACK
 return receive;
 }
 //指定地址写数据/命令
 void DS3231_WriteByte(u8 addr,u8 dat)
 {
 IIC_Start();
 IIC_Send_Byte(DS3231_WriteAddress);
 IIC_Wait_Ack();
 IIC_Send_Byte(addr);
 IIC_Wait_Ack();
 IIC_Send_Byte(dat);
 IIC_Wait_Ack();
 IIC_Stop();
 }
 u8 DS3231_ReadCurrent(void)
 {
 u8 read_dat;
 IIC_Start();
 IIC_Send_Byte(DS3231_ReadAddress);
 IIC_Wait_Ack();
 read_dat=IIC_Read_Byte(0);
 
 IIC_Stop();
 return read_dat;
 }
 
 u8 DS3231_ReadRandom(u8 random_addr)
 {
 IIC_Start();
 
 IIC_Send_Byte(DS3231_WriteAddress);
 IIC_Wait_Ack();
 IIC_Send_Byte(random_addr);
 IIC_Wait_Ack();
 //   LED1=~LED1;
 DELAY_US(1000);
 return (DS3231_ReadCurrent());
 }
 
 void DS3231_ModifyTime(u8 yea,u8 mon,u8 day,u8 hou,u8 min,u8 sec)
 {
 u8 temp=0;
 temp=HEX2_Bcd(yea);
 DS3231_WriteByte(DS3231_YEAR,temp);                //修改年
 
 temp=HEX2_Bcd(mon);
 DS3231_WriteByte(DS3231_MONTH,temp);        //修改月
 
 temp=HEX2_Bcd(day);
 DS3231_WriteByte(DS3231_DAY,temp);                //修改日
 
 temp=HEX2_Bcd(hou);
 DS3231_WriteByte(DS3231_HOUR,temp);                //修改时
 
 temp=HEX2_Bcd(min);
 DS3231_WriteByte(DS3231_MINUTE,temp);        //修改分
 
 temp=HEX2_Bcd(sec);
 DS3231_WriteByte(DS3231_SECOND,temp);        //修改秒
 }
 void TimeDisplay(u8 Dhour,u8 Dmin,u8 Dsec)
 {
 dis_buf_date[6]=Dhour/10 +0x30;        // 时十位
 dis_buf_date[7]=Dhour%10 +0x30;        // 时个位
 dis_buf_date[9]=Dmin/10 +0x30;         // 分十位 153745625
 dis_buf_date[10]=Dmin%10+0x30;         // 分个位
 dis_buf_date[12]=Dsec/10+0x30;         // 秒十位
 dis_buf_date[13]=Dsec%10+0x30;         // 秒个位
 }
 void DateDisplay(u8 Dyear,u8 Dmonth,u8 Dday)
 {
 dis_buf_date[0]=Dmonth/10 +0x30;       // 月十位
 dis_buf_date[1]=Dmonth%10+0x30;       // 月个位
 dis_buf_date[3]=Dday /10+0x30;         // 天十位
 dis_buf_date[4]=Dday %10+0x30;         // 天个位
 }
 
 void get_show_time(void)
 {
 u8 Htemp1,Htemp2,Mtemp1,Mtemp2,Stemp1,Stemp2;
 
 Stemp1=DS3231_ReadRandom(DS3231_SECOND);  //秒
 Stemp2=BCD2_Hex(Stemp1);
 Mtemp1=DS3231_ReadRandom(DS3231_MINUTE);  //分
 Mtemp2=BCD2_Hex(Mtemp1);
 Htemp1=DS3231_ReadRandom(DS3231_HOUR);    //时 24小时制
 Htemp2=BCD2_Hex(Htemp1);
 
 TimeDisplay(Htemp2,Mtemp2,Stemp2);
 
 }
 void get_show_date(void)
 {
 u8 Ytemp1,Ytemp2,Mtemp1,Mtemp2,Dtemp1,Dtemp2;
 Dtemp1=DS3231_ReadRandom(DS3231_DAY);         //日
 Dtemp2=BCD2_Hex(Dtemp1);
 Mtemp1=DS3231_ReadRandom(DS3231_MONTH);       //月
 Mtemp2=BCD2_Hex(Mtemp1);
 Ytemp1=DS3231_ReadRandom(DS3231_YEAR);        //年
 
 Ytemp2=BCD2_Hex(Ytemp1);
 DateDisplay(Ytemp2,Mtemp2,Dtemp2);
 
 }
 
 
 void configtestled(void)
 {
 EALLOW;
 
 GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 0; // GPIO0复用为GPIO功能
 GpioCtrlRegs.GPADIR.bit.GPIO21 = 1;  // GPIO0设置为输出
 
 GpioCtrlRegs.GPAMUX2.bit.GPIO20 =0; // GPIO1 = GPIO1
 GpioCtrlRegs.GPADIR.bit.GPIO20 = 1;  // G 88401854
 /*
 
 GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // GPIO0复用为GPIO功能
 GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;  // GPIO0设置为输出
 GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; // GPIO1 = GPIO1
 GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
 GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0; // GPIO0复用为GPIO功能
 GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;  // GPIO0设置为输出
 GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0; // GPIO1 = GPIO1
 GpioCtrlRegs.GPADIR.bit.GPIO3 = 1;
 GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 0; // GPIO1 = GPIO1
 GpioCtrlRegs.GPADIR.bit.GPIO4 = 1;
 GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; // GPIO1 = GPIO1
 GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
 
 */
 EDIS;
 }
 //===========================================================================
 // No more.
 //===========================================================================
 
 
 
 |