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