?? ds1302.lst
字號:
C51 COMPILER V7.06 DS1302 07/24/2006 09:31:56 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN ds1302.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ds1302.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /********************************************************************
2 模塊名稱:DS1302.c
3 功 能:實時時鐘模塊 時鐘芯片型號:DS1302
4 designer:yinyuanjun
5 *********************************************************************/
6 #include <stc89c54rd+.h>
7
8 sbit T_CLK = P1^2; /*實時時鐘時鐘線引腳 */
9 sbit T_IO = P1^3; /*實時時鐘數據線引腳 */
10 sbit T_RST = P1^4; /*實時時鐘復位線引腳 */
11
12 sbit ACC0 = ACC^0;
13 sbit ACC7 = ACC^7;
14
15 void RTInputByte(unsigned char); /* 輸入 1Byte */
16 unsigned char RTOutputByte(void); /* 輸出?1Byte */
17 void W1302(unsigned char, unsigned char);
18 unsigned char R1302(unsigned char);
19 void Set1302(unsigned char *); /* 設置時間 */
20 void Bcd2asc(unsigned char,unsigned char *);
21 void Get1302(unsigned char curtime[]); /* 讀取1302當前時間 */
22 /********************************************************************
23 函 數 名:RTInputByte()
24 功 能:實時時鐘寫入一字節
25 說 明:往DS1302寫入1Byte數據 (內部函數)
26 入口參數:d 寫入的數據
27 designer:yinyuanjun
28 ***********************************************************************/
29 void RTInputByte(unsigned char d)
30 {
31 1 unsigned char i;
32 1 ACC = d;
33 1 for(i=8; i>0; i--)
34 1 {
35 2 T_IO = ACC0; /*相當于匯編中的 RRC */
36 2 T_CLK = 1;
37 2 T_CLK = 0;
38 2 ACC = ACC >> 1;
39 2 }
40 1 }
41 /********************************************************************
42 函 數 名:RTOutputByte()
43 功 能:實時時鐘讀取一字節
44 說 明:從DS1302讀取1Byte數據 (內部函數)
45 入口參數:無
46 返 回 值:ACC
47 designer:yinyuanjun
48 ***********************************************************************/
49 unsigned char RTOutputByte(void)
50 {
51 1 unsigned char i;
52 1 for(i=8; i>0; i--)
53 1 {
54 2 ACC = ACC >>1; /*相當于匯編中的 RRC */
55 2 ACC7 = T_IO;
C51 COMPILER V7.06 DS1302 07/24/2006 09:31:56 PAGE 2
56 2 T_CLK = 1;
57 2 T_CLK = 0;
58 2 }
59 1 return(ACC);
60 1 }
61 /********************************************************************
62 函 數 名:W1302()
63 功 能:往DS1302寫入數據
64 說 明:先寫地址,后寫命令/數據 (內部函數)
65 調 用:RTInputByte() , RTOutputByte()
66 入口參數:ucAddr: DS1302地址, ucData: 要寫的數據
67 返 回 值:無
68 designer:yinyuanjun
69 ***********************************************************************/
70 void W1302(unsigned char ucAddr, unsigned char ucDa)
71 {
72 1 T_RST = 0;
73 1 T_CLK = 0;
74 1 T_RST = 1;
75 1 RTInputByte(ucAddr); /* 地址,命令 */
76 1 RTInputByte(ucDa); /* 寫1Byte數據*/
77 1 T_CLK = 1;
78 1 T_RST = 0;
79 1 }
80 /********************************************************************
81 函 數 名:R1302()
82 功 能:讀取DS1302某地址的數據
83 說 明:先寫地址,后讀命令/數據 (內部函數)
84 調 用:RTInputByte() , RTOutputByte()
85 入口參數:ucAddr: DS1302地址
86 返 回 值:ucData :讀取的數據
87 designer:yinyuanjun
88 ***********************************************************************/
89 unsigned char R1302(unsigned char ucAddr)
90 {
91 1 unsigned char ucData;
92 1 T_RST = 0;
93 1 T_CLK = 0;
94 1 T_RST = 1;
95 1 RTInputByte(ucAddr); /* 地址,命令 */
96 1 ucData = RTOutputByte(); /* 讀1Byte數據 */
97 1 T_CLK = 1;
98 1 T_RST = 0;
99 1 return(ucData);
100 1 }
101 /********************************************************************
102 函 數 名:BurstW1302T()
103 功 能:往DS1302寫入時鐘數據(多字節方式)
104 說 明:先寫地址,后寫命令/數據
105 調 用:RTInputByte()
106 入口參數:pWClock: 時鐘數據地址
107 格式為: 秒 分 時 日 月 星期 年 控制
108 8Byte (BCD碼)1B 1B 1B 1B 1B 1B 1B 1B
109 返 回 值:無
110 designer:yinyuanjun
111 ***********************************************************************/
112 void BurstW1302T(unsigned char *pWClock)
113 {
114 1 unsigned char i;
115 1 W1302(0x8e,0x00); /* 控制命令,WP=0,寫操作?*/
116 1 T_RST = 0;
117 1 T_CLK = 0;
C51 COMPILER V7.06 DS1302 07/24/2006 09:31:56 PAGE 3
118 1 T_RST = 1;
119 1 RTInputByte(0xbe); /* 0xbe:時鐘多字節寫命令 */
120 1 for (i = 8; i>0; i--) /*8Byte = 7Byte 時鐘數據 + 1Byte 控制*/
121 1 {
122 2 RTInputByte(*pWClock); /* 寫1Byte數據*/
123 2 pWClock++;
124 2 }
125 1 T_CLK = 1;
126 1 T_RST = 0;
127 1 }
128 /********************************************************************
129 函 數 名:BurstR1302T()
130 功 能:讀取DS1302時鐘數據
131 說 明:先寫地址/命令,后讀數據(時鐘多字節方式)
132 調 用:RTInputByte() , RTOutputByte()
133 入口參數:pRClock: 讀取時鐘數據地址
134 格式為: 秒 分 時 日 月 星期 年
135 7Byte (BCD碼)1B 1B 1B 1B 1B 1B 1B
136 返 回 值:無
137 designer:yinyuanjun
138 ***********************************************************************/
139 void BurstR1302T(unsigned char *pRClock)
140 {
141 1 unsigned char i;
142 1 T_RST = 0;
143 1 T_CLK = 0;
144 1 T_RST = 1;
145 1 RTInputByte(0xbf); /* 0xbf:時鐘多字節讀命令 */
146 1 for (i=8; i>0; i--)
147 1 {
148 2 *pRClock = RTOutputByte(); /* 讀1Byte數據 */
149 2 pRClock++;
150 2 }
151 1 T_CLK = 1;
152 1 T_RST = 0;
153 1 }
154 /********************************************************************
155 函 數 名:BurstW1302R()
156 功 能:往DS1302寄存器數寫入數據(多字節方式)
157 說 明:先寫地址,后寫數據(寄存器多字節方式)
158 調 用:RTInputByte()
159 入口參數:pWReg: 寄存器數據地址
160 返 回 值:無
161 designer:yinyuanjun
162 ***********************************************************************/
163 void BurstW1302R(unsigned char *pWReg)
164 {
165 1 unsigned char i;
166 1 W1302(0x8e,0x00); /* 控制命令,WP=0,寫操作*/
167 1 T_RST = 0;
168 1 T_CLK = 0;
169 1 T_RST = 1;
170 1 RTInputByte(0xfe); /* 0xbe:時鐘多字節寫命令 */
171 1 for (i=31; i>0; i--) /* 31Byte 寄存器數據 */
172 1 {
173 2 RTInputByte(*pWReg); /* 寫1Byte數據*/
174 2 pWReg++;
175 2 }
176 1 T_CLK = 1;
177 1 T_RST = 0;
178 1 }
179 /********************************************************************
C51 COMPILER V7.06 DS1302 07/24/2006 09:31:56 PAGE 4
180 函 數 名:BurstR1302R()
181 功 能:讀取DS1302寄存器數據
182 說 明:先寫地址,后讀命令/數據(寄存器多字節方式)
183 調 用:RTInputByte() , RTOutputByte()
184 入口參數:pRReg: 寄存器數據地址
185 designer:yinyuanjun
186 ***********************************************************************/
187 void BurstR1302R(unsigned char *pRReg)
188 {
189 1 unsigned char i;
190 1 T_RST = 0;
191 1 T_CLK = 0;
192 1 T_RST = 1;
193 1 RTInputByte(0xff); /* 0xff:時鐘多字節讀命令 */
194 1 for (i=31; i>0; i--) /*31Byte 寄存器數據 */
195 1 {
196 2 *pRReg = RTOutputByte(); /* 讀1Byte數據 */
197 2 pRReg++;
198 2 }
199 1 T_CLK = 1;
200 1 T_RST = 0;
201 1 }
202 /********************************************************************
203 函 數 名:Set1302()
204 功 能:設置初始時間
205 說 明:先寫地址,后讀命令/數據(寄存器多字節方式)
206 調 用:W1302()
207 入口參數:pClock: 設置時鐘數據
208 地址格式為: 秒 分 時 日 月 星期 年
209 7Byte (BCD碼)1B 1B 1B 1B 1B 1B 1B
210 designer:yinyuanjun
211 ***********************************************************************/
212 void Set1302(unsigned char *pClock)
213 {
214 1 unsigned char i;
215 1 unsigned char ucAddr = 0x80;
216 1 W1302(0x8e,0x00); /* 控制命令,WP=0,寫操作?*/
217 1 for(i =7; i>0; i--)
218 1 {
219 2 W1302(ucAddr,*pClock); /* 秒 分 時 日 月 星期 年 */
220 2 pClock++;
221 2 ucAddr +=2;
222 2 }
223 1 W1302(0x8e,0x80); /* 控制命令,WP=1,寫保護?*/
224 1 }
225 /********************************************************************
226 函 數 名:Get1302()
227 功 能:讀取DS1302當前時間
228 調 用:R1302()
229 入口參數:ucCurtime: 保存當前時間地址。
230 當前時間格式為: 秒 分 時 日 月 星期 年
231 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B
232 designer:yinyuanjun
233 ***********************************************************************/
234 void Get1302(unsigned char ucCurtime[])
235 {
236 1 unsigned char i;
237 1 unsigned char ucAddr = 0x81;
238 1 for (i=0; i<7; i++)
239 1 {
240 2 ucCurtime[i] = R1302(ucAddr);/*格式為: 秒 分 時 日 月 星期 年 */
241 2 ucAddr += 2;
C51 COMPILER V7.06 DS1302 07/24/2006 09:31:56 PAGE 5
242 2 }
243 1 }
244
245
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 284 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 4
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -