?? 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 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 P1_3 = P1^3;
sbit P1_5 = P1^5;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
uchar M;
uchar N;
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;
}
}
/********************************************************************
函 數 名:ds1302主程序
功 能:讀取ds1302的時間值并通過數碼管進行顯示
說 明:
調 用:
入口參數:
返 回 值:
設 計:藍海微芯
***********************************************************************/
void SET_RTC(void)
{
Get1302(&SClock); /*把當前的時間值讀取到數組SClock[3]中去*/
SClock[0]|=0x80; /*使ds1302的時間停止運行*/
Set1302(SClock);
// ch451_key = 0xff;
key_flag++;
if(key_flag==4)
{
key_flag = 0;
// ch451_write(0x600);
SClock[0]&=0x7f;
Set1302(SClock);
}
switch(key_flag)
{
case 1:
//ch451_write(0x6C0); /*讓秒顯示位進行閃爍*/
break;
case 2:
//ch451_write(0x618); /*讓分顯示位進行閃爍*/
break;
case 3:
//ch451_write(0x603); /*讓小時顯示位進行閃爍*/
break;
default:break;
}
}
/********************************************************************
函 數 名:SET_TIME()
功 能:根據按鍵值&按鍵被按下的次數作相應的處理
說 明:
調 用:
入口參數:
返 回 值:
設 計:藍海微芯
***********************************************************************/
void SET_TIME(void)
{
switch(key_flag)
{
case 1:
SClock[0]&=0x7f;
// ch451_bcd(SClock[0]); /*將秒顯示位的十位和個位進行分離*/
N++; /*秒值加一*/
if(N==10)
{
N = 0;
M++;
if(M==6)
{
M = 0;
}
}
M<<=4;
SClock[0] = M|N|0x80;
W1302(0x8e,0x00); /*控制命令,wp=0,可以進行寫操作*/
W1302(0x80, SClock[0]); /*將修改過的秒值寫到ds1302中*/
// ch451_key=0xff;
break;
case 2:
// ch451_bcd(SClock[1]); /*將分顯示位的十位和個位進行分離*/
N++; /*分值加一*/
if(N==10)
{
N = 0;
M++;
if(M==6)
{
M = 0;
}
}
M<<=4;
SClock[1] = M|N;
W1302(0x8e,0x00); /*控制命令,wp=0,可以進行寫操作*/
W1302(0x82, SClock[1]); /*將修改過的分值寫到ds1302中*/
// ch451_key=0xff;
break;
case 3:
// ch451_bcd(SClock[2]); /*將小時顯示位的十位和個位進行分離*/
N++; /*小時值加一*/
if(N==4)
{
if(M==2) /*小時十位為2時個位最大值不能超過3*/
{
M = 0;
N = 0;
}
}
if(N==10)
{
N = 0;
M++;
}
M<<=4;
SClock[2] = M|N;
W1302(0x8e,0x00); /*控制命令,wp=0,可以進行寫操作*/
W1302(0x84,SClock[2]); /*將修改過的分值寫到ds1302中*/
// ch451_key=0xff;
break;
default:break;
}
// ch451_key = 0xff;
}
/********************************************************************
函 數 名:ds1302主程序
功 能:讀取ds1302的時間值并通過數碼管進行顯示
說 明:
調 用:
設 計:藍海微芯
***********************************************************************/
main()
{
uchar WClock[3]={0x00,0x01,0x02};
uchar RClock[3];
uchar ds_hour;
uchar ds_min;
uchar ds_sec;
P1_3 = 1;
P1_5 = 1;
Set1302(WClock); /*對ds1302顯示的時間初值進行設定*/
// ch451_init(); /*對ch451進行初始化*/
// ch451_write(0x403); /*關看門狗開鍵盤顯示*/
// ch451_write(0x580); /*以譯碼方式進行顯示*/
// ch451_write(CH451_DIG5|0x12); /*數碼管的第2位顯示"-"*/
// ch451_write(CH451_DIG2|0x12); /*數碼管的第7位顯示"-"*/
// ch451_key = 0xff;
key_flag = 0;
EA = 1;
EX1 =1;
while(1)
{
// if(ch451_key==0x5A) /*判斷設置按鍵是否按下*/
// {
// SET_RTC();
// }
// if((key_flag!=0)&&(ch451_key==0x59))/*判斷修改時間鍵是否被按下*/
// {
// SET_TIME();
// }
Get1302(&RClock); /*獲取當前時間值*/
ds_sec = RClock[0]&0x7f; /*得到當前時間秒值*/
ds_min = RClock[1]; /*得到當前時間分值*/
ds_hour = RClock[2]; /*得到當前時間小時值*/
// ch451_bcd(ds_hour); /*對小時值進行轉化*/
// ch451_write(CH451_DIG0|M); /*寫小時高位*/
// ch451_write(CH451_DIG1|N); /*寫小時低位*/
// ch451_bcd(ds_min); /*對分鐘值進行轉化*/
// ch451_write(CH451_DIG3|M); /*寫分鐘高位*/
// ch451_write(CH451_DIG4|N); /*寫分鐘低位*/
// ch451_bcd(ds_sec); /*對秒值進行轉化*/
// ch451_write(CH451_DIG6|M); /*寫秒值高位*/
// ch451_write(CH451_DIG7|N); /*寫秒值低位*/
}
}
/*********************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -