#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.
//===========================================================================
|