📄 fpc8583.c.bak
字号:
#include "math.h"
#include "2407.h"
#define SDA_1() {PFDATDIR = PFDATDIR|0x2000;PFDATDIR = PFDATDIR|0x0020;} /* SDA_1( ) */
#define SDA_0() {PFDATDIR = PFDATDIR|0X2000;PFDATDIR = PFDATDIR&0XFFDF;} /* SDA_0( ) */
#define SCL_1() {PFDATDIR = PFDATDIR|0X0100;PFDATDIR = PFDATDIR|0X0001;} /* SCL_1( ) */
#define SCL_0() {PFDATDIR = PFDATDIR|0X0100;PFDATDIR = PFDATDIR&0XFFFE;} /* SCL_0( ) */
#define DEVSELWR 0xA0 /*I2C器件写操作命*/
#define DEVSELRD 0xA1 /*I2C器件读操作命令*/
unsigned int DATAH; /*数据线SDA=1 (IOPf2)*/
unsigned int DATAL; /*SDA=0*/
unsigned int CLOCKH; /*时钟线SCL=1 (IOPF1)*/
unsigned int CLOCKL; /*SCL=0*/
unsigned int DATACLOCKH; /*SDA=SCL=1*/
unsigned int DATACLOCKL; /*SDA=SCL=0*/
unsigned int DATAINPUT; /*PFDATDIR.11=0,即IOPF2引脚作为输入*/
unsigned int DATAOUTPUT; /*PFDATDIR.11=1,即IOPF2引脚作为输出*/
unsigned int dingshijishu; /*系统定时计数器*/
unsigned int XiaFa_MINSEC,XiaFa_DAYHOUR,XiaFa_YEARMON; /*下发分秒、日时、年月*/
unsigned int RAM_MINSEC,RAM_DAYHOUR,RAM_YEARMON; /*备份分秒、日时、年月*/
unsigned int ms_data,sec_data,min_data,hour_data,
mon_data,yd_data; /*读iic变量:毫秒、秒、分、时、月、年日*/
unsigned int ms_data1,sec_data1,min_data1,hour_data1,
mon_data1,yd_data1;
unsigned int ms_ZhiHou; /*8583滞后系统毫秒数*/
unsigned int YEAR0; /*系统当前年份除4整数*/
unsigned int YEAR4; /*系统当前年份除4余数*/
unsigned int tmp_data,byte_addr,t_data,r_data,flag_iic,flag_data;
extern void transmit();
extern void clock_transmit(int ch);
extern void receive();
extern void start();
extern void tingzhi();
extern void slave_ack();
extern void master_ack();
extern void no_ack();
extern void iic_dly();
extern void CLOCK_IOinit();
extern void read_iic();
extern void write_iic();
extern void byte_wr();
extern void init_8583();
extern void PCF8583Init_time();
extern void SetTimeToPCF8583();
extern unsigned int millisecond_set,millisecond_get;
extern unsigned int millisecond_gewei;
extern unsigned int millisecond_js;
extern unsigned int second_set,second_get;
extern unsigned int minute_set,minute_get;
extern unsigned int hour_set,hour_get;
extern unsigned int week_set,week_get;
extern unsigned int day_set,day_get;
extern unsigned int month_set,month_get;
extern unsigned int year_set,year_get;
extern unsigned int yearflag;
extern unsigned int Time[32]; //存放时钟的变量
extern unsigned int DiShiQi_1S;
extern int lgctestext;
extern int samptest1;
//读取时钟芯片PCF8583的时间
/****iic各子程序****/
void read_iic() /*读取各时间单元*/
{
int i;
start(); /*启动子程序*/
tmp_data = DEVSELWR; /*I2C器件写操作命令*/
transmit(); /*字节发送写控制字*/
slave_ack(); /*读从机应答*/
byte_addr = 0x01; /*各时间单元8583内开始地址*/
tmp_data = byte_addr;
transmit();
slave_ack();
start();
tmp_data = DEVSELRD; /*I2C器件读操作命令*/
transmit();
slave_ack();
receive();
ms_data = tmp_data; /*接收的字节送毫秒单元*/
master_ack();
receive();
sec_data = tmp_data; /*接收的字节送秒单元*/
master_ack();
receive();
min_data = tmp_data; /*接收的字节送分单元*/
master_ack();
receive();
hour_data = tmp_data; /*接收的字节送时单元*/
master_ack();
receive();
yd_data = tmp_data; /*接收的字节送年单元*/
master_ack();
receive();
mon_data = tmp_data; /*接收的字节送月单元*/
for (i=1;i<32;i++)
{
receive();
Time[i] = tmp_data; /*接收的字节送年单元*/
master_ack();
}
no_ack();
tingzhi();
ms_data1=ms_data;
sec_data1=sec_data;
min_data1=min_data;
hour_data1=hour_data;
yd_data1=yd_data;
mon_data1=mon_data;
}
void write_iic()
{
start();
tmp_data=DEVSELWR;
transmit();
slave_ack();
byte_addr=0x01;
tmp_data=byte_addr; /*各时间单元8583内开始地址*/
transmit();
slave_ack();
tmp_data=ms_data;
//tmp_data=100;
transmit();
slave_ack();
tmp_data=sec_data;
//tmp_data=59;
transmit();
slave_ack();
tmp_data=min_data;
//tmp_data=49;
transmit();
slave_ack();
tmp_data=hour_data;
//tmp_data=12;
transmit();
slave_ack();
tmp_data=yd_data;
//tmp_data=2005;
transmit();
slave_ack();
tmp_data=mon_data;
//tmp_data=11;
transmit();
slave_ack();
tingzhi();
}
/*字节写*/
void byte_wr()
{
start();
tmp_data = DEVSELWR;
transmit();
slave_ack();
tmp_data = byte_addr;
transmit();
slave_ack();
tmp_data = t_data;
transmit();
slave_ack();
tingzhi();
}
/*字节读*/
void byte_rd()
{
start();
tmp_data = DEVSELWR;
transmit();
slave_ack();
tmp_data = byte_addr;
transmit();
slave_ack();
start();
tmp_data = DEVSELRD;
transmit();
slave_ack();
receive();
r_data = tmp_data;
no_ack();
tingzhi();
}
/*发送子程序*/
void transmit()
{
int i;
//CLOCK_SCL=0; /*SCL=0*/
SCL_0();
iic_dly();
for( i=0; i<8; i++ )
{
if( (tmp_data & 0x0080) == 0 )
{
SDA_0(); /*SDA=0*/
}
else
{
SDA_1(); /*SDA=1*/
}
iic_dly();
SCL_1(); /*SCL=1*/
iic_dly();
SCL_0(); /*SCL=0*/
tmp_data = tmp_data << 1;
}
}
/*接收子程序*/
void receive()
{
int i;
tmp_data = 0;
PFDATDIR = PFDATDIR&0xDFFF;// SDA为输入
iic_dly();
for( i=0; i<8; i++ )
{
SCL_1(); /*SCL=1*/
iic_dly();
//tmp_data = (tmp_data << 1) + ( (PFDATDIR & DATAH) >> 2 );//????/
//hour_data1=CLOCK_SDA;
//hour_data1=GpioDataRegs.GPADAT.all;
tmp_data=(tmp_data << 1)+((PFDATDIR&0x0020)>>5);
//tmp_data=(tmp_data << 1)+(GpioDataRegs.GPADAT.all& DATAH)>>4;
iic_dly();
SCL_0(); /*SCL=0*/
iic_dly();
}
PFDATDIR = PFDATDIR|0x2000;// SDA为输出
}
void start()
{
PFDATDIR = PFDATDIR|0x2000;// SDA为输出
// PFDATDIR = PFDATDIR | DATACLOCKH; /*SDA=SCL=1*/
SDA_1();
SCL_1();
iic_dly();
//PFDATDIR = PFDATDIR & DATAL; /*SDA=0*/
SDA_0();
iic_dly();
//PFDATDIR = PFDATDIR & CLOCKL; /*SCL=0*/
SCL_0();
}
void tingzhi()
{
SDA_0(); /*SDA=0*/
iic_dly();
SCL_1(); /*SCL=1*/
iic_dly();
SDA_1(); /*SDA=1*/
iic_dly();
SCL_0(); /*SCL=0*/
}
void slave_ack()
{
SDA_1(); /*SDA=1*/
iic_dly();
//delay()
//PFDATDIR = PFDATDIR & DATAINPUT; /*SDA设为输入*/
PFDATDIR = PFDATDIR&0xDFFF;// SDA为输入
iic_dly();
SCL_1(); /*SCL=1*/
iic_dly();
if( ((PFDATDIR&0x0020)>>5) == 0 ) //????/
{
//PFDATDIR = (PFDATDIR | DATAOUTPUT) & DATACLOCKL;
PFDATDIR = PFDATDIR|0x2000;// SDA为输出
SDA_0();
SCL_0();
}
else
{
asm(" nop ");
asm(" nop ");
asm(" nop ");/*添加应答错误处理程序*/
}
PFDATDIR = PFDATDIR|0x2000;// SDA为输出
}
void master_ack()
{
//PFDATDIR = PFDATDIR & DATAL; /*SDA=0*/
SDA_0();
no_ack();
}
void no_ack()
{
//PFDATDIR = PFDATDIR | CLOCKH; /*SCL=1*/
SCL_1();
iic_dly();
//PFDATDIR = PFDATDIR & CLOCKL; /*SCL=0*/
SCL_0();
}
void iic_dly()
{
//asm(" rpt #1h ");
delay(360);
asm(" nop ");
asm(" nop ");
}
void init_8583()
{
r_data=0xff;
byte_addr=0x00;
t_data=0x00;
byte_wr();
byte_rd();
ms_data=0x02;
sec_data=0x03;
min_data=0x04;
hour_data=0x05;
yd_data=0x01;
mon_data=0x06;
ms_data1=0xff;
sec_data1=0xff;
min_data1=0xff;
hour_data1=0xff;
yd_data1=0xff;
mon_data1=0xff;
delay(360);
write_iic();
//loop:
delay(36000);
read_iic();
asm ( " nop " );
asm ( " nop " );
asm ( " nop " );
// goto loop;
}
void clock_transmit(int ch)
{
int i;
SCL_0(); /*SCL=0*/
iic_dly();
for( i=0; i<8; i++ )
{
if( (ch & 0x0080) == 0 )
{
SDA_0(); /*SDA=0*/
}
else
{
SDA_1(); /*SDA=1*/
}
iic_dly();
SCL_1(); /*SCL=1*/
iic_dly();
SCL_0(); /*SCL=0*/
ch = ch << 1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -