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