|
#include #include #define mcuport2 P2 #define mcuport1 P1 unsigned char pd; /*********************************************************************/ sbit T_CLK="P0"^7; /*實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳 */ sbit T_IO="P0"^6; /*實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳 */ sbit T_RST="P0"^5; /*實(shí)時(shí)時(shí)鐘復(fù)位線引腳 */ sbit ACC0=ACC^0; sbit ACC7=ACC^7; //lcd引腳聲明 /**************************************************/ sbit rs="P0"^0; sbit rw="P0"^1; sbit e="P0"^3; /******************************************************************** * * 名稱: v_RTInputByte * 說明: * 功能: 往DS1302寫入1Byte數(shù)據(jù) * 調(diào)用: * 輸入: ucDa 寫入的數(shù)據(jù) * 返回值: 無 ***********************************************************************/ void v_RTInputByte(unsigned char ucDa) { unsigned char i; ACC = ucDa; for(i="8"; i>0; i--) { T_IO = ACC0; /*相當(dāng)于匯編中的 RRC */ T_CLK = 1; T_CLK = 0; ACC = ACC >> 1; } } /******************************************************************** * * 名稱: uchar uc_RTOutputByte * 說明: * 功能: 從DS1302讀取1Byte數(shù)據(jù) * 調(diào)用: * 輸入: * 返回值: ACC ***********************************************************************/ unsigned char uc_RTOutputByte(void) { unsigned char i; for(i="8"; i>0; i--) { ACC = ACC >>1; /*相當(dāng)于匯編中的 RRC */ ACC7 = T_IO; T_CLK = 1; T_CLK = 0; } return(ACC); } /******************************************************************** * * 名稱: v_W1302 * 說明: 先寫地址,后寫命令/數(shù)據(jù) * 功能: 往DS1302寫入數(shù)據(jù) * 調(diào)用: v_RTInputByte() * 輸入: ucAddr: DS1302地址, ucDa: 要寫的數(shù)據(jù) * 返回值: 無 ***********************************************************************/ void v_W1302(unsigned char ucAddr, unsigned char ucDa) { T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(ucAddr); /* 地址,命令 */ v_RTInputByte(ucDa); /* 寫1Byte數(shù)據(jù)*/ T_CLK = 1; T_RST =0; } /******************************************************************** * * 名稱: uc_R1302 * 說明: 先寫地址,后讀命令/數(shù)據(jù) * 功能: 讀取DS1302某地址的數(shù)據(jù) * 調(diào)用: v_RTInputByte() , uc_RTOutputByte() * 輸入: ucAddr: DS1302地址 * 返回值: ucDa :讀取的數(shù)據(jù) ***********************************************************************/ unsigned char uc_R1302(unsigned char ucAddr) { unsigned char ucDa; T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(ucAddr); /* 地址,命令 */ ucDa = uc_RTOutputByte(); /* 讀1Byte數(shù)據(jù) */ T_CLK = 1; T_RST =0; return(ucDa); } /******************************************************************** * * 名稱: v_BurstW1302T * 說明: 先寫地址,后寫數(shù)據(jù)(時(shí)鐘多字節(jié)方式) * 功能: 往DS1302寫入時(shí)鐘數(shù)據(jù)(多字節(jié)方式) * 調(diào)用: v_RTInputByte() * 輸入: pSecDa: 時(shí)鐘數(shù)據(jù)地址 格式為: 秒 分 時(shí) 日 月 星期 年 控制 * 8Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B 1B * 返回值: 無 ***********************************************************************/ void v_BurstW1302T(unsigned char *pSecDa) { unsigned char i; v_W1302(0x8e,0x00); /* 控制命令,WP="0",寫操作?*/ T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(0xbe); /* 0xbe:時(shí)鐘多字節(jié)寫命令 */ for (i="8";i>0;i--) /*8Byte = 7Byte 時(shí)鐘數(shù)據(jù) + 1Byte 控制*/ { v_RTInputByte(*pSecDa);/* 寫1Byte數(shù)據(jù)*/ pSecDa++; } T_CLK = 1; T_RST =0; } /******************************************************************** * * 名稱: v_BurstR1302T * 說明: 先寫地址,后讀命令/數(shù)據(jù)(時(shí)鐘多字節(jié)方式) * 功能: 讀取DS1302時(shí)鐘數(shù)據(jù) * 調(diào)用: v_RTInputByte() , uc_RTOutputByte() * 輸入: pSecDa: 時(shí)鐘數(shù)據(jù)地址 格式為: 秒 分 時(shí) 日 月 星期 年 * 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B * 返回值: ucDa :讀取的數(shù)據(jù) ***********************************************************************/ void v_BurstR1302T(unsigned char *pSecDa) { unsigned char i; T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(0xbf); /* 0xbf:時(shí)鐘多字節(jié)讀命令 */ for (i="8"; i>0; i--) { *pSecDa = uc_RTOutputByte(); /* 讀1Byte數(shù)據(jù) */ pSecDa++; } T_CLK = 1; T_RST =0; } /******************************************************************** * * 名稱: v_BurstW1302R * 說明: 先寫地址,后寫數(shù)據(jù)(寄存器多字節(jié)方式) * 功能: 往DS1302寄存器數(shù)寫入數(shù)據(jù)(多字節(jié)方式) * 調(diào)用: v_RTInputByte() * 輸入: pReDa: 寄存器數(shù)據(jù)地址 * 返回值: 無 ***********************************************************************/ void v_BurstW1302R(unsigned char *pReDa) { unsigned char i; v_W1302(0x8e,0x00); /* 控制命令,WP="0",寫操作?*/ T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(0xfe); /* 0xbe:時(shí)鐘多字節(jié)寫命令 */ for (i="31";i>0;i--) /*31Byte 寄存器數(shù)據(jù) */ { v_RTInputByte(*pReDa); /* 寫1Byte數(shù)據(jù)*/ pReDa++; } T_CLK = 1; T_RST =0; } /******************************************************************** * * 名稱: uc_BurstR1302R * 說明: 先寫地址,后讀命令/數(shù)據(jù)(寄存器多字節(jié)方式) * 功能: 讀取DS1302寄存器數(shù)據(jù) * 調(diào)用: v_RTInputByte() , uc_RTOutputByte() * 輸入: pReDa: 寄存器數(shù)據(jù)地址 * 返回值: 無 ***********************************************************************/ void v_BurstR1302R(unsigned char *pReDa) { unsigned char i; T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(0xff); /* 0xbf:時(shí)鐘多字節(jié)讀命令 */ for (i="31"; i>0; i--) /*31Byte 寄存器數(shù)據(jù) */ { *pReDa = uc_RTOutputByte(); /* 讀1Byte數(shù)據(jù) */ pReDa++; } T_CLK = 1; T_RST =0; } /******************************************************************** * * 名稱: v_Set1302 * 說明: * 功能: 設(shè)置初始時(shí)間 * 調(diào)用: v_W1302() * 輸入: pSecDa: 初始時(shí)間地址。初始時(shí)間格式為: 秒 分 時(shí) 日 月 星期 年 * 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B * 返回值: 無 ***********************************************************************/ void v_Set1302(unsigned char *pSecDa) { unsigned char i;
unsigned char ucAddr = 0x80; v_W1302(0x8e,0x00); /* 控制命令,WP="0",寫操作?*/ for(i =7;i>0;i--) { v_W1302(ucAddr,*pSecDa); /* 秒 分 時(shí) 日 月 星期 年 */ pSecDa++; ucAddr +=2; } v_W1302(0x8e,0x80); /* 控制命令,WP="1",寫保護(hù)?*/ } /******************************************************************** * * 名稱: v_Get1302 * 說明: * 功能: 讀取DS1302當(dāng)前時(shí)間 * 調(diào)用: uc_R1302() * 輸入: ucCurtime: 保存當(dāng)前時(shí)間地址。當(dāng)前時(shí)間格式為: 秒 分 時(shí) 日 月 星期 年 * 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B * 返回值: 無 ***********************************************************************/ void v_Get1302(unsigned char ucCurtime[]) { unsigned char i; unsigned char ucAddr = 0x81; for (i="0";i<7;i++) { ucCurtime[i] = uc_R1302(ucAddr);/*格式為: 秒 分 時(shí) 日 月 星期 年 */ ucAddr += 2; } } /********************************************************************************/ //lcd寫命令使能 /********************************************************************************/ void enable(void) { unsigned char j,k; rs="0"; rw="0"; _nop_(); e="0"; for(k="10";k>0;k--) for(j="245";j>0;j--); e="1"; } /*******************************************************************************/ //lcd寫數(shù)據(jù)使能 /*******************************************************************************/ void writer(void) { unsigned char j,k; rs="1"; rw="0"; _nop_(); e="0"; for(k="10";k>0;k--) for(j="245";j>0;j--); e="1"; }
/******************************************************************************/ //初始化 /******************************************************************************/ void start(void) { mcuport2=0x01; // enable(); mcuport2=0x01; // enable(); mcuport2=0x38; enable(); mcuport2=0x0f; enable(); mcuport2=0x06; enable(); } /*************************************************************************** 延時(shí)40MS ****************************************************************************/ void delay40ms(void) { unsigned char i,j; for(i="40";i>0;i--) for(j="248";j>0;j--); } /***************************************************************************/ unsigned char key4x4() { unsigned char temp; unsigned char key,keydata; keydata="0xff"; while(keydata==0xff) { keydata="0xff"; mcuport1=0xff; mcuport1=mcuport1&0xef; temp="mcuport1"; temp="temp"&0x0f; if (temp!=0x0f) { delay40ms(); temp="mcuport1"; temp="temp"&0x0f; if (temp!=0x0f) { temp="mcuport1"; temp="temp"&0x0f; switch(temp) { case 0x0e: key="0"; break; case 0x0d: key="1"; break; case 0x0b: key="2"; break; case 0x07: key="3"; break; } keydata="key"; } } mcuport1=0xff; mcuport1=mcuport1&0xdf; temp="mcuport1"; temp="temp"&0x0f; if (temp!=0x0f) { delay40ms(); temp="mcuport1"; temp="temp"&0x0f; if (temp!=0x0f) { temp="mcuport1"; temp="temp"&0x0f; switch(temp) { case 0x0e: key="4"; break; case 0x0d: key="5"; break; case 0x0b: key="6"; break; case 0x07: key="7"; break; } keydata="key"; } } mcuport1=0xff; mcuport1=mcuport1&0xbf; temp="mcuport1"; temp="temp"&0x0f; if (temp!=0x0f) { delay40ms(); temp="P3"; temp="temp"&0x0f; if (temp!=0x0f) { temp="mcuport1"; temp="temp"&0x0f; switch(temp) { case 0x0e: key="8"; break; case 0x0d: key="9"; break; case 0x0b: key="10"; break; case 0x07: key="11"; break; } keydata="key"; } } mcuport1=0xff; mcuport1=mcuport1&0x7f; temp="mcuport1"; temp="temp"&0x0f; if (temp!=0x0f) { delay40ms(); temp="mcuport1"; temp="temp"&0x0f; if (temp!=0x0f) { temp="mcuport1"; temp="temp"&0x0f; switch(temp) { case 0x0e: key="12"; break; case 0x0d: key="13"; break; case 0x0b: key="14"; break; case 0x07: key="15"; break; } keydata="key"; } } } return(keydata); } void main(void) { unsigned char modify[]={0x8a,0x8b,0x8d,0x8e,0xc5,0xc6,0xc8,0xc9,0xcb,0xcc}; unsigned char ts1302[]={0x00,0x00,0x00,0x18,0x07,0x03,0x05};//初始話碼表 unsigned char table[]={'0','1','2','3','4','5','6','7','8','9'};//數(shù)字ASCII碼表 unsigned char get1302[7]; unsigned char appear[]={'D','A','T','A',':','2','0','0','0','/','0','0', '/','0','0','!','T','I','M','E',':','0','0','/','0','0','/', '0','0'}; //顯示碼表 unsigned char data i,j; char data n; unsigned char data ii,ts,keydata1; //循環(huán)顯示計(jì)數(shù)值 EA="1"; EX0=1; v_Set1302(&ts1302[0]); start(); while(1) { mcuport1=0x7f; if(pd==1) { keydata1=0x00; EA="0"; while(keydata1!=15) { keydata1=key4x4(); switch(keydata1) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: switch(ii) //檢測(cè)到1-9,執(zhí)行相同的命令 { case 0: if(keydata1<2) //對(duì)月份的高位進(jìn)行修改 { mcuport2=modify[ii];enable(); mcuport2=table[keydata1];writer(); ts1302[4]=(ts1302[4]&0x0f)+(keydata1*16); v_Set1302(&ts1302[0]); mcuport2=modify[ii];enable(); } break; case 1:ts=(ts1302[4]&0xf0)+keydata1; //對(duì)月份的低位進(jìn)行修改 if(ts<0x13) { mcuport2=modify[ii];enable(); mcuport2=table[keydata1];writer(); ts1302[4]=ts; v_Set1302(&ts1302[0]); mcuport2=modify[ii];enable(); } break; case 2: //對(duì)日的高位進(jìn)行修改 if(keydata1<4) { mcuport2=modify[ii];enable(); mcuport2=table[keydata1];writer(); ts1302[3]=(ts1302[3]&0x0f)+(keydata1*16); v_Set1302(&ts1302[0]); mcuport2=modify[ii];enable(); } break; case 3:ts=(ts1302[3]&0xf0)+keydata1; //對(duì)日的低位進(jìn)行修改 if(ts<0x32) { mcuport2=modify[ii];enable(); mcuport2=table[keydata1];writer(); ts1302[3]=ts; v_Set1302(&ts1302[0]); mcuport2=modify[ii];enable(); } break; case 4: //對(duì)小時(shí)的高位進(jìn)行修改 if(keydata1<3) { mcuport2=modify[ii];enable(); mcuport2=table[keydata1];writer(); ts1302[2]=(ts1302[2]&0x0f)+(keydata1*16); v_Set1302(&ts1302[0]); mcuport2=modify[ii];enable(); } break; case 5:ts=(ts1302[2]&0xf0)+keydata1; //對(duì)小時(shí)的低位進(jìn)行修改 if(ts<0x25) { mcuport2=modify[ii];enable(); mcuport2=table[keydata1];writer(); ts1302[2]=ts; v_Set1302(&ts1302[0]); mcuport2=modify[ii];enable(); } break; case 6:if(keydata1<7) //對(duì)分的高位進(jìn)行修改 { mcuport2=modify[ii];enable(); mcuport2=table[keydata1];writer(); ts1302[1]=(ts1302[1]&0x0f)+(keydata1*16); v_Set1302(&ts1302[0]); mcuport2=modify[ii];enable(); } break; case 7:ts=(ts1302[1]&0xf0)+keydata1; //對(duì)分的低位進(jìn)行修改 if(ts<0x61) { mcuport2=modify[ii];enable(); mcuport2=table[keydata1];writer(); ts1302[1]=ts; v_Set1302(&ts1302[0]); mcuport2=modify[ii];enable(); } break; case 8:if(keydata1<7) //對(duì)秒的高位進(jìn)行修改 { mcuport2=modify[ii];enable(); mcuport2=table[keydata1];writer(); ts1302[0]=(ts1302[0]&0x0f)+(keydata1*16); v_Set1302(&ts1302[0]); mcuport2=modify[ii];enable(); } break; case 9:ts=(ts1302[0]&0xf0)+keydata1; //對(duì)秒的低位進(jìn)行修改 if(ts<0x61) { mcuport2=modify[ii];enable(); mcuport2=table[keydata1];writer(); ts1302[0]=ts; v_Set1302(&ts1302[0]); mcuport2=modify[ii];enable(); } break; } break; case 14: mcuport1=0x7f; while(mcuport1!=0x7f); ii="ii"+1; if(ii>9){ii="0";}mcuport2=modify[ii];enable();break; case 13: mcuport1=0x7f; while(mcuport1!=0x7f); ii="ii"-1; if(ii>9){ii="9";} mcuport2=modify[ii]; enable(); break; case 10: case 11: case 12: case 15: mcuport1=0x7f; while(mcuport1!=0x7f); break; //default: exit(0); } } EA="1"; EX0=1; pd="0"; EA="1"; mcuport1=0x7f; } /*********************************************************************/ for(i="20";i>0;i--) for(j="245";j>0;j--); //一段延時(shí) v_Get1302(get1302); appear[7]=table[(get1302[6]&0xf0)/16]; appear[8]=table[get1302[6]&0x0f]; appear[10]=table[(get1302[4]&0xf0)/16]; appear[11]=table[get1302[4]&0x0f]; appear[13]=table[(get1302[3]&0xf0)/16]; appear[14]=table[get1302[3]&0x0f]; appear[21]=table[(get1302[2]&0xf0)/16]; appear[22]=table[get1302[2]&0x0f]; appear[24]=table[(get1302[1]&0xf0)/16]; appear[25]=table[get1302[1]&0x0f]; appear[27]=table[(get1302[0]&0xf0)/16]; appear[28]=table[get1302[0]&0x0f];//修改顯示碼表 mcuport2=0x80; enable(); mcuport2=0x80; enable(); for(n="0";n<16;n++) { mcuport2=appear[n]; writer(); } mcuport2=0xc0; enable(); mcuport2=0xc0; enable(); for(n="16";n<29;n++) { mcuport2=appear[n]; writer(); //lcd顯示控制 } } } void int0(void) interrupt 0 { EA="0"; delay40ms(); pd="1"; } |