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

📄 i2c.lst

📁 171544C8051F020应用程序包.rar
💻 LST
📖 第 1 页 / 共 3 页
字号:
 157                  BYTE_NUMBER = 2;                                                                        
 158                  COMMAND = (CLOCK3530_ADDRESS_INT1 | WRITE);             
 159                  I2CDataBuff = (unsigned char*)&Int1;                                                            
 160                  STA = 1;                                                                                        // Start transfer
 161          }
 162          */
 163          #include "INTRINS.H"
 164          
 165          unsigned char revolve(unsigned char val)
 166          {
 167   1      char i;
 168   1      unsigned char val1=0;
 169   1              for (i=0;i<8;i++)
 170   1              {
 171   2                      if (val&0x1)
 172   2                              val1++;
 173   2                      val1=_crol_(val1,1);
 174   2                      val=_cror_(val,1);
 175   2              }
 176   1              val1=_cror_(val1,1);
 177   1              return val1;
 178   1      }
 179          
C51 COMPILER V6.23a  I2C                                                                   12/20/2002 12:46:27 PAGE 4   

 180          /*--  文字:  时  --*/
 181          
 182          char code Shi[]=
 183          {
 184                  0x00,0x00,0xFC,0x44,0x44,0xFC,0x00,0x08,0x48,0x88,0x08,0xFF,0x08,0x08,0x08,0x00,
 185                  0x00,0x00,0x1F,0x04,0x04,0x0F,0x00,0x00,0x00,0x11,0x20,0x1F,0x00,0x00,0x00,0x00,
 186          };
 187          
 188          /*--  文字:  钟  --*/
 189          char code Zhong[]=
 190          {
 191                  0x00,0x60,0x38,0xE7,0x24,0x24,0x04,0x00,0xF8,0x88,0x88,0xFF,0x88,0x88,0xF8,0x00,
 192                  0x00,0x01,0x01,0x3F,0x11,0x09,0x01,0x00,0x01,0x00,0x00,0x3F,0x00,0x00,0x01,0x00,
 193          };
 194          
 195          
 196          void LCD_WriteHZ(char x,char y,char *Dot);
 197          void LCD_DispChar(char x,char y,char ch); //128*64  取值x=0-128 y=0-8
 198          void    InitLCD(void);
 199          void Delay1ms(unsigned char T);
 200          
 201          void TestI2C (void)
 202          {
 203   1      unsigned char var ;
 204   1              WDTCN = 0xde;                                                                   // disable watchdog timer
 205   1              WDTCN = 0xad;
 206   1              
 207   1              OSCICN |= 0x03;                                                         // Set internal oscillator to highest setting
 208   1                                                                                                                      // (16 MHz)
 209   1      
 210   1              XBR0 |= 0x07;                                                                   // Route SMBus to GPIO pins through crossbar
 211   1              XBR2 |= 0x44;                                                                   // Enable crossbar and weak pull-ups
 212   1      
 213   1          P0MDOUT |= 0x1D; 
 214   1          P1MDOUT |= 0x01; 
 215   1              
 216   1              SMB0CN = 0x44;                                                                  // Enable SMBus with ACKs on acknowledge cycle
 217   1              SMB0CR = -80;                                                                   // SMBus clock rate = 100kHz.
 218   1      
 219   1              EIE1 |= 2;                                                                              // SMBus interrupt enable
 220   1              EA = 1;                                                                                 // Global interrupt enable
 221   1      
 222   1              SM_BUSY = 0;                                                                    // Free SMBus for first transfer.
 223   1      
 224   1      //      SetRealClockINT1(0x8000);
 225   1              var = GetRealClockStatus();
 226   1              ResetRealClock();
 227   1              var = GetRealClockStatus();
 228   1              SetRealClockStatus(0xc2);
 229   1              var = GetRealClockStatus();
 230   1              GetRealClock();
 231   1              RealTime.RT.Year=0x02;  
 232   1              RealTime.RT.Month=0x12; 
 233   1              RealTime.RT.Day=0x010;  
 234   1              RealTime.RT.Week=0x05;  
 235   1              RealTime.RT.Hour=0x11;  
 236   1              RealTime.RT.Minute=0x59;        
 237   1              RealTime.RT.Second=0x57;        
 238   1              SetRealClock();
 239   1              GetRealClock();
 240   1              InitLCD();
 241   1              LCD_WriteHZ(0,0,Shi); 
C51 COMPILER V6.23a  I2C                                                                   12/20/2002 12:46:27 PAGE 5   

 242   1              LCD_WriteHZ(16,0,Zhong); 
 243   1      //在0,2处显示00:00:00
 244   1              LCD_DispChar(0,2,0); //128*64  取值x=0-128 y=0-8
 245   1              LCD_DispChar(8,2,0);
 246   1              LCD_DispChar(16,2,10);
 247   1              LCD_DispChar(24,2,0);
 248   1              LCD_DispChar(32,2,0);
 249   1              LCD_DispChar(40,2,0xa);
 250   1              LCD_DispChar(48,2,0);
 251   1              LCD_DispChar(56,2,0);
 252   1      //在0,4处显示02/01/01
 253   1              LCD_DispChar(0,4,0); //128*64  取值x=0-128 y=0-8
 254   1              LCD_DispChar(8,4,2);
 255   1              LCD_DispChar(16,4,0xb);
 256   1              LCD_DispChar(24,4,0);
 257   1              LCD_DispChar(32,4,1);
 258   1              LCD_DispChar(40,4,0xb);
 259   1              LCD_DispChar(48,4,0);
 260   1              LCD_DispChar(56,4,1);
 261   1              for (;;)
 262   1              {
 263   2                      GetRealClock();
 264   2                      
 265   2                      LCD_DispChar(0,2,(RealTime.RT.Hour>>4)&0x03);//(RealTime.RT.Hour>>4)&0x0f); //128*64  取值x=0-128 y=0-8
 266   2                      LCD_DispChar(8,2,RealTime.RT.Hour&0x0f);
 267   2                      LCD_DispChar(24,2,(RealTime.RT.Minute>>4)&0x0f);
 268   2                      LCD_DispChar(32,2,RealTime.RT.Minute&0x0f);
 269   2                      LCD_DispChar(48,2,(RealTime.RT.Second>>4)&0x0f);
 270   2                      LCD_DispChar(56,2,RealTime.RT.Second&0x0f);
 271   2                      //在0,4处显示02/01/01
 272   2                      LCD_DispChar(0,4,(RealTime.RT.Year>>4)&0x0f); 
 273   2                      LCD_DispChar(8,4,RealTime.RT.Year&0x0f);
 274   2                      LCD_DispChar(24,4,(RealTime.RT.Month>>4)&0x0f);
 275   2                      LCD_DispChar(32,4,RealTime.RT.Month&0x0f);
 276   2                      LCD_DispChar(48,4,(RealTime.RT.Day>>4)&0x0f);
 277   2                      LCD_DispChar(56,4,RealTime.RT.Day&0x0f);
 278   2                      Delay1ms(100);  
 279   2              }
 280   1      }
 281          
 282          
 283          //------------------------------------------------------------------------------------
 284          // Interrupt Service Routine
 285          //------------------------------------------------------------------------------------
 286          void SMBUS_ISR (void) interrupt 7
 287          {
 288   1              switch (SMB0STA)
 289   1                      {       // SMBus 状态码SMB0STA 寄存器
 290   2                              // 主发送器/接收器起始条件已发送
 291   2                      case SMB_START:
 292   2                              SMB0DAT = COMMAND ; // 装入要访问的从器件的地址
 293   2                              STA = 0;                        // 手动清除START 位
 294   2                              break;
 295   2                              //主发送器/接收器重复起始条件已发送
 296   2                              // 该状态只应在读操作期间出现在存储器地址已发送并得到确认之后 ?
 297   2                      case SMB_RP_START:
 298   2                              SMB0DAT = COMMAND; // COMMAND 中应保持从地址 + R.
 299   2                              STA = 0;
 300   2                              break;
 301   2                              // 主发送器从地址 + WRITE 已发送收到ACK
 302   2                      case SMB_MTADDACK:
 303   2                              // 主发送器数据字节已发送收到ACK
C51 COMPILER V6.23a  I2C                                                                   12/20/2002 12:46:27 PAGE 6   

 304   2                      case SMB_MTDBACK:
 305   2                              if (BYTE_NUMBER)
 306   2                              {
 307   3                                              SMB0DAT = revolve(*I2CDataBuff);                                        // If R/W=WRITE, load byte to write.
 308   3                                              I2CDataBuff++;
 309   3                                              BYTE_NUMBER--;                  
 310   3                              }
 311   2                              else
 312   2                              {
 313   3                                      STO = 1;        SM_BUSY = 0;                                            // Free SMBus
 314   3                              }
 315   2                              break;
 316   2                              // 主发送器从地址 + WRITE 已发送收到NACK
 317   2                              // 从器件不应答发送STOP + START 重试
 318   2                      case SMB_MTADDNACK:
 319   2                              STO = 1;                        STA = 1;

⌨️ 快捷键说明

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