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

📄 iic_io.lst

📁 FM31256实时时钟代码 FM31256为铁电公司带FLASH的时钟芯片
💻 LST
字号:
C51 COMPILER V7.06   IIC_IO                                                                11/03/2008 16:34:29 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE IIC_IO
OBJECT MODULE PLACED IN IIC_IO.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.exe IIC_IO.C DB OE

stmt level    source

   1          #include <c8051f040.h>
   2          #include "intrins.h"
   3          
   4           /**********************另外相关的定义*********************************/
   5           #define HIGH               1
   6           #define LOW                0   
   7           #define TURE               1
   8           #define  FALSE             0
   9           #define  uchar unsigned char
  10           #define  uint  unsigned int
  11           
  12           void delay_ms(uint n);
  13          
  14           /*********************结束***********************************************/
  15          /***************************DS1307开始*****************************************************************/
  16          #define    Wait1us        _nop_();
  17          #define    Wait2us        {_nop_();_nop_();}
  18          #define    Wait4us        {Wait2us;Wait2us;}
  19          #define    Wait8us        {Wait4us;Wait4us;}
  20          #define    Wait10us    {Wait8us;Wait2us;}
  21          #define    WRITEDS1307    0xD0
  22          #define    READDS1307    0xD1  
  23          
  24          sbit SDA=P0^2;      //DS1307 Serial-Data Input    pin 5 
  25          sbit SCL=P0^3;     //DS1307 Serial-Clock Input    pin 6
  26          /************************************************************/
  27          void I2C_start(void);//I2C start function
  28          void I2C_stop(void);//I2C stop function
  29          //void I2C_send_ack(void);//I2C send responsion function 
  30          void I2C_send_noack(void);
  31          void I2C_write_byte(unsigned char IIC_data);//I2C bus write byte function 
  32          unsigned char I2C_read_byte(void);//I2C bus read byte function
  33          /***********************************************************************/
  34          void Write1307(unsigned char add,unsigned char dat);//write information to ds1307
  35          unsigned char Read1307(unsigned char add);//read information from ds1307
  36          void Read_RTC(void);//read RTC 
  37          void Set_RTC(void);//set RTC 
  38          void OSCILLATOR_Init (void);
  39          void PORT_Init (void);
  40          /***********************************************************************/
  41          code unsigned char set_rtc_code[7]={0x00,0x34,0x16,0x1,0x03,0x11,0x08};
  42          code unsigned char rtc_address[7]={0x02,0x03,0x04,0x05,0x06,0x07,0x08};//DS1307
  43          code unsigned char *day[7]={"Mon","Tue","Wen","Thu","Fri","Sat","Sun"};
  44          unsigned char read_rtc_code[7];
  45          /***********************************************************************/
  46          void Initial(void);//system initize function
  47          /***********************************************************************/
  48          /***********************************************************************/
  49          void main(void)
  50          {
  51   1      
  52   1              WDTCN = 0xde;                       /*关看门狗*/
  53   1              WDTCN = 0xad;
  54   1              OSCILLATOR_Init ();                     
  55   1              
C51 COMPILER V7.06   IIC_IO                                                                11/03/2008 16:34:29 PAGE 2   

  56   1              PORT_Init ();                            // Initialize crossbar and GPIO
  57   1          Set_RTC();
  58   1      
  59   1              while(1)
  60   1              {       
  61   2                      Write1307(0x00,0x01);
  62   2                      Read_RTC();
  63   2                      Write1307(0x00,0x00);
  64   2              } 
  65   1      }
  66          
  67          
  68          
  69          void OSCILLATOR_Init (void)
  70          {
  71   1          int i = 0;
  72   1          SFRPAGE   = CONFIG_PAGE;
  73   1          OSCXCN    = 0x77;
  74   1          for (i = 0; i < 256; i++);  // Wait 1ms for initialization
  75   1          while ((OSCXCN & 0x80) == 0);
  76   1          CLKSEL    = 0x01;                                     
  77   1      }
  78          
  79          void PORT_Init (void)
  80          {
  81   1              SFRPAGE = CONFIG_PAGE;                 // Switch to configuration page
  82   1              XBR2    = 0x40;                     // Enable crossbar and weak pull-ups
  83   1              P0MDOUT |= 0xff;                    // enable P0 (LED) as push-pull output
  84   1              P1MDOUT |= 0xff;                    // enable P1 (LED) as push-pull output
  85   1              P4MDOUT |= 0xff;                    // enable P5 (LED) as push-pull output
  86   1              P5MDOUT |= 0xff;                    // enable P5 (LED) as push-pull output
  87   1              P6MDOUT |= 0xff;                    // enable P5 (LED) as push-pull output
  88   1              P7MDOUT |= 0xff;                    // enable P5 (LED) as push-pull output
  89   1      
  90   1              P4 = 0;
  91   1              P5 = 0;
  92   1              P6 = 0;
  93   1              P7 = 0;
  94   1      }
  95          
  96          
  97          /***********************************************************************/
  98          void I2C_start(void)
  99          {
 100   1              SDA=1;
 101   1              SCL=1;
 102   1              Wait8us;
 103   1              SDA=0;
 104   1              Wait8us;
 105   1              SCL=0;
 106   1        
 107   1      }
 108          /***********************************************************************/
 109          void I2C_stop(void)
 110          {
 111   1              SDA=0;
 112   1              SCL=1;
 113   1              Wait8us;
 114   1              SDA=1;
 115   1              Wait4us;
 116   1              SCL=0;
 117   1      }
