?? 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 + -