📄 3208_v4.01.00.lst
字号:
470 1 clock_out(dd);
471 1 clock_Rst=0;
472 1 clock_clk=1;
473 1 }
474 /**********************************************************************************************/
475 void Set_time(unsigned char sel,unsigned char a){ //根据选择调整的相应项目加1并写入DS1302-调时用加1程序
476 1 signed char address,item;
477 1 signed char max,mini;
478 1 //if(sel==7) {address=0x80; max=0;mini=0;} //秒7
479 1 if(sel==6) {address=0x82; max=59;mini=0;} //分钟6
480 1 if(sel==5) {address=0x84; max=23;mini=0;} //小时5
481 1 if(sel==3) {address=0x86; max=31;mini=1;} //日3
482 1 if(sel==2) {address=0x88; max=12;mini=1;} //月2
483 1 if(sel==1) {address=0x8c; max=99; mini=0;} //年1
484 1 if(sel==4) {address=0x8a; max=7;mini=1;} //星期4
485 1 if(sel==200) {address=0xc2+a*6; max=6;mini=0;} //MODE
486 1 if(sel==201) {address=0xc2+a*6+2; max=23;mini=0;} //星期4
487 1 if(sel==202) {address=0xc2+a*6+4; max=59;mini=0;} //星期4
488 1
489 1 //读取1302某地址上的数值转换成10进制赋给item
C51 COMPILER V6.12 3208_V4_01_00 11/03/2008 14:44:34 PAGE 9
490 1 item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
491 1 if(Add_Key == 0){ key_off ();//等待键放开
492 2 item++;//数值加1
493 2 Beep_key();//调时提示音
494 2 }
495 1 if(Add2_Key == 0){ key_off ();//等待键放开
496 2 item--;//数值减1
497 2 Beep_key();//调时提示音
498 2 }
499 1 if(item>max) item=mini;//查看数值有效范围
500 1 if(item<mini) item=max;
501 1 write_clock(0x8e,0x00);//允许写操作
502 1 write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
503 1 if(sel == 6 && (Add_Key == 0 || Add2_Key == 0)){
504 2 write_clock(0x80,0x00);//秒值=0
505 2 }
506 1 write_clock(0x8e,0x80);//写保护,禁止写操作
507 1 }
508 /**********************************************************************************************/
509 void Init_1302(void){//-设置1302的初始时间(2008年11月3日00时00分00秒星期一)
510 1 uchar f;
511 1 if(read_clock(0xc1) != 0xaa){
512 2 write_clock(0x8e,0x00);//允许写操作
513 2 write_clock(0x8c,0x08);//年
514 2 write_clock(0x8a,0x01);//星期
515 2 write_clock(0x88,0x11);//月
516 2 write_clock(0x86,0x03);//日
517 2 write_clock(0x84,0x00);//小时
518 2 write_clock(0x82,0x00);//分钟
519 2 write_clock(0x80,0x00);//秒
520 2 write_clock(0x90,0xa5);//充电
521 2 write_clock(0xc0,0xaa);//写入初始化标志RAM(第00个RAM位置)
522 2 for(f=0;f<60;f=f+2){//清除闹钟RAM位为0
523 3 write_clock(0xc2+f,0x00);
524 3 }
525 2 write_clock(0xc2+7*6+4,2);//设置显示方式为流动显示(2)
526 2 write_clock(0xc2+7*6,1);//设置流动速度为1
527 2 write_clock(0x8e,0x80);//禁止写操作
528 2 }
529 1 }
530 /**********************************************************************************************/
531 //---V4.0
532 //说明:每个闹钟占用DS1302的三个RAM,从第5个RAM开始使用。
533 //每三个RAM中的第一个为当前闹钟的开关,第二个为设置的小时值,第三个为设置的分钟值。
534 //其它三个RAM,0xc6用于闹钟总开关。0xc4报时的结束时间点。0xc2报时的开始时间点。
535 void search_time(void){//验证闹钟时间到
536 1 uchar i;
537 1 write_clock(0x8e,0x00);//允许写操作
538 1 for(i=1;i<7;i++){//闹钟改为6组,减少2组留出6个字节RAM
539 2 if( read_clock(0xc3+i*6) != 0 && //不为0则表示这项已经设置
540 2 read_clock(0xc3+i*6+2) == read_clock(0x85) && //小时对比
541 2 read_clock(0xc3+i*6+4) == read_clock(0x83)&& //分值对比
542 2 read_clock(0x81) < 0x09 && //这里保证秒值小于8秒动作,防止再操作
543 2 v != read_clock(0x83))//按键停止防再响
544 2 {
545 3 switch (read_clock(0xc3+i*6)){//显示设置项的说明
546 4 case 1://只响一次,之后自动关闭[---V4.0即闹一次后把当前闹钟开关给关闭,下次不再闹]
547 4 BEEP_bit = 1;
548 4 write_clock(0xc2+i*6,0);
549 4 break;//
550 4 case 2://常开
551 4 BEEP_bit = 1;
C51 COMPILER V6.12 3208_V4_01_00 11/03/2008 14:44:34 PAGE 10
552 4 break;//
553 4 case 3://周六、日除外
554 4 if(read_clock(0x8b) < 6){
555 5 BEEP_bit = 1;
556 5 }
557 4 break;//
558 4 case 4://周日除外
559 4 if(read_clock(0x8b) < 7){
560 5 BEEP_bit = 1;
561 5 }
562 4 break;//
563 4 case 5://周六、日响
564 4 if(read_clock(0x8b) > 5){
565 5 BEEP_bit = 1;
566 5 }
567 4 break;//
568 4 case 6://周日响
569 4 if(read_clock(0x8b) == 7){
570 5 BEEP_bit = 1;
571 5 }
572 4 break;//
573 4 }
574 3 v = read_clock(0x83);
575 3 }
576 2 }
577 1 write_clock(0x8e,0x80);//禁止写操作
578 1 }
579 /**********************************************************************************************/
580 void Time_adj(void){//---V4.0功能,时间校准程序
581 1 unsigned char temp;
582 1 temp=read_clock(0xc3+7*6+2);
583 1 if((read_clock(0x85)==3)&&(read_clock(0x83)==0)&&(read_clock(0x81)==30)){//凌晨3点0分30秒时校正
584 2 if((temp>0)&&(temp<26)){ //减调整
585 3 write_clock(0x8e,0x00);//允许写操作
586 3 write_clock(0x80,30-(26-temp));//对秒进行调整。26-temp:让本来+2.+1.+0.-25.-24...变成+2.+1.+0.-1.-2...
587 3 write_clock(0x8e,0x80);//禁止写操作
588 3 }
589 2 if((temp>=26)&&(temp<52)){ //加调整
590 3 write_clock(0x8e,0x00);//允许写操作
591 3 write_clock(0x80,30+(temp-26));//对秒进行调整
592 3 write_clock(0x8e,0x80);//禁止写操作
593 3 }
594 2 }
595 1 }
596 /**********************************************************************************************/
597 void clearRAM (void){//寄存器清空函数-32个寄存器清空(0x00)
598 1 uchar a;//定义变量用于清空数据指针
599 1 for(a=0;a<32;a++){//指向32个寄存器
600 2 Ledplay[a] = 0;//将指向的寄存器清空
601 2 }
602 1 }
603 /**********************************************************************************************/
604 void clearBuf (void){//寄存器清空函数-80个寄存器清空(0x00)--V4.0
605 1 uchar a;//定义变量用于清空数据指针
606 1 for(a=0;a<80;a++){//指向80个寄存器
607 2 Ledplay_buf[a] = 0;//将指向的寄存器清空
608 2 }
609 1 }
610 /**********************************************************************************************/
611 void putin_buf (uchar u){//字符载入函数-将字符装入显示寄存器
612 1 uchar a = 0;//定义变量用于数据提取指针
613 1 do{
C51 COMPILER V6.12 3208_V4_01_00 11/03/2008 14:44:34 PAGE 11
614 2 Ledplay_buf[bn+40] = no[u][a];//将二维数组中的一组数据放入显示缓冲区
615 2 a++;//换下一个提取字节
616 2 bn++;//换下一个显示缓冲字节
617 2 }
618 1 while(no[u][a] != 0);//当显示数据为0时结束循环
619 1 bn++;//换下一个显示缓冲字节
620 1 Ledplay_buf[bn+40] = 0;//显示一列的空位,便于字符区分
621 1 }
622 /**********************************************************************************************/
623 void putin (uchar u){//字符载入函数-将字符装入显示寄存器
624 1 uchar a = 0;//定义变量用于数据提取指针
625 1 do{
626 2 Ledplay[bn] = no[u][a];//将二维数组中的一组数据放入显示缓冲区
627 2 a++;//换下一个提取字节
628 2 bn++;//换下一个显示缓冲字节
629 2 }
630 1 while(no[u][a] != 0);//当显示数据为0时结束循环
631 1 bn++;//换下一个显示缓冲字节
632 1 Ledplay[bn] = 0;//显示一列的空位,便于字符区分
633 1 }
634 /**********************************************************************************************/
635 //将待显缓冲区的前32字节转移到显示缓冲区中--V4.0
636 void disBuf_2_disRam(void){
637 1 uchar i;
638 1 for(i=0;i<32;i++){
639 2 Ledplay[i]=Ledplay_buf[i];
640 2 }
641 1 }
642 //********************************************************************************************************
-***
643 //此处是显示显示缓冲区内容的函数,只有这里才有权力涉及到显示缓冲区的读取!!!
644 //暂时设置部分的显示不改。
645 //********************************************************************************************************
-***
646 void display (void){//点阵屏驱动函数-32*8点阵显示驱动
647 1 uchar ac,aa;//定义两个数据变量
648 1 aa = 7;//指定前16个数据的提取
649 1 for(ac=0x28;ac<0x30;ac++){//扫描前两块LED屏
650 2 Led_E = ac;//用ac值驱动使能列信号
651 2
652 2 Led_24 = DL(Ledplay[aa+8]);//DL(Ledplay[aa+8]);//将显示寄存器数据写入2、4屏
653 2 Led_13 = Ledplay[aa];//将显示寄存器数据写入1、3屏
654 2
655 2 Delay(60);//延时1.2微秒[60]
656 2 Led_E = 0xff;
657 2
658 2 Led_13 = 0;//数据总线清空
659 2 Led_24 = 0;
660 2 aa--;//aa减1,换下一列显示
661 2 }
662 1 aa = 23;//指定后16个数据的提取
663 1 for(ac=0x20;ac<0x28;ac++){//扫描后两块LED屏(由于P1.5接扬声器所以高4位为2,旨在关声音)
664 2 Led_E = ac;//用ac值驱动使能列信号
665 2
666 2 Led_24 = DL(Ledplay[aa+8]);//将显示寄存器数据写入2、4屏
667 2 Led_13 = Ledplay[aa];//将显示寄存器数据写入1、3屏
668 2
669 2 Delay(60);//延时1.2微秒 [60]
670 2 Led_E = 0xff;
671 2
672 2 Led_13 = 0;//数据总线清空
673 2 Led_24 = 0;
C51 COMPILER V6.12 3208_V4_01_00 11/03/2008 14:44:34 PAGE 12
674 2 aa--;//aa减1,换下一列显示
675 2 }
676 1 Led_E = 0xff;
677 1 }
678 /**********************************************************************************************/
679 void display_delay(uchar i){//循环显示i次以达到延时功能
680 1 while(i){
681 2 display();
682 2 i--;
683 2 }
684 1 }
685 /**********************************************************************************************/
686 void Load_date(void){ //日期组合与显示
687 1 bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
688 1 if(read_clock(0x89)/16 != 0){//为0时消隐
689 2 putin_buf(read_clock(0x89)/16);//显示月值(十位,为0时消隐)/*将数据存入待显区后四十字节。*/
690 2 }
691 1 putin_buf(read_clock(0x89)%16);//显示月值(个位)
692 1 putin_buf(21);//显示"月"
693 1 if(read_clock(0x87)/16 != 0){//为0时消隐
694 2 putin_buf(read_clock(0x87)/16);//显示日值(十位,为0时消隐)
695 2 }
696 1 putin_buf(read_clock(0x87)%16);//显示日值(个位)
697 1 putin_buf(22);//显示"日"
698 1 }
699 /**********************************************************************************************/
700 void Load_time(void){ //时间组合与显示
701 1 bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
702 1 if(read_clock(0x85) > read_clock(0xc3) && read_clock(0x85) < read_clock(0xc5)){//设定范围内整点报时
703 2 if(hour_renew != read_clock(0x85)){//当小时值更新时则启动报时
704 3 hour_renew = read_clock(0x85);//将新的小时值放入更新寄存器//这里会导致开机时报一次整点,因为开机pp值不
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -