📄 时钟ds1302lcd.lst
字号:
244 1 T_RST = 1;
245 1 v_RTInputByte(0xbe); //0xbe:时钟多字节写命令
246 1 for(i=8; i>0; i--) //8Byte = 7Byte 时钟数据 + 1Byte 控制
247 1 {
248 2 v_RTInputByte(*pSecDa); //写1Byte数据
249 2 pSecDa++;
250 2 }
251 1 T_CLK = 1;
252 1 T_RST = 0;
253 1 }
254
255 /********************************************************************
256 * 名称 : v_BurstR1302T(uchar *pSecDa)
257 * 功能 : 读取DS1302时钟数据
258 * 输入 : pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
259 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
260 * 返回值 : ucDa :读取的数据
261 ***********************************************************************/
262 void v_BurstR1302T(uchar *pSecDa)
263 {
264 1 uchar i;
265 1 T_RST = 0;
266 1 T_CLK = 0;
267 1 T_RST = 1;
268 1 v_RTInputByte(0xbf); //0xbf:时钟多字节读命令
269 1 for(i=8; i>0; i--)
270 1 {
271 2 *pSecDa = uc_RTOutputByte(); //读1Byte数据
272 2 pSecDa++;
273 2 }
274 1 T_CLK = 1;
275 1 T_RST = 0;
276 1 }
277
278 /********************************************************************
279 * 名称 : v_BurstW1302R(uchar *pReDa)
280 * 功能 : 往DS1302寄存器数写入数据(多字节方式)
281 * 输入 : pReDa: 寄存器数据地址
282 * 返回值 : 无
283 ***********************************************************************/
284 void v_BurstW1302R(uchar *pReDa)
285 {
286 1 uchar i;
287 1 v_W1302(0x8e,0x00); //控制命令,WP=0,写操作
288 1 T_RST = 0;
289 1 T_CLK = 0;
290 1 T_RST = 1;
291 1 v_RTInputByte(0xfe); //0xbe:时钟多字节写命令
292 1 for(i=31; i>0; i--) //31Byte 寄存器数据
293 1 {
294 2 v_RTInputByte(*pReDa); //写1Byte数据
295 2 pReDa++;
296 2 }
297 1 T_CLK = 1;
298 1 T_RST = 0;
299 1 }
300
301 /********************************************************************
302 * 名称 : v_BurstR1302R(uchar *pReDa)
303 * 功能 : 读取DS1302寄存器数据
C51 COMPILER V7.50 时钟DS1302LCD 04/10/2009 19:42:50 PAGE 6
304 * 输入 : pReDa: 寄存器数据地址
305 * 返回值 : 无
306 ***********************************************************************/
307 void v_BurstR1302R(uchar *pReDa)
308 {
309 1 uchar i;
310 1 T_RST = 0;
311 1 T_CLK = 0;
312 1 T_RST = 1;
313 1 v_RTInputByte(0xff); //0xbf:时钟多字节读命令
314 1 for(i=31; i>0; i--) //31Byte 寄存器数据
315 1 {
316 2 *pReDa = uc_RTOutputByte(); //读1Byte数据
317 2 pReDa++;
318 2 }
319 1 T_CLK = 1;
320 1 T_RST = 0;
321 1 }
322
323 /********************************************************************
324 * 名称 : v_Set1302(uchar *pSecDa)
325 * 功能 : 设置初始时间
326 * 输入 : pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
327 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
328 * 返回值: 无
329 ***********************************************************************/
330 void v_Set1302(uchar *pSecDa)
331 {
332 1 uchar i;
333 1 uchar ucAddr = 0x80;
334 1 v_W1302(0x8e, 0x00); //控制命令,WP=0,写操作
335 1 for(i=7; i>0; i--)
336 1 {
337 2 v_W1302(ucAddr, *pSecDa); // 秒 分 时 日 月 星期 年
338 2 pSecDa++;
339 2 ucAddr += 2;
340 2 }
341 1 v_W1302(0x8e, 0x80); //控制命令,WP=1,写保护
342 1 }
343
344 /********************************************************************
345 * 名称 : v_Get1302(uchar ucCurtime[])
346 * 功能 : 读取DS1302当前时间
347 * 输入 : ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
348 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
349 * 返回值 : 无
350 ***********************************************************************/
351 void v_Get1302(uchar ucCurtime[])
352 {
353 1 uchar i;
354 1 uchar ucAddr = 0x81;
355 1 for(i=0; i<7; i++)
356 1 {
357 2 ucCurtime[i] = uc_R1302(ucAddr); //格式为: 秒 分 时 日 月 星期 年
358 2 ucAddr += 2;
359 2 }
360 1 }
361
362 /********************************************************************
363 * 名称 : dectobcd(uchar dec)
364 * 功能 : DEC码转换为BCD码
365 * 输入 : dec码
C51 COMPILER V7.50 时钟DS1302LCD 04/10/2009 19:42:50 PAGE 7
366 * 输出 : bcd码
367 ***********************************************************************/
368 uchar dectobcd(uchar dec)
369 {
370 1 uchar bcd;
371 1 bcd = 0;
372 1 while(dec >= 10)
373 1 {
374 2 dec -= 10;
375 2 bcd++;
376 2 }
377 1 bcd <<= 4;
378 1 bcd |= dec;
379 1 return bcd;
380 1 }
381
382 /********************************************************************
383 * 名称 : bcdtodec(uchar bcd)
384 * 功能 : BCD码转换为DEC码
385 * 输入 : bcd码
386 * 输出 : dec码
387 ***********************************************************************/
388 uchar bcdtodec(uchar bcd)
389 {
390 1 uchar data1;
391 1 data1 = bcd & 0x0f; //取BCD低4位
392 1 bcd = bcd & 0x70; //剔除BCD的最高位和低4位。
393 1 data1 += bcd >> 1;
394 1 data1 += bcd >> 3; //用位移代替乘法运算
395 1 return data1;
396 1 }
397
398 /********************************************************************
399 * 名称 : Write_DS1302Init()
400 * 功能 : 往DS1302中写入数据。最开始显示的数据就是在这里设置的。
401 * 输入 : 无
402 * 输出 : 无
403 ***********************************************************************/
404 void Write_DS1302Init(void)
405 {
406 1 v_W1302(0x8e,0);
407 1 v_W1302(0x80,0x50); //写入秒
408 1 v_W1302(0x8e,0);
409 1 v_W1302(0x82,0x59); //写入分
410 1 v_W1302(0x8e,0);
411 1 v_W1302(0x84,0x07); //写入小时
412 1 v_W1302(0x8e,0);
413 1 v_W1302(0x86,0x08); //写入日
414 1 v_W1302(0x8e,0);
415 1 v_W1302(0x88,0x08); //写入月
416 1 v_W1302(0x8e,0);
417 1 v_W1302(0x8a,0x05); //写入星期
418 1 v_W1302(0x8e,0);
419 1 v_W1302(0x8c,0x08); //写入年
420 1 }
421
422 /********************************************************************
423 * 名称 : Run_DS1302(void)
424 * 功能 : 读出DS1302中的数据,并在液晶1602上进行显示
425 * 输入 : 无
426 * 输出 : 无
427 ***********************************************************************/
C51 COMPILER V7.50 时钟DS1302LCD 04/10/2009 19:42:50 PAGE 8
428 void Run_DS1302(void)
429 {
430 1 uchar sec, min, hour, day, month, year;
431 1 while(1)
432 1 {
433 2 v_W1302(0x8f, 0);
434 2 sec = bcdtodec(uc_R1302(0x81)); //读出DS1302中的秒
435 2 v_W1302(0x8f, 0);
436 2 min = bcdtodec(uc_R1302(0x83)); //读出DS1302中的分
437 2 v_W1302(0x8f, 0);
438 2 hour = bcdtodec(uc_R1302(0x85)); //读出DS1302中的小时
439 2 v_W1302(0x8f, 0);
440 2 day = bcdtodec(uc_R1302(0x87)); //读出DS1302中的日
441 2 v_W1302(0x8f, 0);
442 2 month = bcdtodec(uc_R1302(0x89)); //读出DS1302中的月
443 2 v_W1302(0x8f, 0);
444 2 year = bcdtodec(uc_R1302(0x8d)); //读出DS1302中的年
445 2
446 2 L1602_char(2, 6, hour / 10 % 10 + 48);
447 2 L1602_char(2, 7, hour % 10 + 48);
448 2 L1602_char(2, 8, '-');
449 2 L1602_char(2, 9, min / 10 % 10 + 48);
450 2 L1602_char(2, 10, min % 10 + 48);
451 2 L1602_char(2, 11, '-');
452 2 L1602_char(2, 12, sec / 10 % 10 + 48);
453 2 L1602_char(2, 13, sec % 10 + 48);
454 2 L1602_char(1, 8, year / 10 % 10 + 48);
455 2 L1602_char(1, 9, year % 10 + 48);
456 2 L1602_char(1, 10, '-');
457 2 L1602_char(1, 11, month / 10 % 10 + 48);
458 2 L1602_char(1, 12, month % 10 + 48);
459 2 L1602_char(1, 13, '-');
460 2 L1602_char(1, 14, day / 10 % 10 + 48);
461 2 L1602_char(1, 15, day % 10 + 48);
462 2 }
463 1
464 1 }
465
466 /********************************************************************
467 * 名称 : Main(void)
468 * 功能 : 主函数
469 * 输入 : 无
470 * 输出 : 无
471 ***********************************************************************/
472 void Main(void)
473 {
474 1 L1602_init();
475 1 L1602_string(1,1,"DAYS 20");
476 1 L1602_string(2,1,"TIME");
477 1 Write_DS1302Init();
478 1 Run_DS1302();
479 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 999 ----
CONSTANT SIZE = 13 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 14
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
C51 COMPILER V7.50 时钟DS1302LCD 04/10/2009 19:42:50 PAGE 9
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -