📄 时钟ds1302lcd.lst
字号:
196 2 pReDa++;
197 2 }
198 1 T_CLK = 1;
199 1 T_RST = 0;
200 1 }
201
202 /********************************************************************
203 * 名称 : v_BurstR1302R(uchar *pReDa)
204 * 功能 : 读取DS1302寄存器数据
205 * 输入 : pReDa: 寄存器数据地址
206 * 返回值 : 无
207 ***********************************************************************/
208 void v_BurstR1302R(uchar *pReDa)
209 {
210 1 uchar i;
211 1 T_RST = 0;
212 1 T_CLK = 0;
213 1 T_RST = 1;
214 1 v_RTInputByte(0xff); //0xbf:时钟多字节读命令
215 1 for(i=31; i>0; i--) //31Byte 寄存器数据
216 1 {
217 2 *pReDa = uc_RTOutputByte(); //读1Byte数据
218 2 pReDa++;
219 2 }
220 1 T_CLK = 1;
221 1 T_RST = 0;
222 1 }
223
224 /********************************************************************
225 * 名称 : v_Set1302(uchar *pSecDa)
226 * 功能 : 设置初始时间
227 * 输入 : pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
228 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
229 * 返回值: 无
230 ***********************************************************************/
231 void v_Set1302(uchar *pSecDa)
232 {
233 1 uchar i;
234 1 uchar ucAddr = 0x80;
235 1 v_W1302(0x8e, 0x00); //控制命令,WP=0,写操作
236 1 for(i=7; i>0; i--)
237 1 {
238 2 v_W1302(ucAddr, *pSecDa); // 秒 分 时 日 月 星期 年
239 2 pSecDa++;
240 2 ucAddr += 2;
241 2 }
C51 COMPILER V7.02b 蔩钟DS1302LCD 02/25/2010 14:59:24 PAGE 5
242 1 v_W1302(0x8e, 0x80); //控制命令,WP=1,写保护
243 1 }
244
245 /********************************************************************
246 * 名称 : v_Get1302(uchar ucCurtime[])
247 * 功能 : 读取DS1302当前时间
248 * 输入 : ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
249 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
250 * 返回值 : 无
251 ***********************************************************************/
252 void v_Get1302(uchar ucCurtime[])
253 {
254 1 uchar i;
255 1 uchar ucAddr = 0x81;
256 1 for(i=0; i<7; i++)
257 1 {
258 2 ucCurtime[i] = uc_R1302(ucAddr); //格式为: 秒 分 时 日 月 星期 年
259 2 ucAddr += 2;
260 2 }
261 1 }
262
263 /********************************************************************
264 * 名称 : dectobcd(uchar dec)
265 * 功能 : DEC码转换为BCD码
266 * 输入 : dec码
267 * 输出 : bcd码
268 ***********************************************************************/
269 uchar dectobcd(uchar dec)
270 {
271 1 uchar bcd;
272 1 bcd = 0;
273 1 while(dec >= 10)
274 1 {
275 2 dec -= 10;
276 2 bcd++;
277 2 }
278 1 bcd <<= 4;
279 1 bcd |= dec;
280 1 return bcd;
281 1 }
282
283 /********************************************************************
284 * 名称 : bcdtodec(uchar bcd)
285 * 功能 : BCD码转换为DEC码
286 * 输入 : bcd码
287 * 输出 : dec码
288 ***********************************************************************/
289 uchar bcdtodec(uchar bcd)
290 {
291 1 uchar data1;
292 1 data1 = bcd & 0x0f; //取BCD低4位
293 1 bcd = bcd & 0x70; //剔除BCD的最高位和低4位。
294 1 data1 += bcd >> 1;
295 1 data1 += bcd >> 3; //用位移代替乘法运算
296 1 return data1;
297 1 }
298
299 /********************************************************************
300 * 名称 : Write_DS1302Init()
301 * 功能 : 往DS1302中写入数据。最开始显示的数据就是在这里设置的。
302 * 输入 : 无
303 * 输出 : 无
C51 COMPILER V7.02b 蔩钟DS1302LCD 02/25/2010 14:59:24 PAGE 6
304 ***********************************************************************/
305 void Write_DS1302Init(void)
306 {
307 1 v_W1302(0x8e,0);
308 1 v_W1302(0x80,0x50); //写入秒
309 1 v_W1302(0x8e,0);
310 1 v_W1302(0x82,0x59); //写入分
311 1 v_W1302(0x8e,0);
312 1 v_W1302(0x84,0x07); //写入小时
313 1 v_W1302(0x8e,0);
314 1 v_W1302(0x86,0x08); //写入日
315 1 v_W1302(0x8e,0);
316 1 v_W1302(0x88,0x08); //写入月
317 1 v_W1302(0x8e,0);
318 1 v_W1302(0x8a,0x05); //写入星期
319 1 v_W1302(0x8e,0);
320 1 v_W1302(0x8c,0x08); //写入年
321 1 }
322
323 /********************************************************************
324 * 名称 : Run_DS1302(void)
325 * 功能 : 读出DS1302中的数据,并在液晶1602上进行显示
326 * 输入 : 无
327 * 输出 : 无
328 ***********************************************************************/
329 void Run_DS1302(void)
330 {
331 1 uchar sec, min, hour, day, month, year;
332 1 while(1)
333 1 {
334 2 v_W1302(0x8f, 0);
335 2 sec = bcdtodec(uc_R1302(0x81)); //读出DS1302中的秒
336 2 v_W1302(0x8f, 0);
337 2 min = bcdtodec(uc_R1302(0x83)); //读出DS1302中的分
338 2 v_W1302(0x8f, 0);
339 2 hour = bcdtodec(uc_R1302(0x85)); //读出DS1302中的小时
340 2 v_W1302(0x8f, 0);
341 2 day = bcdtodec(uc_R1302(0x87)); //读出DS1302中的日
342 2 v_W1302(0x8f, 0);
343 2 month = bcdtodec(uc_R1302(0x89)); //读出DS1302中的月
344 2 v_W1302(0x8f, 0);
345 2 year = bcdtodec(uc_R1302(0x8d)); //读出DS1302中的年
346 2
347 2 P0 = table[hour / 10 % 10];
348 2 P2 = 0;
349 2 Delay_1ms(2);
350 2 P0 = table[hour % 10];
351 2 P2 = 1;
352 2 Delay_1ms(2);
353 2 P0 = 0x80;
354 2 P2 = 2;
355 2 Delay_1ms(2);
356 2 P0 = table[min / 10 % 10];
357 2 P2 = 3;
358 2 Delay_1ms(2);
359 2 P0 = table[min % 10];
360 2 P2 = 4;
361 2 Delay_1ms(2);
362 2 P0 = 0x80;
363 2 P2 = 5;
364 2 Delay_1ms(2);
365 2 P0 = table[sec / 10 % 10];
C51 COMPILER V7.02b 蔩钟DS1302LCD 02/25/2010 14:59:24 PAGE 7
366 2 P2 = 6;
367 2 Delay_1ms(2);
368 2 P0 = table[sec % 10];
369 2 P2 = 7;
370 2 Delay_1ms(2);
371 2 }
372 1 }
373
374 /********************************************************************
375 * 名称 : Main(void)
376 * 功能 : 主函数
377 * 输入 : 无
378 * 输出 : 无
379 ***********************************************************************/
380 void Main(void)
381 {
382 1 Write_DS1302Init();
383 1 Run_DS1302();
384 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 685 ----
CONSTANT SIZE = 10 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 7
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 + -