📄 ds1307.lst
字号:
545 2 _Nop();
546 2 _Nop();
547 2 SCL=0;
548 2 }
549 1 _Nop();
550 1 _Nop();
C51 COMPILER V7.07 DS1307 02/27/2007 10:08:54 PAGE 10
551 1 SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
552 1 _Nop();
553 1 _Nop();
554 1 SCL=1;
555 1 _Nop();
556 1 _Nop();
557 1 _Nop();
558 1 if(SDA==1)ack=0;
559 1 else ack=1; /*判断是否接收到应答信号*/
560 1 SCL=0;
561 1 _Nop();
562 1 _Nop();
563 1 }
564
565
566
567
568
569
570 /*******************************************************************
571 字节数据传送函数
572 函数原型: uchar RcvByte();
573 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
574 发完后请用应答函数。
575 ********************************************************************/
576 uchar RcvByte() //字节数据传送函数 receive
577 {
578 1 uchar retc;
579 1 uchar BitCnt;
580 1 retc=0;
581 1 SDA=1; /*置数据线为输入方式*/
582 1 for(BitCnt=0;BitCnt<8;BitCnt++)
583 1 {
584 2 _Nop();
585 2 SCL=0; /*置时钟线为低,准备接收数据位*/
586 2 _Nop();
587 2 _Nop(); /*时钟低电平周期大于4.7μs*/
588 2 _Nop();
589 2 _Nop();
590 2 _Nop();
591 2 SCL=1; /*置时钟线为高使数据线上数据有效*/
592 2 _Nop();
593 2 _Nop();
594 2 retc=retc<<1;
595 2 if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
596 2 _Nop();
597 2 _Nop();
598 2 }
599 1 SCL=0;
600 1 _Nop();
601 1 _Nop();
602 1 return(retc);
603 1 }
604
605
606
607
608 /********************************************************************
609 应答子函数
610 原型: void Ack_I2c(bit a);
611
612 功能:主控器进行应答信号,(可以是应答或非应答信号)
C51 COMPILER V7.07 DS1307 02/27/2007 10:08:54 PAGE 11
613 ********************************************************************/
614 void Ack_I2c(bit a) //主控器进行应答信号
615 {
616 1
617 1 if(a==0)SDA=0; /*在此发出应答或非应答信号 */
618 1 else SDA=1;
619 1 _Nop();
620 1 _Nop();
621 1 _Nop();
622 1 SCL=1;
623 1 _Nop();
624 1 _Nop(); //时钟低电平周期大于4μ
625 1 _Nop();
626 1 _Nop();
627 1 _Nop();
628 1 SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
629 1 _Nop();
630 1 _Nop();
631 1 }
632
633
634
635
636 /*******************************************************************
637 向有子地址器件发送多字节数据函数
638 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
639 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
640 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
641 如果返回1表示操作成功,否则操作有误。
642 注意: 使用前必须已结束总线。
643 ********************************************************************/
644 //bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) //向有子地址器件发送多字节数据函数
645 //子地址为8位的数据传送
646 bit ISendStr_8(uchar add,uchar son_add,uchar dat) //向子地址为8位的器件发送多字节数据函数
647 {
648 1 Start_I2c(); /*启动总线*/
649 1 SendByte(add); /*发送器件地址*/
650 1 if(ack==0)return(0);
651 1 SendByte(son_add); /*发送器件子地址*/
652 1 if(ack==0)return(0);
653 1 SendByte(dat); /*发送数据*/
654 1 if(ack==0)return(0);
655 1 Stop_I2c(); /*结束总线*/
656 1 return(1);
657 1 }
658 //子地址为16位的数据传送
659 bit ISendStr_16(uchar add,uint son_add,uchar dat) //向子地址为16位的器件发送多字节数据函数
660 {
661 1 Start_I2c(); /*启动总线*/
662 1 SendByte(add); /*发送器件地址*/
663 1 if(ack==0)return(0);
664 1 SendByte(son_add/256); /*发送器件子地址*/
665 1 if(ack==0)return(0);
666 1 SendByte(son_add%256); /*发送器件子地址*/
667 1 if(ack==0)return(0);
668 1 SendByte(dat); /*发送数据*/
669 1 if(ack==0)return(0);
670 1 Stop_I2c(); /*结束总线*/
671 1 return(1);
672 1 }
673
674
C51 COMPILER V7.07 DS1307 02/27/2007 10:08:54 PAGE 12
675
676
677
678 /*******************************************************************
679 向有子地址器件读取多字节数据函数
680 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
681 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
682 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
683 如果返回1表示操作成功,否则操作有误。
684 注意: 使用前必须已结束总线。
685 ********************************************************************/
686
687
688 //bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no) //向有子地址器件读取多字节数据函数
689 //子地址为8位的数据传送
690 uchar IRcvStr_8(uchar add,uchar son_add) //向子地址为8位的器件读取多字节数据函数
691 {
692 1
693 1 uchar i;
694 1 Start_I2c(); /*启动总线*/
695 1 SendByte(add); /*发送器件地址*/
696 1 SendByte(son_add); /*发送器件子地址2*/
697 1 Start_I2c();
698 1 SendByte(add+0x01);
699 1 i=RcvByte();
700 1 Ack_I2c(1); /*发送非应位*/
701 1 Stop_I2c(); /*结束总线*/
702 1 return (i);
703 1 }
704 //子地址为16位的数据传送
705 uchar IRcvStr_16(uchar add,uint son_add) //向子地址为16位的器件读取多字节数据函数
706 {
707 1
708 1 uchar i;
709 1 Start_I2c(); /*启动总线*/
710 1 SendByte(add); /*发送器件地址*/
711 1 SendByte(son_add/256); /*发送器件子地址1*/
712 1 SendByte(son_add%256); /*发送器件子地址2*/
713 1 Start_I2c();
714 1 SendByte(add+0x01);
715 1 i=RcvByte();
716 1 Ack_I2c(1); /*发送非应位*/
717 1 Stop_I2c(); /*结束总线*/
718 1 return (i);
719 1 }
720 /*完毕*/
721
722 void lcd_dis_time(void) //时钟显示函数
723 {
724 1 uchar i=0;
725 1 i = IRcvStr_8(0xd0,0x00);
726 1 i = ((i&0x70)>>4)*10+(i&0x0f);
727 1 lcd_add(3,7);
728 1 lcd_dis_num(i);
729 1 i = IRcvStr_8(0xd0,0x01);
730 1 i = ((i&0x70)>>4)*10+(i&0x0f);
731 1 lcd_add(3,4);
732 1 lcd_dis_num(i);
733 1 i = IRcvStr_8(0xd0,0x02);
734 1 i = ((i&0x30)>>4)*10+(i&0x0f);
735 1 lcd_add(3,1);
736 1 lcd_dis_num(i);
C51 COMPILER V7.07 DS1307 02/27/2007 10:08:54 PAGE 13
737 1 i = IRcvStr_8(0xd0,0x03);
738 1 i = i&0x07;
739 1 lcd_add(2,1);
740 1 lcd_dis_num(i);
741 1 i = IRcvStr_8(0xd0,0x04);
742 1 i = ((i&0x30)>>4)*10+(i&0x0f);
743 1 lcd_add(1,7);
744 1 lcd_dis_num(i);
745 1 i = IRcvStr_8(0xd0,0x05);
746 1 i = ((i&0x10)>>4)*10+(i&0x0f);
747 1 lcd_add(1,4);
748 1 lcd_dis_num(i);
749 1 i = IRcvStr_8(0xd0,0x06);
750 1 i = ((i&0xf0)>>4)*10+(i&0x0f);
751 1 lcd_add(1,1);
752 1 lcd_dis_num(i);
753 1 }
754
755 void set_time(uchar sec, uchar min, uchar hr, uchar dy, uchar dt,uchar mn,uchar yr) //时钟设置sec, min, h
-r, dy, dt, mn, yr
756 {
757 1 uchar i;
758 1 lcd_add(4,1);
759 1 i = ISendStr_8(0xd0,0x00,0);
760 1 lcd_wrd(0x30+(uchar)i);
761 1 sec = ((sec/10)<<4)+(sec%10);
762 1 i = ISendStr_8(0xd0,0x00,sec);
763 1 lcd_wrd(0x30+(uchar)i);
764 1 min = ((min/10)<<4)+(min%10);
765 1 i = ISendStr_8(0xd0,0x01,min);
766 1 lcd_wrd(0x30+(uchar)i);
767 1 hr = ((hr/10)<<4)+(hr%10);
768 1 i = ISendStr_8(0xd0,0x02,hr);
769 1 lcd_wrd(0x30+(uchar)i);
770 1
771 1 i = ISendStr_8(0xd0,0x03,dy);
772 1 lcd_wrd(0x30+(uchar)i);
773 1 dt = ((dt/10)<<4)+(dt%10);
774 1 i = ISendStr_8(0xd0,0x04,dt);
775 1 lcd_wrd(0x30+(uchar)i);
776 1 mn = ((mn/10)<<4)+(mn%10);
777 1 i = ISendStr_8(0xd0,0x05,mn);
778 1 lcd_wrd(0x30+(uchar)i);
779 1 yr = ((yr/10)<<4)+(yr%10);
780 1 i = ISendStr_8(0xd0,0x06,yr);
781 1 lcd_wrd(0x30+(uchar)i);
782 1 }
783 void lcd_dis_int(long dat,uint int_bits) //显示一个有符号的整数,显示为dat的低int_bits位
784 {
785 1 long a = 0;
786 1 uchar n = 0;
787 1 long tmp = 0;
788 1 if(dat<0)
789 1 {
790 2 lcd_wrd(0x2d);
791 2 }
792 1 tmp = pow(10,int_bits);
793 1 dat = fabs(dat);
794 1 dat = dat%tmp;
795 1 for(n=int_bits;n>1;n--)
796 1 {
797 2 tmp = pow(10,n-1);
C51 COMPILER V7.07 DS1307 02/27/2007 10:08:54 PAGE 14
798 2 a = dat/tmp;
799 2 lcd_wrd(0x30+a);
800 2 dat =dat%tmp;
801 2 }
802 1 lcd_wrd(0x30+(uchar)dat);
803 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1698 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 37
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -