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