📄 newds1302.lst
字号:
241 1 lcden=0;
242 1 delay(1);
243 1 lcdrs=0;
244 1 }
245
246
247 void lcd_dfs(uchar aa,uchar bb)// 用来刷新分秒天 aa=数据 bb=LCD地址
248 {
249 1 uchar a=0,b=0;
250 1 a=aa%10;
251 1 b=aa/10;
252 1 lcd_com(bb);
253 1 lcd_data(b+0x30);
254 1 lcd_data(a+0x30);
255 1 }
256
257 void lcd_sfm()//显示时分秒
258 {
259 1 lcd_dfs(ds_time[2],0xc4);//时
260 1 lcd_dfs(ds_time[1],0xc7);//分
261 1 lcd_dfs(ds_time[0],0xca);//秒
262 1 }
263
264 void lcd_yydw()//显示年月日天星期
265 {
266 1 lcd_dfs(ds_time[6],0x82);//年
267 1 lcd_dfs(ds_time[5],0x85);//月
268 1 lcd_dfs(ds_time[4],0x88);//天
269 1 lcd_com(0x8b);
270 1 week(ds_time[3]);//星期
271 1 }
272
273 void week(uchar cc)//星期的处理
274 {
275 1 uchar a,f;
276 1 a=cc%10;
277 1 for (f=0;f<3;f++)
278 1 lcd_data(*weekda[a]);
279 1 }
280
281 void dsread_reg(uchar rbs ,uchar *preg)//寄存器多字节读取
282 {
283 1 uchar i;
284 1 dsce = 0;
285 1 dsclk = 0;
286 1 dsce = 1;
287 1 ds_write(0xff);//0xbf:时钟多字节读命令
288 1 for (i=rbs; i>0; i--)
289 1 {
290 2 *preg = ds_read();/* 读1Byte数据 */
291 2 preg++;
292 2 }
293 1 dsclk = 1;
294 1 dsce = 0;
295 1 }
296
297 void ds_write_reg(uchar wbs ,uchar *pwrite) //寄存器写指令,多字节
298 {
299 1 uchar i;
300 1 ds_write_b(0x8e,0x00);/* 控制命令,WP=0,写操作*/
301 1 dsce = 0;
302 1 dsclk = 0;
C51 COMPILER V6.12 NEWDS1302 09/27/2008 14:21:13 PAGE 6
303 1 dsce = 1;
304 1 ds_write(0xfe);/* 0xbe:时钟多字节写命令 */
305 1
306 1 for (i = wbs; i>0; i--)/*共31字节*/
307 1 {
308 2 ds_write(*pwrite); /* 写1Byte数据*/
309 2 pwrite++;
310 2 }
311 1 dsclk = 1;
312 1 dsce = 0;
313 1 }
314
315 void ds_bcdzh(uchar *p)//把BCD码转换成十六进制的,用指针方式,并放在ds_time中
316 {
317 1 uchar i,ee=*p;
318 1 for(i=0;i<7;i++)
319 1 {
320 2 *p=(((*p)&0x70)>>4)*10+((*p)&0x0f);
321 2 p++;
322 2 ee=*p;
323 2 }
324 1 }
325
326 /*void ds_bcdzh()//把BCD码转换成十六进制的
327 {
328 dssj.miao=(((dssj.miao&0x70)>>4)*10)+(dssj.miao&0x0f);
329 dssj.fen=(((dssj.fen&0x70)>>4)*10) + (dssj.fen&0x0f);
330 dssj.shi=(((dssj.shi&0x70)>>4)*10) + (dssj.shi&0x0f);
331 dssj.day=(((dssj.day&0x70)>>4)*10) + (dssj.day&0x0f);
332 dssj.yue=(((dssj.yue&0x70)>>4)*10) + (dssj.yue&0x0f);
333 dssj.week=(((dssj.week&0x70)>>4)*10)+(dssj.week&0x0f);
334 dssj.year=(((dssj.year&0x70)>>4)*10)+(dssj.year&0x0f);
335 }*/
336
337 //bcd转十六进,注意DEC数值,比如日大于了相应月的最大日期,DS1302将会错乱。
338 uchar dectobcd(uchar dec)//bcd转十六进,
339 {
340 1 uchar bcd;
341 1 bcd=0;
342 1 while(dec>=10)
343 1 {
344 2 dec-=10;
345 2 bcd++;
346 2 }
347 1 bcd<<=4;
348 1 bcd|=dec;
349 1 return bcd;
350 1 }
351
352 void time_dec_bcd()//把ds_time数组里的值转换成bcd码并放在数组里
353 {
354 1 uchar dtb;
355 1 for(dtb=0;dtb<7;dtb++)
356 1 ds_time[dtb]=dectobcd(ds_time[dtb]);
357 1 //ds_write_bs(&ds_time); //写字令,多字节 把数组里的bcd码写入ds1302k ,格式为: 秒 分 时 日 月 星期 年
358 1 }
359
360 void runyear()//判断是否润年,并返回相应的月份天数
361 {
362 1 bit yeara=0;
363 1 uchar yuea=ds_time[4];
364 1 uint ryear;
C51 COMPILER V6.12 NEWDS1302 09/27/2008 14:21:13 PAGE 7
365 1 ryear=2000;
366 1 ryear=ryear+ds_time[6];
367 1 if((ryear%100!=0)&&(ryear%4==0)||(ryear%400==0)) {yeara=1;}
368 1
369 1 if(yeara==0&&yuea==2) {yueb=28;}
370 1 if(yeara==1&&yuea==2) {yueb=29;}
371 1 if(yuea!=2)
372 1 {
373 2 if((yuea%2!=0&&yuea<8)||(yuea%2==0&&yuea>7)) {yueb=31;}
374 2 if((yuea%2!=0&&yuea>8)||(yuea%2==0&&yuea<7)) {yueb=30;}
375 2 }
376 1 //return yueb;
377 1 }
378
379 void jbsm() //键盘扫描
380 {
381 1 uchar *p; uchar ds_wadd;
382 1 key1=1;
383 1 key2=1;
384 1 key3=1;
385 1 runyear();
386 1 if(key1==0)
387 1 {
388 2 delay1(100); //功能键
389 2 if(key1==0)
390 2 {
391 3 while(!key1);
392 3 kk++;
393 3 lcd_com(0x0f); //发送LCD命令,开启光标,并闪烁
394 3 switch(kk)
395 3 {//add--液晶地址 adat=秒分时......
396 4 case 1: adda=0xca; *p=ds_time[0]; ds_wadd=0;break;//秒位
397 4 case 2: adda=0xc7; *p=ds_time[1]; ds_wadd=1; break;//分位
398 4 case 3: adda=0xc4; *p=ds_time[2]; ds_wadd=2; break;//时位
399 4 case 4: adda=0x8b; *p=ds_time[5]; ds_wadd=5;break;//星期
400 4 case 5: adda=0x88; *p=ds_time[3]; ds_wadd=3;break;//天
401 4 case 6: adda=0x85; *p=ds_time[4]; ds_wadd=4; break;//月
402 4 case 7: adda=0x82; *p=ds_time[6]; ds_wadd=6; break;//年
403 4 case 8: kk=0;
404 4 time_dec_bcd(); //转换成bcd码
405 4 ds_write_bs(&ds_time); //往ds1302中写入多字节时钟
406 4 lcd_com(0x0c);
407 4 break; //结束调时操作
408 4 }
409 3 lcd_com(adda); //让光标在指定地址闪烁
410 3
411 3 }
412 2 }
413 1
414 1 if(kk!=0) //按键加一
415 1 {
416 2 if(key2==0)
417 2 {
418 3 delay1(100);
419 3 if(key2==0)
420 3 {
421 4 while(!key2);
422 4 (*p)++;
423 4 if(((kk==1)||(kk==2))&&((*p)==60)) {*p=0;}//秒分加一
424 4 if((kk==3)&&(*p)==24) {*p=00;}//小时加一
425 4
426 4 if((kk==5)&&(*p)==yueb+1) {*p=1;}//日期加一
C51 COMPILER V6.12 NEWDS1302 09/27/2008 14:21:13 PAGE 8
427 4 if((kk==6)&&(*p)==13) {*p=1;}//月份加一
428 4 if((kk==7)&&(*p)==100) {*p=0;}//年份加一
429 4 lcd_dfs(*p,adda);
430 4 lcd_com(adda);
431 4 if(kk==4){if((kk==4)&&(*p)==8) *p=1; week(*p);lcd_com(adda);}//星期加一
432 4 }
433 3 ds_time[ds_wadd]=*p;
434 3 }
435 2
436 2 if(key3==0)//按键减一
437 2 {
438 3 delay1(100);
439 3 if(key3==0)
440 3 {
441 4 while(!key3);
442 4 (*p)--;
443 4 if(((kk==1)||(kk==2))&&((*p)==255)) {*p=59;}//秒分减一
444 4 if((kk==3)&&(*p)==255) {*p=23;}//小时减一
445 4 if((kk==5)&&(*p)==0) {*p=yueb;}//日期减一
446 4 if((kk==6)&&(*p)==0) {*p=12;}//月份减一
447 4 if((kk==7)&&(*p)==0) {*p=99;}//年份减一
448 4 lcd_dfs(*p,adda);
449 4 lcd_com(adda);
450 4 if(kk==4){if((kk==4)&&(*p)==0) *p=7; week(*p);lcd_com(adda);}//星期加一
451 4 }
452 3 }ds_time[ds_wadd]=*p;
453 2 }
454 1 }
455
456 void main()
457 {
458 1 lcd_init();
459 1
460 1 while(1)
461 1 {
462 2 if(kk==0)
463 2 {
464 3 ds_read_bs(&ds_time); //读取ds1302时钟信号---突发模式
465 3 ds_bcdzh(&ds_time); //BCD转换,指针方式
466 3 //ds_bcdzh(); //另一种方式BCD转换
467 3 lcd_sfm(); //时分秒刷新
468 3 //lcd_yydw();
469 3 }
470 2 jbsm();
471 2 /* ds_write_reg(8 ,&dssja);
472 2 dsread_reg(8 ,&dssj);
473 2 lcd_sfm();
474 2 while(1);*/
475 2 }
476 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1589 ----
CONSTANT SIZE = 36 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 34 22
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -