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

📄 sd2300api.lst

📁 这是铁路各工区
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V6.12  SD2300API                                                              11/29/2007 10:34:25 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE SD2300API
OBJECT MODULE PLACED IN F:\YUN\安全牌\安全牌C\SD2300API.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE F:\YUN\安全牌\安全牌C\SD2300API.C DB SB OE

stmt level    source

   1          #include "fun.h"
   2          #include "var.h"
   3          //SD2300API.C
   4          /*功能:提供I2C总线工作时序中的起始位*/
   5          void I2C_start(void)
   6          {SCLK=1;
   7   1       delay(1);
   8   1       SDAT=0;
   9   1       delay(1);
  10   1       SCLK=0;
  11   1       delay(1);}
  12          
  13          /*功能:提供I2C总线工作时序中的停止位*/
  14          void I2C_stop(void)
  15          {SDAT=0;
  16   1       delay(1);
  17   1       SCLK=1;
  18   1       delay(1);
  19   1       SDAT=1;
  20   1       delay(1);
  21   1       SCLK=0;
  22   1       delay(1);
  23   1      }
  24          
  25          /*功能:I2C总线初始化。在MAIN()函数中应先调用本函数,然后再调用其他函数。*/
  26          void I2C_init(void)
  27          {SCLK=0;
  28   1       I2C_stop();}
  29          
  30          /*功能:提供I2C的时钟信号,并返回在时钟电平为高期间SDAT信号线上状态。
  31           *本函数可用于数据接收。*/
  32          bit I2C_clock(void)
  33          {bit sample;
  34   1       SCLK=1;
  35   1       delay(1);
  36   1       sample=SDAT;
  37   1       SCLK=0;
  38   1       delay(1);
  39   1       return(sample);}
  40          
  41          /*功能:向I2C总线发送8位数据,并请求一个应答信号ACK。
  42           *如果收到ACK应答则返回1,否则返回0*/
  43          bit I2C_send(uchar I_data)
  44          {uchar i;
  45   1       /*发送8位数据*/
  46   1       for (i=0;i<8;i++)
  47   1       {SDAT=(bit)(I_data&0x80);
  48   2        I_data=I_data<<1;
  49   2        I2C_clock();}
  50   1       /*请求应答信号ACK*/
  51   1       SDAT=1;
  52   1       return(~I2C_clock());}
  53          
  54          /*功能:从I2C总线上接收8位数据信号,并将接收到8位数据作为一个
  55           *字节返回,不回送应答信号ACK。主函数在调用本函数之前应保证SDA
C51 COMPILER V6.12  SD2300API                                                              11/29/2007 10:34:25 PAGE 2   

  56           *信号线处于浮置状态,即SDA置1。*/
  57          uchar I2C_receive(void)
  58          {uchar I_data=0;
  59   1       uchar i;
  60   1       for(i=0;i<8;i++)
  61   1       {I_data<<=1;
  62   2        if(I2C_clock())I_data++;}
  63   1       return(I_data);
  64   1      }
  65          
  66          /*功能:向I2C总线发送一个应答信号ACK,一般用于连续数据读取时。*/
  67          void I2C_Ack(void)
  68          {SDAT=0;
  69   1       I2C_clock();
  70   1       SDAT=1;}
  71          
  72          
  73          
  74          /*功能:向SD2300API写入器件地址和一个指定的字节地址*/
  75          bit wr_address(uchar Address)
  76          {I2C_start();
  77   1       if(I2C_send(I2C_SD2300API_WR))return(I2C_send(Address));
  78   1       else return(FALSE);
  79   1      }
  80          
  81          //初始化SD2300API
  82          bit init_sd2300api(void)
  83          {I2C_init();
  84   1       if(wr_address(ADDR_ADJUST))   //从时间调整寄存器地址开始
  85   1       {//时间调整寄存器
  86   2        if(!I2C_send(ADJUST)){I2C_stop();return(FALSE);}
  87   2        //ALARM-A定时:每天18点00分
  88   2        if(!I2C_send(MINUTE_A)){I2C_stop();return(FALSE);}
  89   2        if(!I2C_send(HOUR_A)){I2C_stop();return(FALSE);}
  90   2        if(!I2C_send(WEEK_A)){I2C_stop();return(FALSE);}
  91   2        //ALARM-B定时:每天18点00分
  92   2        if(!I2C_send(MINUTE_B)){I2C_stop();return(FALSE);}
  93   2        if(!I2C_send(HOUR_B)){I2C_stop();return(FALSE);}
  94   2        if(!I2C_send(WEEK_B)){I2C_stop();return(FALSE);}
  95   2        //控制寄存器1设置
  96   2        if(!I2C_send(CONTROL1)){I2C_stop();return(FALSE);}
  97   2        //控制寄存器2设置
  98   2        if(!I2C_send(CONTROL2)){I2C_stop();return(FALSE);}
  99   2        I2C_stop();delay(600); return(TRUE);
 100   2       }
 101   1       else {I2C_stop();return(FALSE);}
 102   1      }
 103          
 104          //读时间日期
 105          bit rd_date(void)
 106          {EA=0;
 107   1       I2C_init();
 108   1       if(wr_address(ADDR_SECOND))/*发送重复启动信号*/
 109   1       {I2C_start();
 110   2        if(I2C_send(I2C_SD2300API_RD))
 111   2        {bcd1_realtime.second=I2C_receive();I2C_Ack();
 112   3         bcd1_realtime.minute=I2C_receive();I2C_Ack();
 113   3         bcd1_realtime.hour  =I2C_receive();I2C_Ack();
 114   3         bcd1_realtime.week  =I2C_receive();I2C_Ack();
 115   3         bcd1_realtime.day   =I2C_receive();I2C_Ack();
 116   3         bcd1_realtime.month =I2C_receive();I2C_Ack();
 117   3         bcd1_realtime.year  =I2C_receive();I2C_Ack();
C51 COMPILER V6.12  SD2300API                                                              11/29/2007 10:34:25 PAGE 3   

 118   3         I2C_stop();EA=1;return(TRUE);
 119   3        }
 120   2        else{I2C_stop();EA=1;return(FALSE);}
 121   2       }
 122   1       else {I2C_stop();EA=1;return(FALSE);}
 123   1       EA=1;
 124   1      }
 125          
 126          //写时间日期
 127          bit wr_date(void)
 128          {EA=0;
 129   1       I2C_init();
 130   1       if(wr_address(ADDR_SECOND))   //从秒地址开始
 131   1       {//秒,分,时,周,日,月,年
 132   2        if(!I2C_send(bcd1_realtime.second)){I2C_stop();EA=1;return(FALSE);}
 133   2        if(!I2C_send(bcd1_realtime.minute)){I2C_stop();EA=1;return(FALSE);}
 134   2        if(!I2C_send(bcd1_realtime.hour))  {I2C_stop();EA=1;return(FALSE);}
 135   2        if(!I2C_send(bcd1_realtime.week))  {I2C_stop();EA=1;return(FALSE);}
 136   2        if(!I2C_send(bcd1_realtime.day))   {I2C_stop();EA=1;return(FALSE);}
 137   2        if(!I2C_send(bcd1_realtime.month)) {I2C_stop();EA=1;return(FALSE);}
 138   2        if(!I2C_send(bcd1_realtime.year))  {I2C_stop();EA=1;return(FALSE);}
 139   2        //时间调整寄存器
 140   2        if(!I2C_send(ADJUST)){I2C_stop();EA=1;return(FALSE);}
 141   2        I2C_stop();delay(600);EA=1;return(TRUE);
 142   2       }
 143   1       else {I2C_stop();EA=1;return(FALSE);}
 144   1      }
 145          /*
 146          //查中断标记,返回
 147          uchar rd_control2(void)
 148          {uchar i;
 149           I2C_init();
 150           if(wr_address(ADDR_CONTROL2))//发送重复启动信号
 151           {I2C_start();
 152            if(I2C_send(I2C_SD2300API_RD))
 153            {i=I2C_receive();
 154             I2C_Ack();
 155             I2C_stop();
 156             return(i);
 157            }
 158            else{I2C_stop();return(FALSE);}
 159           }
 160           else {I2C_stop();return(FALSE);}
 161          } */
 162          
 163          //清中断标记
 164          uchar wr_control2(void)
 165          {I2C_init();
 166   1       if(wr_address(ADDR_CONTROL2))
 167   1       {//清除中断标记
 168   2        if(!I2C_send(CONTROL2)){I2C_stop();return(FALSE);}
 169   2        I2C_stop();delay(600); return(TRUE);
 170   2       }
 171   1       else {I2C_stop();return(FALSE);}
 172   1      }
 173          /********************中断************************/
 174          /*外部中断INT0初始化函数*/
 175          /*

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -