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

📄 test.lst

📁 I2c如 IIc 24LC64等器件的51单片机驱动程序,已经通过实际验证,很好用的
💻 LST
字号:
C51 COMPILER V7.50   TEST                                                                  07/29/2006 20:52:24 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN test.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE test.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<reg51.h>
   2          
   3          #define uint unsigned int
   4          #define uchar unsigned char
   5           
   6          #define delaylcd 1
   7          #define LCD_Data P1 
   8          #define HIGH 1
   9          #define LOW 0 
  10          uchar tmp[4] ;
  11          sbit  RS  = P2^0 ;
  12          sbit  RW  = P2^1 ;
  13          sbit  EN  = P2^2 ;
  14          
  15          sbit SDA=P2^3;
  16          sbit SCL=P2^4; 
  17          
  18          void Delay_nms(uint Delay); // f = 4 MHZ
  19           
  20          void WRiteData(unsigned char WDLCM);
  21           
  22          void WRiteCommand(unsigned char WCLCM); 
  23          
  24          void LCDInit(void);
  25           
  26          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); 
  27          
  28          void DisplayOnedata(unsigned char X, unsigned char Y, unsigned int DData); 
  29          
  30          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char const *DData); 
  31          
  32          
  33          
  34          void delay( uint a)  //100<->2.424ms
  35          { 
  36   1        uint K;
  37   1        for( K=0;K<a;K++)
  38   1        ;
  39   1      }
  40          
  41          ////////////////////////////////I2C///////////////////////////////////////
  42          //提供I2C总线工作时序中的起始位
  43          void I_start(void)
  44          {
  45   1              SDA = HIGH;
  46   1              delay(4);
  47   1              SCL = HIGH;
  48   1              delay(4);
  49   1              SDA = LOW;//当SCL为高时,SDA的一个下降沿作为起始位
  50   1              delay(4);
  51   1              SCL = LOW;
  52   1              delay(4);
  53   1      }
  54          //提供I2C总线工作时序中的停止位
  55          void I_stop(void)
C51 COMPILER V7.50   TEST                                                                  07/29/2006 20:52:24 PAGE 2   

  56          {
  57   1              SDA = LOW;
  58   1              delay(4);
  59   1              SCL = HIGH;
  60   1              delay(4);
  61   1              SDA = HIGH;//当SCL为高时,SDA的一个上升沿作为停止位
  62   1              delay(4);
  63   1              SCL = LOW;
  64   1              delay(4);
  65   1      }
  66            
  67          //提供I2C总线的时钟信号,并返回时钟电平为高期间SDA信号线上状态
  68          bit I_clock(void)
  69          {
  70   1              bit sample;
  71   1              SCL = HIGH;
  72   1              delay(4);
  73   1              sample = SDA;
  74   1              SCL = LOW;
  75   1              delay(4);
  76   1              return (sample);
  77   1      }
  78          //向I2C总线发送8位数据,并请求一个应答信号ACK。如果收到ACK应答,则返回1,否则返回0。
  79          bit I_send(uchar I_data)
  80          {
  81   1              register uchar i;
  82   1              /*发送8位数据*/
  83   1       
  84   1              for(i=0;i<8;i++)
  85   1              {
  86   2                      SDA = (bit)(I_data & 0x80);
  87   2                      I_data <<= 1;
  88   2                      I_clock();
  89   2              }
  90   1              /*请求应答信号ACK*/
  91   1              SDA = HIGH;
  92   1              delay(4);
  93   1              return(~I_clock());
  94   1      }
  95          //从I2C总线上接收8位数据信号,并将接收到的8位数据作为一个字节返回,不回送应答信号。
  96          //主函数在调用本函数之前应保证SDA信号线处于浮置状态,SDA=1.
  97          uchar I_receive(void)
  98          {
  99   1              uchar I_data = 0;
 100   1              register uchar i;
 101   1              for(i=0;i<8;i++)
 102   1              {
 103   2                      I_data*=2;
 104   2                      if(I_clock())I_data++;
 105   2              }
 106   1              return (I_data);
 107   1      }
 108          
 109          uchar readI2c ( uchar address )
 110          {
 111   1        uchar ibuf = 0 ;
 112   1        I_start() ;
 113   1        I_send(0xa0);
 114   1        Delay_nms(5);
 115   1        I_send(0x00);
 116   1        Delay_nms(5);
 117   1        I_send( address );
C51 COMPILER V7.50   TEST                                                                  07/29/2006 20:52:24 PAGE 3   

 118   1        Delay_nms(5);
 119   1        I_start() ;
 120   1        Delay_nms(5);
 121   1        I_send(0xa1);
 122   1        ibuf = I_receive() ;
 123   1        I_stop( ) ;
 124   1        return ibuf ;
 125   1      }
 126             
 127           
 128          
 129          void writeI2c ( ) // 首地址 秒/分/时/天
 130          {
 131   1      
 132   1        I_start() ;
 133   1        I_send(0xa0);
 134   1        Delay_nms(5);
 135   1        I_send(0x00);
 136   1        Delay_nms(5);
 137   1        I_send(0x00);
 138   1        Delay_nms(5);
 139   1        I_send(0x01);  
 140   1        Delay_nms(5);
 141   1        I_send(0x02);  
 142   1        Delay_nms(5);
 143   1        I_send(0x03);
 144   1        Delay_nms(5);
 145   1        I_send(0x04);  
 146   1        Delay_nms(5);
 147   1        I_stop( ) ;
 148   1        Delay_nms(5);
 149   1      }
 150          
 151           
 152          void main(void) 
 153          { 
 154   1        uchar buf = 0 ;
 155   1        LCDInit() ; 
 156   1        DisplayOnedata(0,0,123 ) ;
 157   1      
 158   1        writeI2c() ;
 159   1        DisplayOnedata(0,1,readI2c(0)) ; 
 160   1        DisplayOnedata(3,1,readI2c(1)) ; 
 161   1        DisplayOnedata(6,1,readI2c(2)) ; 
 162   1        DisplayOnedata(9,1,readI2c(3)) ;
 163   1        
 164   1        DisplayOnedata(5,0,456 ) ;
 165   1        while( 1 ) ;
 166   1          
 167   1         
 168   1       }
 169          
 170          void Delay_nms(uint Delay) // f = 6MHZ
 171          { uint i;
 172   1        for(;Delay>0;Delay--)
 173   1         { for(i=0;i<83;i++)
 174   2               ;
 175   2         }
 176   1      }
 177          
 178          /*----------------------------------------------------------------*/ 
 179          /*     写数据                                                     */
C51 COMPILER V7.50   TEST                                                                  07/29/2006 20:52:24 PAGE 4   

 180          /*     输入:RS=1,WR=0,E=1,D0~D7=数据,E=高脉冲     输出:无    */ 
 181          /*----------------------------------------------------------------*/ 
 182          
 183          void WRiteData(unsigned char WDLCM) 
 184          { 
 185   1        Delay_nms( delaylcd ) ;
 186   1        //check_busy() ;
 187   1        LCD_Data = WDLCM; 
 188   1        RS=1; 
 189   1        RW=0; 
 190   1        EN=0; //若晶振速度太高可以在这后加小的延时 
 191   1         
 192   1        EN=1; 
 193   1      
 194   1        EN=0;
 195   1      
 196   1      } 
 197          
 198          /*----------------------------------------------------------------*/ 
 199          /*     写指令                                                     */
 200          /*     输入:RS=0,WR=0,E=1,D0~D7=指令码,E=高脉冲     输出:无  */ 
 201          /*----------------------------------------------------------------*/ 
 202          void WRiteCommand(unsigned char WCLCM  ) //BuysC为0时忽略忙检测 
 203          { 
 204   1         Delay_nms( delaylcd ) ; 
 205   1        
 206   1         LCD_Data = WCLCM; 
 207   1         RS = 0; 
 208   1         RW = 0; 
 209   1         EN=0; //若晶振速度太高可以在这后加小的延时 
 210   1      
 211   1         EN=1; 
 212   1      
 213   1         EN=0;
 214   1      } 
 215          
 216          
 217           
 218          
 219          void LCDInit(void) //LCM初始化 
 220          { 
 221   1         LCD_Data = 0; 
 222   1         WRiteCommand(0x38); //三次显示模式设置,不检测忙信号 
 223   1         Delay_nms(delaylcd); 
 224   1         WRiteCommand(0x38); 
 225   1         Delay_nms(delaylcd); 
 226   1         WRiteCommand(0x38); 
 227   1         Delay_nms(delaylcd); 
 228   1      
 229   1         WRiteCommand(0x38); //显示模式设置,开始要求每次检测忙信号 
 230   1         WRiteCommand(0x08); //关闭显示 
 231   1         WRiteCommand(0x01); //显示清屏 
 232   1         WRiteCommand(0x06); // 显示光标移动设置 
 233   1         WRiteCommand(0x0C); // 显示开及光标设置  
 234   1      } 
 235          
 236          //按指定位置显示一个字符 
 237          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) 
 238          { 
 239   1      
 240   1        Y &= 0x1; 
 241   1        X &= 0xF;         //限制X不能大于15,Y不能大于1 
C51 COMPILER V7.50   TEST                                                                  07/29/2006 20:52:24 PAGE 5   

 242   1        if (Y) 
 243   1           X |= 0x40;     //当要显示第二行时地址码+0x40; 
 244   1        X |= 0x80;        // 算出指令码 
 245   1        WRiteCommand(X);  //这里不检测忙信号,发送地址码 
 246   1        WRiteData(DData); 
 247   1      
 248   1      } 
 249          
 250          void DisplayOnedata(unsigned char X, unsigned char Y, unsigned int DData)
 251          {
 252   1               unsigned char i = 0 ;
 253   1            tmp[3] = tmp[2]= tmp[1] = tmp[0]= 0 ;
 254   1            while( DData )
 255   1             {
 256   2                     tmp[i] = 0x30 + DData% 10 ;
 257   2                     i++;
 258   2                 DData /=10 ;
 259   2             }
 260   1             i--;
 261   1            while( i !=0xff ) 
 262   1              { 
 263   2                      DisplayOneChar( X, Y, tmp[i] ) ;
 264   2                      X++ ;
 265   2                      i--;
 266   2                  }  
 267   1       } 
 268          //按指定位置显示一串字符  
 269          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char const *DData) 
 270          { 
 271   1        unsigned char ListLength; 
 272   1      
 273   1        ListLength = 0; 
 274   1        Y &= 0x1; 
 275   1        X &= 0xF;  
 276   1        while ( DData[ListLength] != '\0' )  
 277   1        { 
 278   2           
 279   2           DisplayOneChar(X, Y, DData[ListLength]);  
 280   2           ListLength++; 
 281   2           X++; 
 282   2               if ( X == 16  )
 283   2             {  Y ++ ;
 284   3                X = 0;
 285   3                        if( Y == 2 )
 286   3                          {
 287   4                                Y = 0 ;
 288   4                            Delay_nms(2000);
 289   4                            WRiteCommand(0x01 );  
 290   4                          }
 291   3             }
 292   2         } 
 293   1      } 
 294          
 295              
 296          
 297           
 298          
 299          
 300           
 301          
 302           

C51 COMPILER V7.50   TEST                                                                  07/29/2006 20:52:24 PAGE 6   


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    666    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4      11
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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