C51 COMPILER V7.06   IIC_IO                                                                11/03/2008 16:34:29 PAGE 3   

 118          /***********************************************************************/
 119          void I2C_send_ack(void)
 120          {
 121   1              SDA=0;
 122   1              Wait2us;
 123   1              SCL=1;
 124   1              Wait4us;
 125   1              SCL=0;
 126   1              Wait2us;
 127   1      }
 128          /*************************************************************************/
 129          void I2C_send_noack(void)
 130          {
 131   1              SDA=1;
 132   1              Wait2us;
 133   1              SCL=1;
 134   1              Wait4us;
 135   1              SCL=0;
 136   1              Wait2us;
 137   1      }
 138          
 139          unsigned char IICCheckAcknowledge()    /*IIC总线检测从机应答位*/
 140          {
 141   1              unsigned char IICAckFlag;
 142   1              
 143   1              SDA=1;        /*SDA=1; 线与吗?应为SDA=0?*/
 144   1              Wait2us;     
 145   1              SCL=1;
 146   1              Wait2us;
 147   1              IICAckFlag=0;
 148   1              
 149   1              if(SDA==0)     /*应答正常*/
 150   1              {
 151   2                      Wait2us;
 152   2                      SCL=0;
 153   2                      return(IICAckFlag);
 154   2              }
 155   1              else 
 156   1              {
 157   2                      IICAckFlag=1;      /*应答不正常*/
 158   2                      Wait2us;
 159   2                      SCL=0;
 160   2                      return(IICAckFlag);
 161   2              } 
 162   1      }
 163          /***********************************************************************/
 164          void I2C_write_byte(unsigned char IIC_data)
 165          {
 166   1           unsigned char i;
 167   1           for(i=0;i<8;i++)
 168   1               {
 169   2                      SCL=0;
 170   2                      if((IIC_data<<i) & 0x80)
 171   2                      SDA=1;                   //判断发送位
 172   2                      else SDA=0;
 173   2                      Wait2us;
 174   2                      SCL=1;
 175   2                      Wait4us;
 176   2                      SCL=0;
 177   2              }
 178   1          Wait4us;
 179   1          SDA=1; //发送完8bit,释放总线准备接收应答位
C51 COMPILER V7.06   IIC_IO                                                                11/03/2008 16:34:29 PAGE 4   

 180   1          Wait2us;
 181   1          SCL=1;
 182   1          Wait4us; //sda上数据即是从应答位
 183   1          SCL=0; //不考虑从应答位|但要控制好时序
 184   1       }
 185          /***********************************************************************/
 186          unsigned char I2C_read_byte(void)
 187          {
 188   1              unsigned char i,dat;
 189   1              dat=0;
 190   1              SDA=1;
 191   1              for (i=0;i<8;i++)
 192   1              {
 193   2                      dat=dat<<1;
 194   2                      SCL=1;
 195   2                      Wait2us;
 196   2                      if(SDA==1)
 197   2                      {
 198   3                              dat++;
 199   3                      }
 200   2                      SCL=0;  
 201   2              }  
 202   1              return (dat); 
 203   1      }
 204          /***********************************************************************/
 205          /******************************** DS1307 PART START  ****************/
 206          void Write1307(unsigned char add,unsigned char dat)
 207          {
 208   1              I2C_start();
 209   1              I2C_write_byte(WRITEDS1307);
 210   1              I2C_write_byte(add);
 211   1              I2C_write_byte(dat);
 212   1              I2C_stop();
 213   1      }
 214            
 215          /***********************************************************************/
 216          unsigned char Read1307(unsigned char add)
 217          {
 218   1              unsigned char dat;
 219   1              I2C_start();
 220   1              I2C_write_byte(WRITEDS1307);
 221   1              I2C_write_byte(add);
 222   1              I2C_start();
 223   1              I2C_write_byte(READDS1307);
 224   1              dat=I2C_read_byte(); 
 225   1              I2C_send_noack();
 226   1              I2C_stop();        
 227   1              return (dat);
 228   1      }
 229          /****************************读DS1307的寄存器*******************************************/
 230          void Read_RTC(void)
 231          {
 232   1              unsigned char i,*p;
 233   1              p=rtc_address;
 234   1              for(i=0;i<7;i++)
 235   1              {
 236   2                      read_rtc_code[i]=Read1307(*p);
 237   2                      p++;
 238   2              }
 239   1      }
 240          /***************************DS1307的初始化********************************************/
 241          void Set_RTC(void)
C51 COMPILER V7.06   IIC_IO                                                                11/03/2008 16:34:29 PAGE 5   

 242          {
 243   1              unsigned char i,*p;
 244   1      
 245   1              p=rtc_address;
 246   1              Write1307(0x00,0x02);
 247   1              for(i=0;i<7;i++)
 248   1              {
 249   2                      Write1307(*p,set_rtc_code[i]);
 250   2                      p++;  
 251   2              }
 252   1              Write1307(0x00,0x00);
 253   1              Write1307(0x01,0x00);
 254   1      
 255   1      }  


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    420    ----
   CONSTANT SIZE    =     63    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7       1
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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