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

📄 i2c.lst

📁 c8051单片机程序包,keil C编写
💻 LST
📖 第 1 页 / 共 3 页
字号:
 215          char GetKeyValue(void);
 216          void WaitKeyOff(void);
 217          extern bit FlashFlag,Flag500ms;
 218          extern unsigned char C_1s;
 219          
 220          unsigned char Input(unsigned char x,unsigned char y,unsigned char ch,unsigned char Min,unsigned char Max)
 221          {
 222   1      char i,temp;
 223   1      unsigned char loc,Value;
 224   1              C_1s=30;
 225   1              loc=x;
 226   1              Value=ch%100;
 227   1              LCD_DispChar(x,y,ch/16);
 228   1              LCD_DispChar(x+1,y,ch%16);
 229   1              while (C_1s)
 230   1              {
 231   2                      i=GetKeyValue();
 232   2                      if (Flag500ms)
 233   2                      {
 234   3                              Flag500ms=0;
 235   3                              if (FlashFlag)
 236   3                              {
 237   4                                      if (loc==x)
 238   4                                      {
 239   5                                              LCD_DispChar(loc,y,Value/16);
 240   5                                      }
 241   4                                      else
C51 COMPILER V7.02b   I2C                                                                  12/21/2002 22:32:37 PAGE 5   

 242   4                                      {
 243   5                                              LCD_DispChar(loc,y,Value%16);
 244   5                                      }
 245   4                              }
 246   3                              else
 247   3                              {
 248   4                                      if (loc==x)
 249   4                                      {
 250   5                                              LCD_DispChar(loc,y,0xc);
 251   5                                      }
 252   4                                      else
 253   4                                      {
 254   5                                              LCD_DispChar(loc,y,0xc);
 255   5                                      }
 256   4                              }
 257   3                      }
 258   2                      if (i!=-1)
 259   2                      {
 260   3                              WaitKeyOff(); 
 261   3                              C_1s=30;  
 262   3                              if (i<=9)                       //按下的是数字键
 263   3                              {
 264   4                                      if (loc==x)
 265   4                                      {               
 266   5                                              temp=Value%16+i*16;
 267   5                                              if ((temp<=Max)&&(temp>=Min))   //输入十位有效
 268   5                                              {
 269   6                                                      LCD_DispChar(loc,y,i);loc+=8;
 270   6                                                      Value=temp;
 271   6                                              }
 272   5                                      }
 273   4                                      else
 274   4                                      {
 275   5                                              temp=(Value/16)*16+i;
 276   5                                              if ((temp<=Max)&&(temp>=Min))   //输入个位有效
 277   5                                              {
 278   6                                                      LCD_DispChar(loc,y,i);loc=x;
 279   6                                                      Value=temp;
 280   6                                              }
 281   5                                      }
 282   4                              }
 283   3                              if (i==0xf)             //按下"F"键
 284   3                              {
 285   4                                      LCD_DispChar(x,y,Value/16);
 286   4                                      LCD_DispChar(x+1,y,Value%16);
 287   4                                      return Value;
 288   4                              }
 289   3                              if (i==0xd)             //按下"D"键
 290   3                              {
 291   4                                      LCD_DispChar(x,y,ch/16);
 292   4                                      LCD_DispChar(x+1,y,ch%16);
 293   4                                      return ch;
 294   4                              }
 295   3                      }
 296   2              }
 297   1              LCD_DispChar(x,y,ch/16);
 298   1              LCD_DispChar(x+1,y,ch%16);
 299   1              return 0xff;
 300   1      }
 301          
 302          void SetTime(void)
 303          {
C51 COMPILER V7.02b   I2C                                                                  12/21/2002 22:32:37 PAGE 6   

 304   1      char KeyValue;
 305   1      char ch;
 306   1              for (;;)
 307   1              {
 308   2                      KeyValue=GetKeyValue();
 309   2                      switch (KeyValue)
 310   2                      {
 311   3                              case -1:
 312   3                                      break;
 313   3                              case 0xf: //"F"键设置时间
 314   3                                      ch=Input(0,2,RealTime.RT.Hour,0,0x23);
 315   3                                      if (ch!=0xff)
 316   3                                      {
 317   4                                              RealTime.RT.Hour=ch;
 318   4                                      }
 319   3                                      ch=Input(24,2,RealTime.RT.Minute,0,0x59);
 320   3                                      if (ch!=0xff)
 321   3                                      {
 322   4                                              RealTime.RT.Minute=ch;
 323   4                                      }
 324   3                                      ch=Input(48,2,RealTime.RT.Second,0,0x59);
 325   3                                      if (ch!=0xff)
 326   3                                      {
 327   4                                              RealTime.RT.Second=ch;
 328   4                                      }
 329   3      
 330   3                                      ch=Input(0,4,RealTime.RT.Year,0,0x20);
 331   3                                      if (ch!=0xff)
 332   3                                      {
 333   4                                              RealTime.RT.Year=ch;
 334   4                                      }
 335   3                                      ch=Input(24,4,RealTime.RT.Month,0x1,0x12);
 336   3                                      if (ch!=0xff)
 337   3                                      {
 338   4                                              RealTime.RT.Month=ch;
 339   4                                      }
 340   3                                      ch=Input(48,4,RealTime.RT.Day,0x1,0x31);
 341   3                                      if (ch!=0xff)
 342   3                                      {
 343   4                                              RealTime.RT.Day=ch;
 344   4                                      }
 345   3                                      SetRealClock();
 346   3                                      return;                         
 347   3                              case 0xd: //"D"键忽略设置
 348   3                                      return;                         
 349   3                              default:
 350   3                                      break;
 351   3                      }
 352   2                      WaitKeyOff();
 353   2              }
 354   1      }
 355          
 356          void TestI2C (void)
 357          {
 358   1      unsigned char var ;
 359   1      char KeyValue;
 360   1              WDTCN = 0xde;                                                                   // disable watchdog timer
 361   1              WDTCN = 0xad;
 362   1              
 363   1              OSCICN |= 0x03;                                                         // Set internal oscillator to highest setting
 364   1                                                                                                                      // (16 MHz)
 365   1      
C51 COMPILER V7.02b   I2C                                                                  12/21/2002 22:32:37 PAGE 7   

 366   1              XBR0 |= 0x07;                                                                   // Route SMBus to GPIO pins through crossbar
 367   1              XBR2 |= 0x44;                                                                   // Enable crossbar and weak pull-ups
 368   1      
 369   1          P0MDOUT |= 0x1D; 
 370   1          P1MDOUT |= 0x01; 
 371   1              
 372   1              SMB0CN = 0x44;                                                                  // Enable SMBus with ACKs on acknowledge cycle
 373   1              SMB0CR = -80;                                                                   // SMBus clock rate = 100kHz.
 374   1      
 375   1              EIE1 |= 2;                                                                              // SMBus interrupt enable
 376   1              EA = 1;                                                                                 // Global interrupt enable
 377   1      
 378   1              SM_BUSY = 0;                                                                    // Free SMBus for first transfer.
 379   1      
 380   1      //      SetRealClockINT1(0x8000);
 381   1              var = GetRealClockStatus();
 382   1              ResetRealClock();
 383   1              var = GetRealClockStatus();
 384   1              SetRealClockStatus(0xC2);  //24小时制
 385   1              var = GetRealClockStatus();
 386   1              GetRealClock();
 387   1      /*      RealTime.RT.Year=0x02;  
 388   1              RealTime.RT.Month=0x06; 
 389   1              RealTime.RT.Day=0x05;   
 390   1              RealTime.RT.Week=0x02;  
 391   1              RealTime.RT.Hour=0x11;  
 392   1              RealTime.RT.Minute=0x14;        
 393   1              RealTime.RT.Second=0x45;        
 394   1      */      SetRealClock();
 395   1              GetRealClock();
 396   1              InitLCD();
 397   1              LCD_WriteHZ(0,1,Shi); 
 398   1              LCD_WriteHZ(2,1,Zhong); 
 399   1      //在0,2处显示00:00:00
 400   1              LCD_DispChar(0,2,0); //128*64  取值x=0-128 y=0-8
 401   1              LCD_DispChar(8,2,0);
 402   1              LCD_DispChar(16,2,0xa);
 403   1              LCD_DispChar(24,2,0);
 404   1              LCD_DispChar(32,2,0);
 405   1              LCD_DispChar(40,2,0xa);
 406   1              LCD_DispChar(48,2,0);
 407   1              LCD_DispChar(56,2,0);
 408   1      //在0,4处显示02/01/01
 409   1              LCD_DispChar(0,4,0); //128*64  取值x=0-128 y=0-8
 410   1              LCD_DispChar(8,4,2);
 411   1              LCD_DispChar(16,4,0xb);
 412   1              LCD_DispChar(24,4,0);
 413   1              LCD_DispChar(32,4,1);
 414   1              LCD_DispChar(40,4,0xb);
 415   1              LCD_DispChar(48,4,0);
 416   1              LCD_DispChar(56,4,1);
 417   1              for (;;)
 418   1              {
 419   2                      KeyValue=GetKeyValue();
 420   2                      switch (KeyValue)
 421   2                      {
 422   3                              case -1:
 423   3                                      break;
 424   3                              case 0xf: //"F"键设置时间
 425   3                                      {
 426   4                                              LCD_WriteHZ(0,1,xiu); 
 427   4                                              LCD_WriteHZ(2,1,gai); 
C51 COMPILER V7.02b   I2C                                                                  12/21/2002 22:32:37 PAGE 8   

 428   4                                              LCD_WriteHZ(4,1,Shi); 
 429   4                                              LCD_WriteHZ(6,1,Zhong); 
 430   4                                              SetTime();
 431   4                                              LCD_WriteHZ(0,1,Shi); 
 432   4                                              LCD_WriteHZ(2,1,Zhong); 
 433   4                                              LCD_WriteHZ(4,1,Blank); 
 434   4                                              LCD_WriteHZ(6,1,Blank); 
 435   4                                      }

⌨️ 快捷键说明

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