|
#include <REGX52.H>
#include <intrins.h>
#define SomeNOP() _nop_();_nop_();_nop_();_nop_()
#define SM_DAT P0
#define SM_CS P2
sbit TIME_CE=P1^2;
sbit SDA =P1^0;
sbit SCL =P1^1;
UBYTE code dis_add[6]={0xf8,0xf9,0xfa,0xfb,0xfc,0xfd};
UBYTE code dis_data[10]={0x3f,0x30,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示0-9數(shù)字
UBYTE Sec,Min,Hou;
UBYTE data_buffer[6]={0,0,0,0,0,0};
/*********************************************************************
* 名稱: v_RTInputUBYTE
* 說(shuō)明:
* 功能: 往DS1302寫入1UBYTE數(shù)據(jù)
* 調(diào)用:
* 輸入: ucDa 寫入的數(shù)據(jù)
* 返回值: 無(wú)
***********************************************************************/
void v_RTInputUBYTE(UBYTE ucDa)
{
BYTE i;
ACC = ucDa;
for(i=8; i>0; i--)
{
SDA = a0;
SCL = 1;
SCL = 0;
ACC = ACC >> 1;
}
}
/********************************************************************
*
* 名稱: UBYTE uc_RTOutputUBYTE
* 說(shuō)明:
* 功能: 從DS1302讀取1UBYTE數(shù)據(jù)
* 調(diào)用:
* 輸入:
* 返回值: ACC
***********************************************************************/
UBYTE uc_RTOutputUBYTE(void)
{
BYTE i;
ACC=0;
TIME_CE=1;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
a7 = SDA;
SCL = 1;
SCL = 0;
}
return(ACC);
}
/********************************************************************
*
* 名稱: v_W1302
* 說(shuō)明: 先寫地址,后寫命令/數(shù)據(jù)
* 功能: 往DS1302寫入數(shù)據(jù)
* 調(diào)用: v_RTInputUBYTE()
* 輸入: ucAddr: DS1302地址, ucDa: 要寫的數(shù)據(jù)
* 返回值: 無(wú)
***********************************************************************/
void v_W1302(UBYTE ucAddr, UBYTE ucDa)
{
TIME_CE = 0;
SCL = 0;
TIME_CE = 1;
v_RTInputUBYTE(ucAddr); /* 地址,命令 */
v_RTInputUBYTE(ucDa); /* 寫1UBYTE數(shù)據(jù)*/
SCL = 1;
TIME_CE =0;
}
/********************************************************************
*
* 名稱: uc_R1302
* 說(shuō)明: 先寫地址,后讀命令/數(shù)據(jù)
* 功能: 讀取DS1302某地址的數(shù)據(jù)
* 調(diào)用: v_RTInputUBYTE() , uc_RTOutputUBYTE()
* 輸入: ucAddr: DS1302地址
* 返回值: ucDa :讀取的數(shù)據(jù)
***********************************************************************/
UBYTE uc_R1302(UBYTE ucAddr)
{
UBYTE ucDa;
TIME_CE = 0;
SCL = 0;
TIME_CE = 1;
v_RTInputUBYTE(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputUBYTE(); /* 讀1UBYTE數(shù)據(jù) */
SCL = 1;
TIME_CE =0;
return(ucDa);
}
/********************************************************************
*
* 名稱: msec
* 說(shuō)明:
* 功能: 延時(shí)程序
* 調(diào)用:
* 輸入: 延時(shí)多少時(shí)間
* 返回值: 無(wú)
***********************************************************************/
void msec(UWORD x)
{
UWORD j;
while (x--)
{
for(j=0;j<125;j++);
}
}
/********************************************************************
*
* 名稱: data_buff
* 說(shuō)明:
* 功能: 數(shù)據(jù)處理
* 調(diào)用:
* 輸入:
* 返回值: 無(wú)
***********************************************************************/
void data_buff(void)
{ UBYTE h,m,s;
h=Hou&0xf0;
h>>=4;
data_buffer[0]=h;
data_buffer[1]=Hou&0x0f;
m=Min&0xf0;
m>>=4;
data_buffer[2]=m;
data_buffer[3]=Min&0x0f;
s=Sec&0xf0;
s>>=4;
data_buffer[4]=s;
data_buffer[5]=Sec&0x0f;
}
/********************************************************************
*
* 名稱: dis_play
* 說(shuō)明:
* 功能: 數(shù)碼管顯示
* 調(diào)用: mse()
* 輸入:
* 返回值: 無(wú)
***********************************************************************/
void dis_play(void)
{ UBYTE i;
UBYTE dat=0;
for(i=0;i<6;i++)
{
P2=dis_add[5-i];
dat=data_buffer[i];
if(i%2==0)
{
P0=dis_data[dat];
}
else if(i==5)
{
P0=dis_data[dat];
}
else
P0=dis_data[dat]|0x80;
SomeNOP();
msec(2);
}
}
/********************************************************************
*
* 名稱: v_Set1302
* 說(shuō)明:
* 功能: 設(shè)置初始時(shí)間
* 調(diào)用: v_W1302()
* 輸入: pSecDa: 初始時(shí)間地址。初始時(shí)間格式為: 秒 分 時(shí) 日 月 星期 年
* 7UBYTE (BCD碼) 80 82 84 86 88 8a 8c 寫狀態(tài)
81 83 85 87 89 8b 8d 讀狀態(tài)
* 返回值: 無(wú)
***********************************************************************/
void v_Set1302(void)
{
v_W1302(0x8e,0x00); /* 控制命令,WP=0,寫操作*/
Sec=0x00;
Min=0x43;
Hou=0x17;
v_W1302(0x80,Sec);
v_W1302(0x82,Min);
v_W1302(0x84,Hou);
v_W1302(0x8e,0x80); /* 控制命令,WP=1,寫保護(hù)*/
}
/********************************************************************
*
* 名稱: main
* 說(shuō)明:
* 功能: 設(shè)置時(shí)間初始值,讀取DS1302時(shí)間通過(guò)數(shù)碼管顯示
* 調(diào)用: v_Set1302(),uc_R1302(),data_buff(),dis_play()
* 輸入:
* 返回值: 無(wú)
***********************************************************************/
void main(void)
{
TIME_CE=0;
//v_Set1302();/*設(shè)置時(shí)間初始值*/
//v_W1302(0x8e,0x80); /* 控制命令,WP=1,寫保護(hù)*/
while(1)
{
Sec= uc_R1302(0x81);/* 秒 */
Min= uc_R1302(0x83);/* 分 */
Hou= uc_R1302(0x85);/* 時(shí) */
data_buff();
dis_play();
}
}
|
|