⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad7109.lst

📁 这是8051弹片机驱动AD芯片ICL7109的源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
 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 + -