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