📄 main.c
字号:
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define true 1
#define false 0
sbit SDA=P3^7;
sbit SCL=P3^6;
sbit write=0xA2;
sbit read=0xA3;
sbit a_138=P2^2;
sbit b_138=P2^3;
sbit c_138=P2^4;
sbit cs_138=P2^6;
sbit cs_373=P2^5;
unsigned code zima1[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//{0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char zima2[10];
unsigned code zima3[]={0xbf};//显示"-";
/*以下是显示函数的声明*/
void delay();
void xianshi();
void shuju(unsigned int i);
/*---------------以下是pcf8563的函数声明---------------------------*/
void delay_iic(void);
void I2CStart(void);
void I2CStop(void);
bit WaitAck(void);
void SendAck(void);
void SendNotAck(void);
void SendNotAck(void);
void I2CSendByte(uchar);
uchar I2CReceiveByte(void);
void GetPCF8563(uchar ,uchar ,uchar *);
void SetPCF8563(uchar ,uchar );
void SetAlarm(uchar alarmtype,uchar count);
void CleanAlarm(void);
void I2CInit(void);
main()
{
idata uchar rom_sed[9]; //定义保存时间初值的数组
idata uchar rom_rec[7]; //定义保存读取时间的数组
idata uint i;
cs_138=1;
cs_373=1;
rom_sed[0]=0x00; rom_sed[1]=0x00; //要发送的数据初始化
rom_sed[2]=0x00; rom_sed[3]=0x05;
rom_sed[4]=0x11; rom_sed[5]=0x15;
rom_sed[6]=0x04; rom_sed[7]=0x03;
rom_sed[8]=0x07;
for (i=0;i<9;i++)
{
SetPCF8563(i,rom_sed[i]); //设定时间初值,2007年03月15日11点05分0秒
}
while(1)
{
GetPCF8563(0x02,0x07, rom_rec); //读取时间信息,并将其保存在rom_rec 中
//for(i=0;i<15;i++)
xianshi();
zima2[6]=(rom_rec[0]&0xf0)/16; //BCD码取各个位
zima2[7]=rom_rec[0]&0x0f; // rom_rec[0]中存放的是"秒"数据
xianshi();
zima2[3]=(rom_rec[1]&0xf0)/16; //BCD码取各个位
zima2[4]=rom_rec[1]&0x0f; // rom_rec[1]中存放的是"分"数据
xianshi();
zima2[0]=(rom_rec[2]&0x30)/16; //BCD码取各个位
zima2[1]=rom_rec[2]&0x0f; // rom_rec[2]中存放的是"小时"数据
xianshi();
}
}
void delay()
{
unsigned char i;
for(i=0;i<80;i++);
}
void xianshi(void) //LED显示的数据
{
P0=zima1[zima2[0]];//所要显示的数据
P2=0xbf|0x60; //所要显示的数据位置
delay();
P0=zima1[zima2[1]];//所要显示的数据
P2=0xbb|0x60; //所要显示的数据位置
delay();
P0=zima3[zima2[2]];//所要显示的"-";
P2=0xb7|0x60; //所要显示的数据位置
delay();
P0=zima1[zima2[3]];//所要显示的数据
P2=0xb3|0x60;//所要显示的数据位置
delay();
P0=zima1[zima2[4]];//所要显示的数据
P2=0xaf|0x60;//所要显示的数据位置
delay();
P0=zima3[zima2[5]];//所要显示的"-";
P2=0xab|0x60;//所要显示的数据位置
delay();
P0=zima1[zima2[6]];//所要显示的数据
P2=0xa7|0x60;//所要显示的数据位置
delay();
P0=zima1[zima2[7]];//所要显示的数据
P2=0xa3|0x60;//所要显示的数据位置
delay();
}
void shuju(unsigned int i)
{
unsigned int k;
zima2[0]=i/10000; //所要显示的数字
xianshi();
zima2[1]=(i/1000)%10;
xianshi();
zima2[2]=(i/100)%10;
xianshi();
zima2[3]=(i/10)%10;
xianshi();
zima2[4]=i%10;
xianshi();
for(k=0;k<1000;k++)
xianshi();
}
///////////*以下是8563的初始化*///////////////
void delay_iic(void) /*延时子程序*/
{
_nop_();
}
void I2CInit()
{
SCL=0;
I2CStop();
}
void I2CStart(void) /*启动I2C总线*/
{
EA=0;
SDA=1;
delay_iic();
SCL=1;
delay_iic();
SDA=0;
delay_iic();
SCL=0;
delay_iic();
}
void I2CStop(void) /*停止I2C总线*/
{
SDA=0;
delay_iic();
SCL=1;
delay_iic();
SDA=1;
delay_iic();
SCL=0;
delay_iic();
EA=1;
}
bit WaitAck(void)
{
uchar errtime=255; //因故障接收方无ACK,超时值为255。
SDA=1;
delay_iic();
SCL=1;
delay_iic();
while(SDA)
{
errtime--;
if (!errtime)
{
I2CStop();
//SystemError=0x11;
return false;
}
}
SCL=0;
return true;
}
void SendAck(void)
{
SDA=0;
delay_iic();
SCL=1;
delay_iic();
SCL=0;
}
void SendNotAck(void)
{
SDA=1;
delay_iic();
SCL=1;
delay_iic();
SCL=0;
}
void I2CSendByte(uchar ch) /*发送一个字节*/
{
uchar i=8;
while (i--)
{
SCL=0;
delay_iic();
SDA=(bit)(ch&0x80);
ch<<=1;
delay_iic();
SCL=1;
delay_iic();
}
SCL=0;
}
uchar I2CReceiveByte(void) /*接收一个字节*/
{
uchar i=8;
uchar ddata=0;
SDA=1;
while (i--)
{
ddata<<=1;
SCL=0;
delay_iic();
SCL=1;
delay_iic();
ddata|=SDA;
}
SCL=0;
return ddata;
}
/*-- 以下函数的功能为:读取时钟芯片PCF8563的时间,设置要读的第一个时间类型firsttype
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -