?? pcf8563.c
字號:
#include"PCF8563.h"
#include "Flash.h"
#include"array.h"
//Time SysTime;//系統時間。
//Time NewTime;//更新使用的緩沖區,在設置時間是使用
unsigned char g8563_store[7];
const uchar c8563_Store[7]={0x00,0x59,0x07,0x01};
void Init_Clk()
{
CLKSCL_OUT; //CLK為輸出狀態
CLKSDA_OUT;
CLKSDA_1;
CLKSCL_1;
}
void P8563_init()
{
if((receive_CFGbyte(HOUR_ALARM)&0X3F)!=0x00) /*檢查是否第一次啟動,是則初始化時間*/
{
msDelay(5000);
write_CFGbyte(0x00,0x00);
write_CFGbyte(HOUR_ALARM ,0x00); /*小時報警*/
write_CFGbyte(MIN_ALARM ,0x05); /*分鐘報警*///(正式工作程序)
//write_CFGbyte(MIN_ALARM ,0x81); //測試工作程序
//write_CFGbyte(MIN_ALARM ,0x05); //測試
write_CFGbyte(0x01,0x12); /*報警有效*/
write_CFGbyte(0x02,0x50);
write_CFGbyte(0x03,0x30);
write_CFGbyte(0x04,0x23);
write_CFGbyte(0x05,0x01);
write_CFGbyte(0x06,0x01);
write_CFGbyte(0x07,0x01);
write_CFGbyte(0x08,0x01);
write_CFGbyte(0x0d,0x00);
//write_CFGbyte(0x0d,0xf0);
}
}
void P8563_Readtime()
{
unsigned char time[7];
Read_buffclk(MIN,7,time);
g8563_store[0]=time[0]&0x7f; /*秒*/
g8563_store[1]=time[1]&0x7f; /*分*/
g8563_store[2]=time[2]&0X3f; /*小時*/
g8563_store[3]=time[3]&0x3f; /*天*/
g8563_store[4]=time[4]&0x07; /*星期*/
g8563_store[5]=time[5]&0x1f; /*月*/
g8563_store[6]=time[6]; /*年*/
}
void iic_start(void)
{
CLKSDA_OUT;
CLKSDA_1; //將數據置1
CLKSCL_1;
NOP10;
CLKSDA_0; //啟動
NOP2;
CLKSCL_0; //clk start
NOP8;
}
// 函數名稱: iic_stop()
// 函數功能: 停止I2C總線數據傳送子程序
void iic_stop(void)
{
CLKSDA_OUT;
CLKSCL_1;
CLKSDA_0;
NOP8;
CLKSDA_1;
}
void iic_NoAcknowledge(void)
{
CLKSDA_1;
CLKSCL_1;
NOP10;
CLKSDA_0;
CLKSCL_0;
}
void iic_Acknowledge(void)
{
CLKSCL_0;
NOP10;
CLKSDA_OUT;
CLKSDA_0;
CLKSCL_1;
NOP10;
CLKSCL_0;
}
void iic_ReceiveAck(void) //送回應脈沖
{
uchar i = 0;
CLKSDA_1;
CLKSDA_IN;
CLKSCL_1;
NOP4;
while (CLKSDA_VAL&& (i < 100))i++;
CLKSCL_0;
NOP8;
}
void IICSendByte( uchar writedata)
{
uchar i;
CLKSDA_OUT;
NOP4;
for(i=0; i<8; i++)
{
if (writedata & BIT7)
{CLKSDA_1;}
else
{CLKSDA_0;};
writedata <<= 1;
CLKSCL_1;
NOP10;
CLKSCL_0;
NOP10;
}
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: IICreceiveByte
// 返回接收的數據
// 函數功能: 接收一字節子程序
//--------------------------------------------------------------------------------------------------
uchar IICreceiveByte(void)
{
uchar i,tempdata=0;
CLKSDA_1;
CLKSDA_IN;
for (i=0; i<8; i++)
{
CLKSCL_1;
NOP10;
tempdata <<= 1;
if (CLKSDA_VAL)
tempdata |= 1;
CLKSCL_0;
NOP10;
}
return tempdata;
}
// 用戶調用子程序
// 函數名稱: write_CFGbyte
// 入口參數: CFG_add寄存器地址,CFG_data要寫入寄存器的數值
// 函數功能: 發送n位數據子程序
//--------------------------------------------------------------------------------------------------
void write_CFGbyte(uchar addr,uchar data)
{
iic_start();
IICSendByte(WRITE_ADD); //寫地址
iic_ReceiveAck();
IICSendByte(addr); //寫低地址
iic_ReceiveAck();
IICSendByte(data);
iic_ReceiveAck();
iic_stop();
Delay(4800);
}
//--------------------------------------------------- ----------------------------------------------
// 用戶調用子程序
// 函數名稱: receiveNbyte
// 入口參數: CFG_add寄存器地址地址
// 出口參數: receive_da
// 函數功能: 接收某個寄存器數據子程序
//--------------------------------------------------------------------------------------------------
uchar receive_CFGbyte(uchar addr)
{
uchar tempdata;
iic_start();
IICSendByte(WRITE_ADD); //寫地址
iic_ReceiveAck();
IICSendByte(addr); //寫低地址
iic_ReceiveAck();
iic_start();
IICSendByte(READ_ADD); //讀地址
iic_ReceiveAck();
tempdata = IICreceiveByte();
iic_stop();
Delay(4800);
return tempdata;
}
//寫一組數據到IIC中
/***
void Write_buffclk(uchar addr, uchar len,uchar * buff)
{
uchar idx;
iic_start();
IICSendByte(WRITE_ADD); //寫地址
iic_ReceiveAck();
IICSendByte(addr); //寫低地址
iic_ReceiveAck();
for (idx=0;idx< len;idx++)
{
IICSendByte(buff[idx]);
iic_ReceiveAck();
}
iic_stop();
Delay(4800);
}
***/
//讀一組數據到存儲區
void Read_buffclk(uchar addr, uchar len,uchar * buff)
{
uchar idx;
for(idx=0;idx<len;idx++)
{
buff[idx]= receive_CFGbyte(addr++);
Delay(100);
}
}
//--------------------------------------------------------------------------------------------------
// 用戶調用函數
// 函數名稱: P8563_Readtime
// 函數功能: 讀出時間信息
//--------------------------------------------------------------------------------------------------
/***設置時間的子程序*******/
/**
void P8563_settime()
{
unsigned char i;
for(i=2;i<=4;i++) { write_CFGbyte(i,g8563_store[i-2]); }
write_CFGbyte(6,0X01);
//write_CFGbyte(6,g8563_store[3]);
}
****/
//時間的格式為 44個字節
void ReadTimeDate(uchar *str) //讀取的時間格式 ,通過短信格式發送出去
{
uchar i,nChar;
uchar *buff;
buff =str;
P8563_Readtime();
nChar =((g8563_store[5]>>4)&0x0f)*4;
g8563_store[5]=(g8563_store[5]&0x0f)*4;
for(i=0;i<4;i++)
buff[i]=row43[nChar+i];
for(i=0;i<4;i++)
buff[i+4]=row43[g8563_store[5]+i];
for(i=0;i<4;i++)
buff[i+8]=row40[i];
nChar =((g8563_store[3]>>4)&0x0f)*4;
g8563_store[3]=(g8563_store[3]&0x0f)*4;
for(i=0;i<4;i++)
buff[i+12]=row43[nChar+i];
for(i=0;i<4;i++)
buff[i+16]=row43[g8563_store[3]+i];
for(i=0;i<4;i++)
buff[i+20]=row40[i];
nChar =((g8563_store[2]>>4)&0x0f)*4;
g8563_store[2]=(g8563_store[2]&0x0f)*4;
for(i=0;i<4;i++)
buff[i+24]=row43[nChar+i];
for(i=0;i<4;i++)
buff[i+28]=row43[g8563_store[2]+i];
for(i=0;i<4;i++)
buff[i+32]=row42[i];
nChar =((g8563_store[1]>>4)&0x0f)*4;
g8563_store[1]=(g8563_store[1]&0x0f)*4;
for(i=0;i<4;i++)
buff[i+36]=row43[nChar+i];
for(i=0;i<4;i++)
buff[i+40]=row43[g8563_store[1]+i];
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -