📄 ad7109.lst
字号:
625 /********************************************************************
626 应答子函数
627 原型: void Ack_I2c(bit a);
628
629 功能:主控器进行应答信号,(可以是应答或非应答信号)
630 ********************************************************************/
631 void Ack_I2c(bit a) //主控器进行应答信号
632 {
633 1
634 1 if(a==0)SDA=0; /*在此发出应答或非应答信号 */
635 1 else SDA=1;
636 1 _Nop();
637 1 _Nop();
638 1 _Nop();
639 1 SCL=1;
640 1 _Nop();
641 1 _Nop(); //时钟低电平周期大于4μ
642 1 _Nop();
643 1 _Nop();
644 1 _Nop();
645 1 SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
646 1 _Nop();
647 1 _Nop();
648 1 }
649
650
651
652
653 /*******************************************************************
654 向有子地址器件发送多字节数据函数
655 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
656 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
657 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
658 如果返回1表示操作成功,否则操作有误。
659 注意: 使用前必须已结束总线。
660 ********************************************************************/
661 //bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) //向有子地址器件发送多字节数据函数
662 //子地址为8位的数据传送
663 bit ISendStr_8(uchar add,uchar son_add,uchar dat) //向子地址为8位的器件发送多字节数据函数
664 {
665 1 Start_I2c(); /*启动总线*/
666 1 SendByte(add); /*发送器件地址*/
667 1 if(ack==0)return(0);
668 1 SendByte(son_add); /*发送器件子地址*/
669 1 if(ack==0)return(0);
670 1 SendByte(dat); /*发送数据*/
671 1 if(ack==0)return(0);
672 1 Stop_I2c(); /*结束总线*/
673 1 return(1);
674 1 }
C51 COMPILER V7.07 AD7109 02/27/2007 10:02:55 PAGE 12
675 //子地址为16位的数据传送
676 bit ISendStr_16(uchar add,uint son_add,uchar dat) //向子地址为16位的器件发送多字节数据函数
677 {
678 1 Start_I2c(); /*启动总线*/
679 1 SendByte(add); /*发送器件地址*/
680 1 if(ack==0)return(0);
681 1 SendByte(son_add/256); /*发送器件子地址*/
682 1 if(ack==0)return(0);
683 1 SendByte(son_add%256); /*发送器件子地址*/
684 1 if(ack==0)return(0);
685 1 SendByte(dat); /*发送数据*/
686 1 if(ack==0)return(0);
687 1 Stop_I2c(); /*结束总线*/
688 1 return(1);
689 1 }
690
691
692
693
694
695 /*******************************************************************
696 向有子地址器件读取多字节数据函数
697 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
698 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
699 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
700 如果返回1表示操作成功,否则操作有误。
701 注意: 使用前必须已结束总线。
702 ********************************************************************/
703
704
705 //bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no) //向有子地址器件读取多字节数据函数
706 //子地址为8位的数据传送
707 uchar IRcvStr_8(uchar add,uchar son_add) //向子地址为8位的器件读取多字节数据函数
708 {
709 1
710 1 uchar i;
711 1 Start_I2c(); /*启动总线*/
712 1 SendByte(add); /*发送器件地址*/
713 1 SendByte(son_add); /*发送器件子地址2*/
714 1 Start_I2c();
715 1 SendByte(add+0x01);
716 1 i=RcvByte();
717 1 Ack_I2c(1); /*发送非应位*/
718 1 Stop_I2c(); /*结束总线*/
719 1 return (i);
720 1 }
721 //子地址为16位的数据传送
722 uchar IRcvStr_16(uchar add,uint son_add) //向子地址为16位的器件读取多字节数据函数
723 {
724 1
725 1 uchar i;
726 1 Start_I2c(); /*启动总线*/
727 1 SendByte(add); /*发送器件地址*/
728 1 SendByte(son_add/256); /*发送器件子地址1*/
729 1 SendByte(son_add%256); /*发送器件子地址2*/
730 1 Start_I2c();
731 1 SendByte(add+0x01);
732 1 i=RcvByte();
733 1 Ack_I2c(1); /*发送非应位*/
734 1 Stop_I2c(); /*结束总线*/
735 1 return (i);
736 1 }
C51 COMPILER V7.07 AD7109 02/27/2007 10:02:55 PAGE 13
737 /*完毕*/
738
739 void lcd_dis_time(void) //时钟显示函数
740 {
741 1 uchar i=0;
742 1 i = IRcvStr_8(0xd0,0x00);
743 1 i = ((i&0x70)>>4)*10+(i&0x0f);
744 1 lcd_add(3,7);
745 1 lcd_dis_num(i);
746 1 i = IRcvStr_8(0xd0,0x01);
747 1 i = ((i&0x70)>>4)*10+(i&0x0f);
748 1 lcd_add(3,4);
749 1 lcd_dis_num(i);
750 1 i = IRcvStr_8(0xd0,0x02);
751 1 i = ((i&0x30)>>4)*10+(i&0x0f);
752 1 lcd_add(3,1);
753 1 lcd_dis_num(i);
754 1 i = IRcvStr_8(0xd0,0x03);
755 1 i = i&0x07;
756 1 lcd_add(2,1);
757 1 lcd_dis_num(i);
758 1 i = IRcvStr_8(0xd0,0x04);
759 1 i = ((i&0x30)>>4)*10+(i&0x0f);
760 1 lcd_add(1,7);
761 1 lcd_dis_num(i);
762 1 i = IRcvStr_8(0xd0,0x05);
763 1 i = ((i&0x10)>>4)*10+(i&0x0f);
764 1 lcd_add(1,4);
765 1 lcd_dis_num(i);
766 1 i = IRcvStr_8(0xd0,0x06);
767 1 i = ((i&0xf0)>>4)*10+(i&0x0f);
768 1 lcd_add(1,1);
769 1 lcd_dis_num(i);
770 1 }
771
772 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
773 {
774 1 uchar i;
775 1 lcd_add(4,1);
776 1 i = ISendStr_8(0xd0,0x00,0);
777 1 lcd_wrd(0x30+(uchar)i);
778 1 sec = ((sec/10)<<4)+(sec%10);
779 1 i = ISendStr_8(0xd0,0x00,sec);
780 1 lcd_wrd(0x30+(uchar)i);
781 1 min = ((min/10)<<4)+(min%10);
782 1 i = ISendStr_8(0xd0,0x01,min);
783 1 lcd_wrd(0x30+(uchar)i);
784 1 hr = ((hr/10)<<4)+(hr%10);
785 1 i = ISendStr_8(0xd0,0x02,hr);
786 1 lcd_wrd(0x30+(uchar)i);
787 1
788 1 i = ISendStr_8(0xd0,0x03,dy);
789 1 lcd_wrd(0x30+(uchar)i);
790 1 dt = ((dt/10)<<4)+(dt%10);
791 1 i = ISendStr_8(0xd0,0x04,dt);
792 1 lcd_wrd(0x30+(uchar)i);
793 1 mn = ((mn/10)<<4)+(mn%10);
794 1 i = ISendStr_8(0xd0,0x05,mn);
795 1 lcd_wrd(0x30+(uchar)i);
796 1 yr = ((yr/10)<<4)+(yr%10);
797 1 i = ISendStr_8(0xd0,0x06,yr);
C51 COMPILER V7.07 AD7109 02/27/2007 10:02:55 PAGE 14
798 1 lcd_wrd(0x30+(uchar)i);
799 1 }
800 void lcd_dis_int(long dat,uint int_bits) //显示一个有符号的整数,显示为dat的低int_bits位
801 {
802 1 long a = 0;
803 1 uchar n = 0;
804 1 float tmp = 0;
805 1 if(dat<0)
806 1 {
807 2 lcd_wrd(0x2d);
808 2 }
809 1 tmp = pow(10.0,(float)int_bits);
810 1 // tmp = pow(10.0,3.0);
811 1 // lcd_wrd(0x31);
812 1 // lcd_dis_num(100);
813 1 // lcd_dis_num((uint)tmp);
814 1
815 1 dat = fabs(dat);
816 1 // lcd_wrd(0x32);
817 1 // lcd_dis_num(dat);
818 1 dat = dat%(long)tmp;
819 1 // lcd_dis_num(dat);
820 1 for(n=int_bits;n>1;n--)
821 1 {
822 2 tmp = pow(10,n-1);
823 2 a = dat/tmp;
824 2 lcd_wrd(0x30+a);
825 2 dat =dat%(long)tmp;
826 2 }
827 1 lcd_wrd(0x30+(uchar)dat);
828 1 }
829 void ad_ce_and_xian(void)
830 {
831 1
832 1 //ad data
833 1 // uchar hd = 0;
834 1 // uchar ld = 0;
835 1 uchar ad_data[2]={0};
836 1 //ad7109 work
837 1 //sta;
838 1 // ce = 0; //work
839 1 // while(sta == 0)
840 1 while(1)
841 1 {
842 2 ce = 1;
843 2 le = 1;
844 2 he = 1;
845 2 // Conver=0;//正在转换
846 2 ce = 1;
847 2 ce = 0;
848 2 he = 0;
849 2 ad_data[1] = P0;
850 2 ce = 1;
851 2 he = 1;
852 2 ce = 0;
853 2 le = 0;
854 2 ad_data[0] = P0;
855 2 ce = 1;
856 2 le = 1;
857 2 // Conver=1;//转换结束.
858 2 lcd_add(3,1);
859 2 lcd_dis_num(ad_data[1]&0x3f);
C51 COMPILER V7.07 AD7109 02/27/2007 10:02:55 PAGE 15
860 2 lcd_dis_num(ad_data[0]);
861 2
862 2
863 2
864 2
865 2
866 2 // delay(2000);
867 2 //先禁止输出
868 2 // le = 1;
869 2 // he = 1;
870 2 // he = 0;
871 2 // le = 0;
872 2 /*
873 2 //再读取数据
874 2 le = 0;
875 2 ld = P0;
876 2 le = 1;
877 2
878 2 he = 0;
879 2 hd = P0;
880 2 he = 1;
881 2 //读取完毕,再处理
882 2 lcd_add(3,1);
883 2 lcd_dis_num(hd&0x3f);
884 2 lcd_dis_num(ld);
885 2 */
886 2 /*
887 2 hd = hd&0x3f;
888 2
889 2
890 2
891 2 if(hd&0x10==1)
892 2 {
893 2 lcd_add(3,1);
894 2 lcd_dis_ch(0xd2,0xe7);
895 2 //return //溢出,错误了
896 2 }
897 2 else
898 2 {
899 2 ad_data=(((hd&0x0f)<<8)+ld)*2/2048;
900 2
901 2 if(hd&0x20==1) //正输入
902 2 {
903 2 lcd_add(1,1);
904 2 lcd_dis_num((uint)ad_data);
905 2 lcd_wrd(0x2e);
906 2 ad_data=ad_data*10000;
907 2 lcd_dis_num((uint)ad_data);
908 2 }
909 2 else
910 2 {
911 2 ad_data=(-1)*ad_data;
912 2 lcd_add(1,1);
913 2 lcd_wrd(0x2d);
914 2 lcd_dis_num((uint)ad_data);
915 2 lcd_wrd(0x2e);
916 2 ad_data=ad_data*10000;
917 2 lcd_dis_num((uint)ad_data);
918 2 }
919 2 }
920 2 delay(1000);
921 2
C51 COMPILER V7.07 AD7109 02/27/2007 10:02:55 PAGE 16
922 2 */
923 2 }
924 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1614 ----
CONSTANT SIZE = 2 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 31
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 + -