📄 ds1302.lst
字号:
C51 COMPILER V7.00 DS1302 09/14/2006 16:35:49 PAGE 1
C51 COMPILER V7.00, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN DS1302.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DS1302.c OPTIMIZE(9,SIZE) BROWSE ORDER DEBUG OBJECTEXTEND
stmt level source
1 /***************************************************
2 * 文件名:DS1302.C
3 ***************************************************/
4 #include "REG51STC.H"
5 #include "CMD16887.H"
6 #include "externxy.h"
7 #include<intrins.h>
8 /*********************************************************************
9
10 公司名称:
11 模块名称:DS1302.c
12 功 能:实时时钟模块 时钟芯片型号:DS1302
13 说 明:
14 程序设计:jiangmaozhou
15 设计时间:2006.04.02
16 版 本 号: 20060402
17 *********************************************************************/
18 sbit ACC0 = ACC^0;
19 sbit ACC7 = ACC^7;
20 /********************************************************************
21
22 函 数 名:RTInputByte()
23 功 能:实时时钟写入一字节
24 说 明:往DS1302写入1Byte数据 (内部函数)
25 入口参数:d 写入的数据
26 返 回 值:无
27 设 计:jiangmaozhou 日 期:2006-03-19
28 修 改: 日 期:
29 ***********************************************************************/
30 void RTInputByte(uchar d)
31 {
32 1 uchar i;
33 1 ACC = d;
34 1 for(i=8; i>0; i--)
35 1 {
36 2 T_IO = ACC0;_nop_(); //相当于汇编中的 RRC
37 2 T_CLK = 1;_nop_();
38 2 T_CLK = 0;
39 2 ACC = ACC >> 1;
40 2 }
41 1 }
42 /********************************************************************
43
44 函 数 名:RTOutputByte()
45 功 能:实时时钟读取一字节
46 说 明:从DS1302读取1Byte数据 (内部函数)
47 入口参数:无
48 返 回 值:ACC
49 设 计:jiangmaozhou 日 期:2002-03-19
50 修 改: 日 期:
51 ***********************************************************************/
52 uchar RTOutputByte(void)
53 {
54 1 uchar i;
55 1 for(i=8; i>0; i--)
C51 COMPILER V7.00 DS1302 09/14/2006 16:35:49 PAGE 2
56 1 {
57 2 ACC = ACC >>1; //相当于汇编中的 RRC
58 2 ACC7 = T_IO;_nop_();
59 2 T_CLK = 1;_nop_();
60 2 T_CLK = 0;
61 2 }
62 1 return(ACC);
63 1 }
64 /********************************************************************
65
66 函 数 名:W1302()
67 功 能:往DS1302写入数据
68 说 明:先写地址,后写命令/数据 (内部函数)
69 调 用:RTInputByte() , RTOutputByte()
70 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
71 返 回 值:无
72 设 计:jiangmaozhou 日 期:2002-03-19
73 修 改: 日 期:
74 ***********************************************************************/
75 void W1302(uchar ucAddr, uchar ucDa)
76 {
77 1 T_RST = 0;_nop_();
78 1 T_CLK = 0;_nop_();
79 1 T_RST = 1;
80 1 RTInputByte(ucAddr); /* 地址,命令 */
81 1 RTInputByte(ucDa); /* 写1Byte数据*/
82 1 T_CLK = 1;_nop_();
83 1 T_RST = 0;
84 1 }
85 /********************************************************************
86
87 函 数 名:R1302()
88 功 能:读取DS1302某地址的数据
89 说 明:先写地址,后读命令/数据 (内部函数)
90 调 用:RTInputByte() , RTOutputByte()
91 入口参数:ucAddr: DS1302地址
92 返 回 值:ucData :读取的数据
93 设 计:jiangmaozhou 日 期:2002-03-19
94 修 改: 日 期:
95 ***********************************************************************/
96 uchar R1302(uchar ucAddr)
97 {
98 1 uchar ucData;
99 1 T_RST = 0;_nop_();
100 1 T_CLK = 0;_nop_();
101 1 T_RST = 1;
102 1 RTInputByte(ucAddr); /* 地址,命令 */
103 1 ucData = RTOutputByte(); /* 读1Byte数据 */
104 1 T_CLK = 1;;
105 1 T_RST = 0;
106 1 return(ucData);
107 1 }
108 /********************************************************************
109
110 函 数 名:BurstW1302T()
111 功 能:往DS1302写入时钟数据(多字节方式)
112 说 明:先写地址,后写命令/数据
113 调 用:RTInputByte()
114 入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
115 8Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 1B
116 返 回 值:无
117 设 计:jiangmaozhou 日 期:2002-03-19
C51 COMPILER V7.00 DS1302 09/14/2006 16:35:49 PAGE 3
118 修 改: 日 期:
119 ***********************************************************************/
120 /*void BurstW1302T(uchar *pWClock)
121 {
122 uchar i;
123 W1302(0x8e,0x00); //控制命令,WP=0,写操作?
124 T_RST = 0;
125 T_CLK = 0;
126 T_RST = 1;
127 RTInputByte(0xbe); // 0xbe:时钟多字节写命令
128 for (i = 8; i>0; i--) //8Byte = 7Byte 时钟数据 + 1Byte 控制
129 {
130 RTInputByte(*pWClock); // 写1Byte数据
131 pWClock++;
132 }
133 T_CLK = 1;
134 T_RST = 0;
135 }
136 /********************************************************************
137
138 函 数 名:BurstR1302T()
139 功 能:读取DS1302时钟数据
140 说 明:先写地址/命令,后读数据(时钟多字节方式)
141 调 用:RTInputByte() , RTOutputByte()
142 入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
143 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
144 返 回 值:无
145 设 计:jiangmaozhou 日 期:2002-03-19
146 修 改: 日 期:
147 ***********************************************************************/
148 /*void BurstR1302T(uchar *pRClock)
149 {
150 uchar i;
151 T_RST = 0;
152 T_CLK = 0;
153 T_RST = 1;
154 RTInputByte(0xbf); // 0xbf:时钟多字节读命令
155 for (i=8; i>0; i--)
156 {
157 *pRClock = RTOutputByte(); // 读1Byte数据
158 pRClock++;
159 }
160 T_CLK = 1;
161 T_RST = 0;
162 }
163 /********************************************************************
164
165 函 数 名:BurstW1302R()
166 功 能:往DS1302寄存器数写入数据(多字节方式)
167 说 明:先写地址,后写数据(寄存器多字节方式)
168 调 用:RTInputByte()
169 入口参数:pWReg: 寄存器数据地址
170 返 回 值:无
171 设 计:jiangmaozhou 日 期:2002-03-19
172 修 改: 日 期:
173 ***********************************************************************/
174 /*void BurstW1302R(uchar *pWReg)
175 {
176 uchar i;
177 W1302(0x8e,0x00); // 控制命令,WP=0,写操作
178 T_RST = 0;
179 T_CLK = 0;
C51 COMPILER V7.00 DS1302 09/14/2006 16:35:49 PAGE 4
180 T_RST = 1;
181 RTInputByte(0xfe); // 0xbe:时钟多字节写命令
182 for (i=31; i>0; i--) // 31Byte 寄存器数据
183 {
184 RTInputByte(*pWReg); // 写1Byte数据
185 pWReg++;
186 }
187 T_CLK = 1;
188 T_RST = 0;
189 }
190 /********************************************************************
191
192 函 数 名:BurstR1302R()
193 功 能:读取DS1302寄存器数据
194 说 明:先写地址,后读命令/数据(寄存器多字节方式)
195 调 用:RTInputByte() , RTOutputByte()
196 入口参数:pRReg: 寄存器数据地址
197 返 回 值:无
198 设 计:jiangmaozhou 日 期:2002-03-19
199 修 改: 日 期:
200 ***********************************************************************/
201 /*void BurstR1302R(uchar *pRReg)
202 {
203 uchar i;
204 T_RST = 0;
205 T_CLK = 0;
206 T_RST = 1;
207 RTInputByte(0xff); // 0xff:时钟多字节读命令
208 for (i=31; i>0; i--) //31Byte 寄存器数据
209 {
210 *pRReg = RTOutputByte(); // 读1Byte数据
211 pRReg++;
212 }
213 T_CLK = 1;
214 T_RST = 0;
215 }/*
216 /********************************************************************
217
218 函 数 名:Set1302()
219 功 能:设置初始时间
220 说 明:先写地址,后读命令/数据(寄存器多字节方式)
221 调 用:W1302()
222 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
223 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
224 返 回 值:无
225 设 计:jiangmaozhou 日 期:2002-03-19
226 修 改: 日 期:
227 ***********************************************************************/
228 void Set1302()
229 {
230 1 uchar i;
231 1 uchar ucAddr = 0x80;
232 1 W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
233 1 for(i =7; i>0; i--)
234 1 {
235 2 W1302(ucAddr,ucCurtime[7-i]); /* 秒 分 时 日 月 星期 年 */
236 2 //pClock++;
237 2 ucAddr +=2;
238 2 }
239 1 W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
240 1 }
241 /********************************************************************
C51 COMPILER V7.00 DS1302 09/14/2006 16:35:49 PAGE 5
242
243 函 数 名:Get1302()
244 功 能:读取DS1302当前时间
245 说 明:
246 调 用:R1302()
247 入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
248 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
249 返 回 值:无
250 设 计:jiangmaozhou 日 期:2002-03-19
251 修 改: 日 期:
252 ***********************************************************************/
253 void Get1302()
254 {
255 1 uchar i;
256 1 uchar ucAddr = 0x81;
257 1 for (i=0; i<7; i++)
258 1 {
259 2 ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
260 2 ucAddr += 2;
261 2 }
262 1 }
263 /*//////////////////////////////////////////////////////////////////////*/
264
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 163 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
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 + -