?? rtc.c
字號:
/*******************************************************************************
* 標(biāo)題: 藍(lán)海微芯LJD-SY-5200單片機開發(fā)系統(tǒng)演示程序 *
* 文件: RTC.C *
* 日期: 2006-7-25 *
* 版本: 1.0 *
* 作者: 藍(lán)海微芯 *
* 網(wǎng)站: http://www.ljd-2008.com *
********************************************************************************
* 描述: *
* 通過8位數(shù)碼管顯示當(dāng)前的時間包括時分秒,通過時間設(shè)置鍵可對當(dāng)前的時間 *
* 進(jìn)行設(shè)置。共有兩個設(shè)置按鍵按鍵1和按鍵2;按鍵1為選定鍵。按鍵1首次被 *
* 按下時鐘停止走時并且秒時間開始閃爍,此時可通過按鍵2對秒時間進(jìn)行設(shè)置, *
* 按鍵2按下一次秒時間數(shù)值加一。當(dāng)按鍵1第二次被按下時分時間被選中并不停 *
* 地閃爍,此時通過按鍵2可對分時間進(jìn)行設(shè)置,按鍵2按下一次分時間加一。 *
* 按鍵第三次被按下時小時時間被選中并且不停的閃爍,此時通過按鍵2可對小 *
* 時時間進(jìn)行設(shè)置,按鍵2每按下一次小時時間加一。按鍵1第四次被按下后時間 *
* 設(shè)置結(jié)束,時鐘從設(shè)定的時間開始走時。 *
* *
* *
********************************************************************************
* 【版權(quán)】 Copyright(C)微芯科技 http://www.bluemcu.com All Rights Reserved *
* 【聲明】 此程序僅用于學(xué)習(xí)與參考,引用請注明版權(quán)和作者信息! *
*******************************************************************************/
#include <reg52.h>
#include<stdio.h>
#include<absacc.h>
#include<intrins.h>
/*須主程序定義的參數(shù)*/
#define CH451_RESET 0x0201 /*復(fù)位*/
#define CH451_LEFTMOV 0x0300 /*設(shè)置移動方式-作移*/
#define CH451_LEFTCYC 0x0301 /*設(shè)置移動方式-左循*/
#define CH451_RIGHTMOV 0x0302 /*設(shè)置移動方式-右移*/
#define CH451_RIGHTCYC 0x0303 /*設(shè)置移動方式-右循*/
#define CH451_SYSOFF 0x0400 /*關(guān)顯示、鍵盤、看門狗*/
#define CH451_SYSON1 0x0401 /*開顯示*/
#define CH451_SYSON2 0x0403 /*開顯示、鍵盤*/
#define CH451_SYSON3 0x0407 /*開顯示、鍵盤、看門狗功能*/
#define CH451_DSP 0x0500 /*設(shè)置默認(rèn)顯示方式*/
#define CH451_BCD 0x0580 /*設(shè)置BCD譯碼方式*/
#define CH451_TWINKLE 0x0600 /*設(shè)置閃爍控制*/
#define CH451_DIG0 0x0800 /*數(shù)碼管位0顯示*/
#define CH451_DIG1 0x0900 /*數(shù)碼管位1顯示*/
#define CH451_DIG2 0x0a00 /*數(shù)碼管位2顯示*/
#define CH451_DIG3 0x0b00 /*數(shù)碼管位3顯示*/
#define CH451_DIG4 0x0c00 /*數(shù)碼管位4顯示*/
#define CH451_DIG5 0x0d00 /*數(shù)碼管位5顯示*/
#define CH451_DIG6 0x0e00 /*數(shù)碼管位6顯示*/
#define CH451_DIG7 0x0f00 /*數(shù)碼管位7顯示*/
/*如果使用鍵盤中斷請定義
#define USE_KEY */
#define uchar unsigned char
#define uint unsigned int
sbit T_CLK = P1^1; /*實時時鐘時鐘線引腳 */
sbit T_IO = P1^0; /*實時時鐘數(shù)據(jù)線引腳 */
sbit T_RST = P1^3; /*實時時鐘復(fù)位線引腳 */
sbit ch451_din = P1^0;
sbit ch451_clk = P1^1;
sbit ch451_load = P1^2;
sbit ch451_dout = P3^3;
sbit P1_3 = P1^3;
sbit P1_5 = P1^5;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
uchar M;
uchar N;
uchar ch451_key;
uchar key_flag;
/*void RTInputByte(uchar); /* 輸入 1Byte */
/*uchar RTOutputByte(void); /* 輸出?1Byte */
/*void W1302(uchar, uchar);
/*uchar R1302(uchar);
/*void Set1302(uchar *); /* 設(shè)置時間 */
/*void Get1302(uchar curtime[]); /* 讀取1302當(dāng)前時間 */
uchar SClock[3];
/********************************************************************
函 數(shù) 名:RTInputByte()
功 能:實時時鐘寫入一字節(jié)
說 明:往DS1302寫入1Byte數(shù)據(jù) (內(nèi)部函數(shù))
入口參數(shù):d 寫入的數(shù)據(jù)
返 回 值:無
設(shè) 計:藍(lán)海微芯
***********************************************************************/
void RTInputByte(uchar d)
{
uchar i;
ACC = d;
for(i=8; i>0; i--)
{
T_IO = ACC0; /*相當(dāng)于匯編中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/********************************************************************
函 數(shù) 名:RTOutputByte()
功 能:實時時鐘讀取一字節(jié)
說 明:從DS1302讀取1Byte數(shù)據(jù) (內(nèi)部函數(shù))
入口參數(shù):無
返 回 值:ACC
設(shè) 計:藍(lán)海微芯
***********************************************************************/
uchar RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; /*相當(dāng)于匯編中的 RRC */
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/********************************************************************
函 數(shù) 名:W1302()
功 能:往DS1302寫入數(shù)據(jù)
說 明:先寫地址,后寫命令/數(shù)據(jù) (內(nèi)部函數(shù))
調(diào) 用:RTInputByte() , RTOutputByte()
入口參數(shù):ucAddr: DS1302地址, ucData: 要寫的數(shù)據(jù)
返 回 值:無
設(shè) 計:藍(lán)海微芯
***********************************************************************/
void W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
RTInputByte(ucDa); /* 寫1Byte數(shù)據(jù)*/
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
函 數(shù) 名:R1302()
功 能:讀取DS1302某地址的數(shù)據(jù)
說 明:先寫地址,后讀命令/數(shù)據(jù) (內(nèi)部函數(shù))
調(diào) 用:RTInputByte() , RTOutputByte()
入口參數(shù):ucAddr: DS1302地址
返 回 值:ucData :讀取的數(shù)據(jù)
設(shè) 計:藍(lán)海微芯
***********************************************************************/
uchar R1302(uchar ucAddr)
{
uchar ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
ucData = RTOutputByte(); /* 讀1Byte數(shù)據(jù) */
T_CLK = 1;
T_RST = 0;
return(ucData);
}
/********************************************************************
函 數(shù) 名:Set1302()
功 能:設(shè)置初始時間
說 明:先寫地址,后讀命令/數(shù)據(jù)(寄存器多字節(jié)方式)
調(diào) 用:W1302()
入口參數(shù):pClock: 設(shè)置時鐘數(shù)據(jù)
地址格式為: 秒 分 時 日 月 星期 年
7Byte (BCD碼)1B 1B 1B 1B 1B 1B 1B
返 回 值:無
設(shè) 計:藍(lán)海微芯
***********************************************************************/
void Set1302(uchar *pClock)
{
uchar i;
uchar ucAddr = 0x80;
W1302(0x8e,0x00); /* 控制命令,WP=0,寫操作?*/
for(i =3; i>0; i--)
{
W1302(ucAddr,*pClock); /* 秒 分 時 日 月 星期 年 */
pClock++;
ucAddr +=2;
}
W1302(0x8e,0x80); /* 控制命令,WP=1,寫保護(hù)?*/
}
/********************************************************************
函 數(shù) 名:Get1302()
功 能:讀取DS1302當(dāng)前時間
說 明:
調(diào) 用:R1302()
入口參數(shù):ucCurtime: 保存當(dāng)前時間地址。
當(dāng)前時間格式為: 秒 分 時 日 月 星期 年
7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B
返 回 值:無
設(shè) 計:藍(lán)海微芯
***********************************************************************/
void Get1302(uchar ucCurtime[])
{
uchar i;
uchar ucAddr = 0x81;
for (i=0; i<3; i++)
{
ucCurtime[i] = R1302(ucAddr); /*格式為: 秒 分 時 日 月 星期 年 */
ucAddr += 2;
}
}
/********************************************************************
函 數(shù) 名:ch451_bcd()
功 能:對從DS1302讀取的時間值進(jìn)行轉(zhuǎn)化
說 明:把一字節(jié)的BCD碼格式的時間值分成兩字節(jié)
調(diào) 用:
入口參數(shù):ds_bcd
返 回 值:
設(shè) 計:藍(lán)海微芯
***********************************************************************/
void ch451_bcd(uchar ds_bcd)
{
M = ds_bcd&0xf0;
M>>=4;
N = ds_bcd&0x0f;
}
/********************************************************************
函 數(shù) 名:ch451_init()
功 能:對ch451芯片進(jìn)行初始化
說 明:
調(diào) 用:
入口參數(shù):
返 回 值:
設(shè) 計:藍(lán)海微芯
***********************************************************************/
void ch451_init(void)
{
ch451_din = 0; /*先低后高,選擇4線輸入*/
ch451_din = 1;
ch451_load = 1;
ch451_clk = 1;
_nop_();
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -