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

📄 main.lst

📁 keil c51 UART --IC 源程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 253   1                      I2C_SDA = 0;
 254   1              shift >>= 1;
 255   1      
 256   1              // Disable interrupt where sending byte.
 257   1              EA = 0;
 258   1      
 259   1              //Release the CLOCK line to start/continue transfer
 260   1              I2C_SCL = 1;
 261   1      
 262   1              while(1)
 263   1              {
 264   2                      if(I2C_SCL)
 265   2                      {
 266   3                              if(!old_scl)
 267   3                              {
 268   4                                      //Read the Acknowledge bit.
 269   4                                      if(byte_ok)
 270   4                                      {
 271   5                                              if(!I2C_SDA)
 272   5                                                      bits_wrote++;
 273   5                                      }
 274   4                                      else
 275   4                                      {
 276   5                                              bits_wrote++;
 277   5                                      }
 278   4                              }
 279   3                              old_scl = 1;
 280   3                      }
 281   2                      else
 282   2                      {
 283   3                              if(old_scl)
 284   3                              {
 285   4                                      if(byte_ok)
 286   4                                      {
 287   5                                              I2C_SCL = 0;
 288   5      
 289   5                                              break;
 290   5                                      }
 291   4      
 292   4                                      if(shift)
 293   4                                      {
 294   5                                              if(c & shift)
 295   5                                                      I2C_SDA = 1;
 296   5                                              else
 297   5                                                      I2C_SDA = 0;
 298   5      
 299   5                                              shift >>= 1;
 300   5                                      }
 301   4                                      else
 302   4                                      {
 303   5                                              //Release SDA
C51 COMPILER V8.02   MAIN                                                                  05/25/2007 19:23:10 PAGE 6   

 304   5                                              I2C_SDA = 1;
 305   5      
 306   5                                              byte_ok = true;
 307   5                                      }
 308   4      
 309   4                                      old_scl = 0;
 310   4                              }
 311   3                      }
 312   2              }
 313   1              // Enable interrupt when byte complete
 314   1              EA = 1;
 315   1      
 316   1              return bits_wrote;
 317   1      }
 318          
 319          static void i2cSendStop(void)
 320          {
 321   1              bool old_scl;
 322   1              bool old_sda;
 323   1      
 324   1              // Disable interrupt where sending stop.
 325   1              EA = 0;
 326   1      
 327   1              I2C_SCL = 1;
 328   1      
 329   1              old_scl = I2C_SCL;
 330   1      
 331   1              while(1)
 332   1              {
 333   2                      if(I2C_SCL)
 334   2                      {
 335   3                              if(!old_scl)
 336   3                              {
 337   4                                      I2C_SCL = 0;
 338   4                                      I2C_SCL = 0;
 339   4                                      I2C_SCL = 0;
 340   4                                      I2C_SCL = 0;
 341   4      
 342   4                                      I2C_SCL = 1;
 343   4      
 344   4                                      old_scl = 1;
 345   4                              }
 346   3                              else
 347   3                              {
 348   4                                      if(old_sda != I2C_SDA)
 349   4                                      {
 350   5                                              if(old_sda)     //HIGH to LOW: Repeated START condition
 351   5                                              {
 352   6                                                      i2c_start = true;
 353   6                                                      i2c_terminated = true;
 354   6                                              }
 355   5                                              else            //LOW to HIGH: STOP condition
 356   5                                              {
 357   6                                                      i2c_start = false;
 358   6                                                      i2c_terminated = true;
 359   6                                              }
 360   5                                              break;
 361   5                                      }
 362   4                              }
 363   3                              old_sda = I2C_SDA;
 364   3                              break;
 365   3                      }
C51 COMPILER V8.02   MAIN                                                                  05/25/2007 19:23:10 PAGE 7   

 366   2                      else
 367   2                      {
 368   3                              old_scl = 0;
 369   3                      }
 370   2              }
 371   1              // Enable interrupt when transfer complete.
 372   1              EA = 1;
 373   1      }
 374          
 375          static void QueueI2cChar(uchar c)
 376          {
 377   1              // Force a character to be sent immediately.
 378   1              while(i2c_buf_cnt + 1 >= I2C_BUFFER_SIZE)
 379   1              {
 380   2                      if(UartPutChar(i2c_buf[i2c_buf_pos]))
 381   2                      {
 382   3                              i2c_buf_pos = (i2c_buf_pos + 1) % I2C_BUFFER_SIZE;
 383   3                              i2c_buf_cnt--;
 384   3                      }
 385   2              }
 386   1              // Queue the character to the i2c buffer
 387   1              i2c_buf[(i2c_buf_pos + i2c_buf_cnt) % I2C_BUFFER_SIZE] = c;
 388   1              i2c_buf_cnt = (i2c_buf_cnt + 1) % I2C_BUFFER_SIZE;
 389   1      }
 390          
 391          static void ProcessI2cTransfer(void)
 392          {
 393   1              ubyte i2c_addr;
 394   1              ubyte c;
 395   1      
 396   1              while(i2c_start)
 397   1              {
 398   2                      //Receive address byte */
 399   2                      ubyte bits;
 400   2                      i2c_terminated = false;
 401   2                      
 402   2                      bits = i2cReceiveByte(&i2c_addr);                               
 403   2      
 404   2                      if(bits == 9)
 405   2                      {
 406   3                              if(i2c_addr & 0x01)     //Read mode
 407   3                              {
 408   4                                      ubyte i;
 409   4                                      ubyte bytes_wrote = 0;
 410   4              
 411   4                                      if(num_packets)
 412   4                                      {
 413   5                                              ubyte pkt_size = s_buf[(s_buf_pos + 1) % UART_BUFFER_SIZE] + 1;
 414   5                                              for(i = 1; i < pkt_size; i++)
 415   5                                              {
 416   6                                                      ubyte bits = i2cSendByte(s_buf[(s_buf_pos + i) % UART_BUFFER_SIZE]);
 417   6                                                      if(bits >= 8)
 418   6                                                              bytes_wrote++;
 419   6                                                      if(bits <= 8)
 420   6                                                              break;
 421   6                                              }
 422   5                                              if(bytes_wrote == pkt_size - 1)
 423   5                                              {
 424   6                                                      s_buf_pos = (s_buf_pos + pkt_size) % UART_BUFFER_SIZE;
 425   6                                                      s_buf_cnt -= pkt_size;
 426   6                                                      if((--num_packets) == 0)
 427   6                                                              I2C_INT = 0;
C51 COMPILER V8.02   MAIN                                                                  05/25/2007 19:23:10 PAGE 8   

 428   6                                              }
 429   5                                      }
 430   4                                      else
 431   4                                      {
 432   5                                              i2cSendByte(0);
 433   5                                      }
 434   4              
 435   4                                      if(!i2c_terminated)
 436   4                                              i2cSendStop();
 437   4                              }
 438   3                              else    //write mode
 439   3                              {
 440   4                                      QueueI2cChar(PACKET_START);
 441   4                                      while(1)
 442   4                                      {
 443   5                                              ubyte bits_read = i2cReceiveByte(&c);
 444   5                                              if(bits_read == 9)
 445   5                                              {
 446   6                                                      QueueI2cChar(c);
 447   6                                              }
 448   5                                              if(i2c_terminated)
 449   5                                              {
 450   6                                                      break;
 451   6                                              }
 452   5                                      }
 453   4                              }
 454   3                      }
 455   2              }
 456   1      
 457   1              //Release the SCL line to enable I2C transfer
 458   1              I2C_SCL = 1;
 459   1      
 460   1              EX1 = 1;
 461   1              //end i2c transfer
 462   1              EA = 1; //Enable interrupt
 463   1      }
 464          
 465          void main(void)
 466          {
 467   1              InitUart();
 468   1              InitI2c();
 469   1      
 470   1              EA = 1;
 471   1      
 472   1              while(1)
 473   1              {
 474   2                      uchar c;
 475   2                      if(i2c_start)
 476   2                      {
 477   3                              ProcessI2cTransfer();
 478   3                      }
 479   2                      else if(UartGetChar(&c) > 0)
 480   2                      {
 481   3                              ProcessSerialEvent(c);
 482   3                      }
 483   2                      else if(i2c_buf_cnt > 0)
 484   2                      {
 485   3                              if(UartPutChar(i2c_buf[i2c_buf_pos]))
 486   3                              {
 487   4                                      i2c_buf_pos = (i2c_buf_pos + 1) % I2C_BUFFER_SIZE;
 488   4                                      i2c_buf_cnt--;
 489   4                              }
C51 COMPILER V8.02   MAIN                                                                  05/25/2007 19:23:10 PAGE 9   

 490   3                      }
 491   2                      else
 492   2                      {
 493   3                              //Enter idle mode to save power.
 494   3                              PCON |= 1;
 495   3                      }
 496   2              }
 497   1      }
 498          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    732    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7       9
   IDATA SIZE       =     80    ----
   BIT SIZE         =      2       7
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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