?? pcf8563.c
字號(hào):
//************************************************************************
// pcf8563.c: 24/11/2006
//
// 外部程序會(huì)調(diào)用到的函數(shù)有:
// pcf_init,pcf_set_time,pcf_get_time
// pcf_clkout_start,pcf_clkout_stop,pcf_timer_start,pcf_timer_stop
//
//***************************************************************************
#include "msp430x14x.h"
#include "pcf8563.h"
//定義全局變量
char pcf_bcon1; //Control/Status1
char pcf_bcon2; //Control/Status2
char pcf_bsecond; //Seconds
char pcf_bminute; //Minutes
char pcf_bhour; //Hours
char pcf_bday; //Days
char pcf_bweek; //Weekdays
char pcf_bmonth; //Months/Century
char pcf_byear; // Years
char pcf_bminutealarm; //Minute alarm
char pcf_bhouralarm; //Hour alarm
char pcf_bdayalarm; //Day alarm
char pcf_bweekalarm; //Weekday alarm
char pcf_bclkoutfreq; //CLKOUT frequency
char pcf_btimerfreq; //Timer control
char pcf_btimer; //Timer countdown value
char pcf_b10ms; //
unsigned int pcf_wdate; //儲(chǔ)存seconds,minutes,hours
unsigned int pcf_wtime; //儲(chǔ)存days,months,years
/****************************************************************************/
/* 開始iic總線 */
/* Function : iic_start */
/* Input : none */
/* Output : none */
/* Description : */
/* SDA置高、SCL置高、SDA置低、SCL置低, */
/****************************************************************************/
void iic_start ( void )
{
P3DIR &= ~PCF_SDA; //SDA置高
P3DIR &= ~PCF_SCL; //SCL置高
P3DIR |= PCF_SDA; //SDA置低,同時(shí)把SDA管腳設(shè)為輸出
P3DIR |= PCF_SCL; //SCL置低
}
/*******************************************************************************/
/* 停止iic總線 */
/* Function : iic_stop */
/* Input : none */
/* Output : none */
/* Description : SDA置低、SCL置高、SDA置高 */
/* 說明:程序中是通過設(shè)置P口的方向寄存器來實(shí)現(xiàn)SDA、SCL置高和置低的 */
/* 由于有上拉電平,所以當(dāng)P口是輸入時(shí)為高電平,當(dāng)切換為輸出模式時(shí),P口 */
/* 默認(rèn)輸出低電平。 */
/*******************************************************************************/
void iic_stop (void )
{
P3DIR |= PCF_SDA; //SDA置低
P3DIR &= ~PCF_SCL; //SCL置高
P3DIR &= ~PCF_SDA; //SDA置高
}
/*******************************************************************************/
/* 發(fā)送確認(rèn)信息 SEND ACKNOWLEDGE */
/* Function : iic_set_ack */
/* Input : none */
/* Output : none */
/* Description : */
/* SCL置低、SDA置低、SCL置高、SCL置低、SDA置高; */
/* 表示從機(jī)收到一個(gè)字節(jié) */
/*******************************************************************************/
void iic_set_ack ( void )
{
P3DIR |= PCF_SCL;
P3DIR |= PCF_SDA;
P3DIR &= ~PCF_SCL;
P3DIR |= PCF_SCL;
P3DIR &= ~PCF_SDA;
}
/*******************************************************************************/
/* Send NAK(not acknowledge) */
/* Function : iic_set_nak */
/* Input : none */
/* Output : none */
/* Description : */
/* SCL置低、SDA置高、SCL置高、SCL置低; */
/*******************************************************************************/
void iic_set_nak ( void )
{
P3DIR |= PCF_SCL;
P3DIR &= ~PCF_SDA;
P3DIR &= ~PCF_SCL;
P3DIR |= PCF_SCL;
}
/*******************************************************************************/
/* 獲取應(yīng)答信息(從機(jī)是否收到) */
/* Function : iic_get_ack */
/* Input : none */
/* Output : int */
/* Description : SCL置低,SCLP置高, */
/* 判斷SDA是否為低,為低時(shí)(收到ACK)返回1,SCL置低 */
/*******************************************************************************/
char iic_get_ack ( void )
{
char temp = 0;
P3DIR |= PCF_SCL; //SCL置低
P3DIR &= ~PCF_SCL; //SCL置高
_NOP();
_NOP();
if ( !(P3IN & PCF_SDA) ) // SDA=0 ?
{
P3DIR |= PCF_SCL; //if SDA=0,表示收到ACKNOWLEDGE
temp = 1;
}
return(temp);
}
/*******************************************************************************/
/* 從PCF8563讀取一個(gè)字節(jié)到MSP430,接受順序是從MSB到LSB */
/* Function : ziic_read */
/* Input : none */
/* Output : char -- 讀到的字節(jié) */
/* Description : */
/* SCL置高、讀SDA數(shù)據(jù)、SCL置低、SCL置高、讀SDA數(shù)據(jù)...... */
/*******************************************************************************/
char ziic_read( void )
{
char value = 0;
char i;
for(i = 0;i<8;i++)
{
P3DIR &= ~PCF_SCL; //SCL置高
_NOP();
_NOP();
if(P3IN & PCF_SDA) // SDA=1 ?
value |= (0x01 << (7-i));
P3DIR |= PCF_SCL; //SCL置低
}
return (value);
}
/*******************************************************************************/
/* 將MSP430中的一個(gè)字節(jié)寫入PCF8563(順序從MSB到LSB) */
/* Function : ziic_write */
/* Input : char value -- 待寫入PCF8563的字節(jié) */
/* Output : none */
/* Description : */
/* 寫SDA數(shù)據(jù)、SCL置高、SCL置低......寫SDA數(shù)據(jù)、SCL置高、SCL置低 */
/*******************************************************************************/
void ziic_write( char value )
{
char i;
for(i = 0;i<8;i++)
{
if (value & 0x80)
P3DIR &= ~PCF_SDA; //value該位為1,SDA置高
else
P3DIR |= PCF_SDA; //value該位為0,SDA置低
P3DIR &= ~PCF_SCL; //SCL置高
_NOP();
_NOP();
P3DIR |= PCF_SCL; //SCL置低
_NOP();
_NOP();
value <<= 1; //value左移1位
}
P3DIR &= ~PCF_SDA; //SDA置高,并把SDA管腳設(shè)為輸入
}
/*******************************************************************************/
/* 從PCF8563中讀取數(shù)據(jù)到MSP430中 */
/* Function : ziic_page_read */
/* Input : char *adrmsp -- 接收數(shù)組的首地址 */
/* char num -- 讀取的字節(jié)數(shù) */
/* char adrpcf -- PCF8563內(nèi)部寄存器的首地址 */
/* Output : none */
/* Description : */
/* 從PCF8563內(nèi)部第adrpcf個(gè)寄存器開始讀取num個(gè)字節(jié),保存在MSP430的adrsmp數(shù)組中 */
/* MSP430寫完一個(gè)字節(jié),就要getack,以獲得對方的反應(yīng); */
/* MSP430讀完一個(gè)字節(jié),發(fā)送setack,告知對方,發(fā)送有效; */
/* 讀完最后一個(gè)字節(jié)時(shí) 發(fā)送setnak,告知對方,不必發(fā)送; */
/*******************************************************************************/
void ziic_page_read ( char *adrmsp,char num,char adrpcf )
{
char flag = 1;
char i;
while (flag)
{
P3OUT &= ~PCF_SCL;
P3OUT &= ~PCF_SDA; // INITIATE SCL&SDA LOW
iic_start(); // 啟動(dòng)IIC總線
ziic_write( 0x0A2 ); // 發(fā)送PCF8563 write slave address(0A2h)給PCF8563
if (!(iic_get_ack())) // iic_get_ack()= 0?
continue; // 如果沒有收到ACK則跳轉(zhuǎn),重發(fā)一次
ziic_write( adrpcf ); // 發(fā)送PCF8563內(nèi)部寄存器起始地址
if (!(iic_get_ack()))
continue; // 如果沒有收到ACK則跳轉(zhuǎn),重發(fā)一次
iic_start(); // 啟動(dòng)IIC總線
ziic_write( 0x0A3 ); // 發(fā)送PCF8563 read slave address(0A3h)給PCF8563
if ( iic_get_ack() ) // iic_get_ack()=1?
flag = 0; // if iic_get_ack()=1,flag置0,結(jié)束循環(huán)
}
for (i = 0;i<num;i++)
{
adrmsp[i] = ziic_read(); // 把PCF8563內(nèi)寄存器的數(shù)據(jù)讀到MSP430中
iic_set_ack(); // MSP430發(fā)送ACK
} // PCF8563的寄存器可自動(dòng)增量,不需軟件操作了
iic_set_nak(); // MSP430發(fā)送NAK,表示不讀了
iic_stop();
}
/*******************************************************************************/
/* 從MSP430中寫數(shù)據(jù)到PCF8563中 */
/* Function : ziic_page_write */
/* Input : char *adrmsp -- 待發(fā)送數(shù)組的首地址 */
/* char num -- 待發(fā)送的字節(jié)數(shù) */
/* char adrpcf -- 待寫入的PCF8563內(nèi)部寄存器的首地址 */
/* Output : none */
/* Description : */
/* 把430中darmsp[]數(shù)組中的字節(jié)寫入PCF8563內(nèi)部的寄存器 */
/*******************************************************************************/
void ziic_page_write ( char *adrmsp,char num,char adrpcf )
{
char flag = 1;
char i;
while (flag)
{
P3OUT &= ~PCF_SCL;
P3OUT &= ~PCF_SDA; // INITIATE SCL&SDA LOW
iic_start(); // 啟動(dòng)IIC總線
ziic_write( 0x0A2 ); // 發(fā)送PCF8563 write slave address(0A2h)給PCF8563
if(!(iic_get_ack())) //
continue; // 如果沒有收到ACK則跳轉(zhuǎn),重發(fā)一次
ziic_write ( adrpcf ); // 發(fā)送PCF8563內(nèi)部寄存器起始地址
if(iic_get_ack())
flag = 0; //if iic_get_ack()=1, 跳出循環(huán)
}
for (i = 0;i<num;)
{
ziic_write ( adrmsp[i] ); // 把430內(nèi)部RAM中的數(shù)據(jù)寫入PCF8563寄存器
if (!(iic_get_ack()))
continue; // 如果沒有收到ACK則跳轉(zhuǎn),重發(fā)一次
i++; // 如果收到ACK,繼續(xù)發(fā)送下一個(gè)字節(jié)
} // PCF8563的寄存器可自動(dòng)增量,不需軟件操作了
iic_stop(); //停止總線
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -