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

📄 24cxx.lst

📁 单片机开发板源程序适合初学者 第一部分4*4矩阵式键盘
💻 LST
字号:
C51 COMPILER V7.06   24CXX                                                                 09/13/2007 02:28:52 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE 24CXX
OBJECT MODULE PLACED IN 24CXX.OBJ
COMPILER INVOKED BY: C:\tools\Keil\C51\BIN\C51.EXE 24CXX.C BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*实验名称:读写AT24C02实验
   2            功能:用串口发送指令读出或写入00-7FH单无的内容,显示结果在LCD上显示
   3            读出(16进制数):AA 地址
   4            写入(16进制数):BB 地址 内容
   5            作者:http://www.mcuprog.com
   6                  05-02-01
   7          */
   8          #include <reg51.h>
   9          #include <intrins.h>
  10          #define Uchar unsigned char
  11          #define Uint  unsigned int
  12          #define SomeNOP(); _nop_();_nop_();_nop_(); 
  13          //定义变量
  14          Uchar recip,recsum,recdata[2];  //接收指针,接收个数,用户标志,接收存放数组
  15          Uchar bdata myflag;
  16          sbit readbit = myflag^0;        //读EEPROM标志
  17          sbit writebit = myflag^1;       //写EEPROM标志
  18          sbit rs232okbit = myflag^2;     //接收完一拍完整的指令
  19          
  20          /*I2C要用到的口线定意*/
  21          sbit SDA = P3^4;
  22          sbit SCL = P3^3;
  23          
  24          /*控制的口线定意*/
  25          sbit E=P2^2;
  26          sbit RW=P2^1;
  27          sbit RS=P2^0;
  28          //LCD驱动要用到的一些子程序
  29          //-------------------------------------
  30          void Delay(unsigned int t)   // delay 40us
  31          {
  32   1       for(;t!=0;t--) ;
  33   1      }
  34          //=============================================
  35          void SendCommandByte(unsigned char ch)
  36          {
  37   1         RS=0;
  38   1         RW=0;
  39   1         P0=ch;
  40   1         E=1;
  41   1          Delay(1);
  42   1         E=0;
  43   1         Delay(100);  //delay 40us
  44   1      }
  45          //-------------------------------------------------------
  46          void SendDataByte(unsigned char ch)
  47          {  RS=1;
  48   1         RW=0;
  49   1         P0=ch;
  50   1         E=1;
  51   1             Delay(1);
  52   1         E=0;
  53   1         Delay(100); //delay 40us
  54   1      }
  55          //-------------------------------------------------
C51 COMPILER V7.06   24CXX                                                                 09/13/2007 02:28:52 PAGE 2   

  56          void InitLcd()
  57          {SendCommandByte(0x30);
  58   1       SendCommandByte(0x30);
  59   1       SendCommandByte(0x30);
  60   1       SendCommandByte(0x38); //设置工作方式
  61   1       SendCommandByte(0x0c); //显示状态设置
  62   1       SendCommandByte(0x01); //清屏
  63   1       SendCommandByte(0x06); //输入方式设置
  64   1      }
  65          
  66          
  67          
  68          /*----------------------I2C要用到的一些子程序---------------------------------*/
  69          /***********************以下为一些用到的子程序*********************************/
  70          /*延时子程序*/
  71          void Delay_1ms(Uchar time)
  72          {
  73   1              Uchar j;
  74   1              while(time--)
  75   1              {
  76   2                      for(j=163;j!=0;j--)
  77   2                      {;}
  78   2              }
  79   1      }
  80          
  81          /*I2C的起动程序*/
  82          void I2CStart(void)     
  83          {
  84   1              SDA = 1;
  85   1              SomeNOP();
  86   1              SCL = 1;
  87   1              SomeNOP();
  88   1              SDA = 0;
  89   1              SomeNOP();
  90   1              SCL = 0;
  91   1              SomeNOP();
  92   1      }
  93          
  94          /*I2C的停止程序*/
  95          void I2CStop(void)
  96          {
  97   1              SDA = 0;
  98   1              SomeNOP();
  99   1              SCL = 1;
 100   1              SomeNOP();
 101   1              SDA = 1;
 102   1              SomeNOP();
 103   1      }
 104          
 105          void ACK(void)                  //Acknowledge信号
 106          {
 107   1              SDA = 0;
 108   1              SomeNOP();
 109   1              SCL = 1;
 110   1              SomeNOP();
 111   1              SCL = 0;
 112   1              SomeNOP();
 113   1      }
 114          
 115          void NACK(void)                 //没有Acknowledge信号
 116          {
 117   1              SDA = 1;
C51 COMPILER V7.06   24CXX                                                                 09/13/2007 02:28:52 PAGE 3   

 118   1              SomeNOP();
 119   1              SCL = 1;
 120   1              SomeNOP();
 121   1              SCL = 0;
 122   1              SomeNOP();
 123   1      }
 124          
 125          void AutoACK(void)              //在一定的时间内自动确定ACK的信号//
 126          {
 127   1              Uchar i = 0;
 128   1              SCL = 1;
 129   1              SomeNOP();
 130   1              while((SDA == 1)&&(i<255))i++;
 131   1              SCL = 0;
 132   1              SomeNOP();
 133   1      }
 134          
 135                  
 136          /*I2C写数据程序(向数据线上写一个BYTE)*/
 137          void Writex(Uchar j)
 138          {
 139   1              Uchar i,temp;
 140   1              temp = j;
 141   1              for (i=0;i<8;i++)       //串行移位,先送高位,再送低位//
 142   1              {
 143   2                      temp =temp<<1;
 144   2                      SCL = 0;
 145   2                      SomeNOP();
 146   2                      SDA = CY;
 147   2                      SomeNOP();
 148   2                      SCL = 1;
 149   2                      SomeNOP();
 150   2              }
 151   1              SCL = 0;
 152   1              SomeNOP();
 153   1              SDA = 1;
 154   1              SomeNOP();
 155   1      }
 156          /*I2C读数据程序(从数据线上读出一个BYTE)返回值为读出的数据(BYTE型)*/
 157          Uchar Readx(void)
 158          {
 159   1              Uchar i,j,k=0;
 160   1              SCL = 0;
 161   1              SomeNOP();
 162   1              SDA = 1;
 163   1              for (i=0;i<8;i++)       // 串行移位,先读出高位,后读出低位//
 164   1              {
 165   2                      SomeNOP();
 166   2                      SCL = 1;
 167   2                      SomeNOP();
 168   2                      if(SDA ==1) j=1;
 169   2                      else    j=0;
 170   2                      k =(k<<1)|j;
 171   2                      SCL = 0;
 172   2              }
 173   1              SomeNOP();              
 174   1              return(k);              //返回读出的值//
 175   1      }
 176          
 177          //******************以下为对24CXX系列的读写程序******************************//
 178          //*************24CXX的device address 为写0A0H,读为0A1H*********************//
 179          /*某个地址写数据*/
C51 COMPILER V7.06   24CXX                                                                 09/13/2007 02:28:52 PAGE 4   

 180          void X24_Write(Uchar Addresslow,Uchar Write_date)
 181          {
 182   1              I2CStart();
 183   1              Writex(0xA0);
 184   1              AutoACK();
 185   1              Writex(Addresslow);
 186   1              AutoACK();
 187   1              Writex(Write_date);
 188   1              AutoACK();
 189   1              I2CStop();
 190   1              Delay_1ms(10);
 191   1      }
 192          
 193          /*对某个地址读操作,函数值为读出的数据*/
 194          Uchar X24_Read(Uchar Addresslow)
 195          {       
 196   1              Uchar i;
 197   1              I2CStart();
 198   1              Writex(0xA0);
 199   1              AutoACK();
 200   1              Writex(Addresslow);
 201   1              AutoACK();
 202   1              I2CStart();
 203   1              Writex(0xA1);
 204   1              AutoACK();
 205   1              i =Readx();
 206   1              //ACK();        //注意:这里不能有ACK应答信号//
 207   1              I2CStop();
 208   1              Delay_1ms(0);
 209   1              return(i);
 210   1      }
 211          
 212          //以下为串行口中断程序,用于接收串行数据
 213          void rs232(void) interrupt 4
 214          {
 215   1              if(RI==1)
 216   1              {
 217   2                      RI=0;
 218   2                      if(SBUF==0xaa)
 219   2                      {
 220   3                              recsum=0x01;
 221   3                              readbit=1;
 222   3                              recip=0x00;
 223   3                      }
 224   2                      else
 225   2                      {
 226   3                              if(SBUF==0xbb)
 227   3                              {
 228   4                                      recsum=0x02;
 229   4                                      writebit=1;
 230   4                                      recip=0x00;
 231   4                              }
 232   3                              else
 233   3                              {
 234   4                                      recdata[recip]=SBUF;
 235   4                                      recip++;
 236   4                                      recsum--;
 237   4                                      if(recsum==0x00){rs232okbit=1;}
 238   4                              }
 239   3                      }
 240   2                      
 241   2              }
C51 COMPILER V7.06   24CXX                                                                 09/13/2007 02:28:52 PAGE 5   

 242   1      }
 243          
 244          //以下为定时器中断程序,
 245          void time0(void) interrupt 1
 246          {
 247   1              Uchar   temp,k;
 248   1              TH0=0xfc;
 249   1              TL0=0x67;
 250   1              if(rs232okbit==1)
 251   1              {
 252   2                      rs232okbit=0;
 253   2                      if(readbit==1)
 254   2                      {
 255   3                              readbit=0;
 256   3                              temp=X24_Read(recdata[0]);
 257   3                              SendCommandByte(0x87);
 258   3                              k=(recdata[0]>>4)&0x0f;
 259   3                              if(k<0x0a){k=k+0x30;}
 260   3                              else{k=k+0x37;}
 261   3                              SendDataByte(k);
 262   3                              k=recdata[0]&0x0f;
 263   3                              if(k<0x0a){k=k+0x30;}
 264   3                              else{k=k+0x37;}
 265   3                              SendDataByte(k);
 266   3      
 267   3                              SendCommandByte(0xC7);
 268   3                              k=(temp>>4)&0x0f;
 269   3                              if(k<0x0a){k=k+0x30;}
 270   3                              else{k=k+0x37;}
 271   3                              SendDataByte(k);
 272   3                              k=temp&0x0f;
 273   3                              if(k<0x0a){k=k+0x30;}
 274   3                              else{k=k+0x37;}
 275   3                              SendDataByte(k);        
 276   3                      }
 277   2                      if(writebit==1)
 278   2                      {
 279   3                              writebit=0;
 280   3                              SendCommandByte(0x87);
 281   3                              
 282   3                              k=(recdata[0]>>4)&0x0f;
 283   3                              if(k<0x0a){k=k+0x30;}
 284   3                              else{k=k+0x37;}
 285   3                              SendDataByte(k);
 286   3                              k=recdata[0]&0x0f;
 287   3                              if(k<0x0a){k=k+0x30;}
 288   3                              else{k=k+0x37;}
 289   3                              SendDataByte(k);
 290   3      
 291   3                              SendCommandByte(0xC7);
 292   3                              k=(recdata[1]>>4)&0x0f;
 293   3                              if(k<0x0a){k=k+0x30;}
 294   3                              else{k=k+0x37;}
 295   3                              SendDataByte(k);
 296   3                              k=recdata[1]&0x0f;
 297   3                              if(k<0x0a){k=k+0x30;}
 298   3                              else{k=k+0x37;}
 299   3                              SendDataByte(k);        
 300   3                              X24_Write(recdata[0],recdata[1]);
 301   3                      }
 302   2                      
 303   2              }
C51 COMPILER V7.06   24CXX                                                                 09/13/2007 02:28:52 PAGE 6   

 304   1      }
 305          
 306          void main(void)
 307          {
 308   1              
 309   1              InitLcd();
 310   1              SendCommandByte(0x80);
 311   1              Delay(2);
 312   1              SendDataByte('A');
 313   1              SendDataByte('D');
 314   1              SendDataByte('D');
 315   1              SendDataByte('R');
 316   1              SendDataByte('E');
 317   1              SendDataByte(':');
 318   1              SendCommandByte(0xC0);
 319   1              Delay(2);
 320   1              SendDataByte('M');
 321   1              SendDataByte('E');
 322   1              SendDataByte('M');
 323   1              SendDataByte('O');
 324   1              SendDataByte('R');
 325   1              SendDataByte('Y');
 326   1              SendDataByte(':');
 327   1              TH0=0xfc;
 328   1              TL0=0x67;
 329   1              TH1=0xfd;
 330   1              TL1=0xfd;
 331   1              TMOD=0x21;
 332   1              SCON=0x50;
 333   1              TR0=1;TR1=1;
 334   1              IE=0x92;
 335   1              REN=1;
 336   1              readbit=1;
 337   1              rs232okbit=1;
 338   1              while(1)
 339   1              {}
 340   1              
 341   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    820    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      5    ----
   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 + -