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

📄 display.lst

📁 用keil便宜代码超过64k的程序例子
💻 LST
📖 第 1 页 / 共 3 页
字号:
 209   1          _Nop();
 210   1          _Nop();  
 211   1       SCL=0;                /*清时钟线,钳住I2C总线以便继续接收*/
 212   1          _Nop();
 213   1          _Nop();    
 214   1      TOGGLE_WD();
 215   1      }
 216          
 217          /*******************************************************************
 218                              向932发送多字节数据子函数               
 219          函数原型: bit  SendStr(uchar sla,uchar *s);  
 220          功能:     从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
 221          返回:    如果返回1表示操作成功,否则操作有误。
 222          参数说明:sla为932器件写地址54H;*s为发送数据缓冲区指针,其指向的首地址
 223                            存放的是数据长度=长度+类型码+数据+校验;  
 224          ********************************************************************/
 225          bit display(uchar *s)
 226          {
 227   1              uchar i;
 228   1              uchar sum;
 229   1              uchar j;
 230   1              uchar len;
 231   1              uchar   *pt;
 232   1              uchar   k;
 233   1              startwait(10);  /*80ms*/
 234   1              pt=s;   /*保存数据的原始指针*/
 235   1              for(j=0;j<5;i++)
 236   1              {
 237   2                      s=pt;   /*取指针*/
 238   2                      sum=0;
 239   2                      EX1=0;
 240   2                      I2C_BUSY=0;
CX51 COMPILER V7.20   DISPLAY                                                              08/15/2005 15:35:54 PAGE 5   

 241   2              _Nop();
 242   2              _Nop();
 243   2              _Nop();
 244   2              _Nop();
 245   2                      I2C_BUSY=1;
 246   2                      IE1=0;
 247   2                      EX1=1;
 248   2                      TR0=1;  /*启动定时器*/
 249   2      //              maxtr=0;        /*整个帧传送时间20ms*/
 250   2                  Start_I2c();               /*启动总线*/
 251   2                  if(SendByte(WRITE932)!=OK) goto next;  /*发送932器件地址,无应答返回失败标志*/
 252   2                      len=*s;
 253   2                      
 254   2                      for(i=0;i<len;i++)
 255   2                      {
 256   3                              if(SendByte(*s)!=OK) goto next;  /*发送数据*/   
 257   3                              sum+=*s;        
 258   3                              s++;
 259   3                              for(k=0;k<2;k++)                 
 260   3                              {}
 261   3                      }
 262   2                      *s=~sum;        /*test*/
 263   2                      if(SendByte(*s)!=OK) goto next;   /*发送取反的校验和*/
 264   2                      for(k=0;k<6;k++)                 
 265   2                      {;;}
 266   2                      if(SendByte(*s)!=OK) goto next;   /*发送取反的校验和*/
 267   2                      for(k=0;k<6;k++)                 
 268   2                      {;;}
 269   2                      Stop_I2c();    /*结束总线*/ 
 270   2                      return(OK);     /*返回成功*/
 271   2                      
 272   2                next:Stop_I2c();    /*结束总线*/                      
 273   2                if(T0IR)return(NOK);
 274   2              }
 275   1              //alarm=1;      /*置报警位表发送失败*/
 276   1              return(NOK);    /*返回失败*/
 277   1      }
 278          /*******************************************************************
 279                              读取932数据函数               
 280          函数原型: bit  RcvStr(uchar sla,ucahr *s);  
 281          功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
 282                    地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
 283                     如果返回1表示操作成功,否则操作有误。
 284          注意:    使用前必须已结束总线。
 285          ********************************************************************/
 286          bit keyboard(uchar *s)
 287          {
 288   1              uchar i;
 289   1              uchar sum;
 290   1              uchar j;
 291   1              uchar len;      /*保存长度字节*/
 292   1              uchar *pp;
 293   1              uchar   k;
 294   1      //uint  tagesave;       
 295   1              startwait(5);/*80ms*/
 296   1              pp=s;   /*保存数据的原始指针*/
 297   1              TR0=1;
 298   1      //      maxtr=0;
 299   1              for(j=0;j<5;j++)//07-22-03
 300   1              {
 301   2              s=pp;   /*取指针*/
 302   2              sum=0;
CX51 COMPILER V7.20   DISPLAY                                                              08/15/2005 15:35:54 PAGE 6   

 303   2              
 304   2      //      maxtr=0;        /*整个帧传送时间20ms*/
 305   2              Start_I2c();               /*启动总线*/
 306   2      
 307   2              if(SendByte(READ932)!=OK) goto out;  /*发送932器件地址,无应答返回失败标志*/
 308   2      
 309   2              *s=RcvByte();    /*接收长度字节*/
 310   2              len=*s;
 311   2              //len=s[0];
 312   2              if(len > 129) goto out ;  /*接收到的数据长度不会超过80个字节*/
 313   2              sum+= len;      /*长度也进行累加*/
 314   2              s++;
 315   2              Ack_I2c(0);    //test /*发送应答位*/  
 316   2      
 317   2                  for(i=1;i<=len-1;i++)
 318   2              {   
 319   3                      *s=RcvByte();      /*接收数据*/
 320   3                      sum+= *s;
 321   3                      s++;
 322   3                      Ack_I2c(0);     /*发送应答位*/  
 323   3        
 324   3              } 
 325   2              *s=RcvByte();  //07-22-03    /*接收校验和,最后字节*/
 326   2              sum+=*s;
 327   2              s++;
 328   2              *s=sum;
 329   2              if(sum==0xFF && !T0IR) //07-22-03       /*接收正确且在规定时间内*/
 330   2                      {
 331   3                              Ack_I2c(1);   /*发送非应位*/
 332   3                              for(k=0;k<2;k++)                 
 333   3                              {}
 334   3                              Stop_I2c();   /*结束总线*/ 
 335   3                              alar(KEYALARM1,KEYALARM2);
 336   3                              //alar(1);
 337   3                              return(OK);
 338   3                      }
 339   2              out:Ack_I2c(0);   /*发送应位,重发5次*/
 340   2                  for(k=0;k<2;k++)             
 341   2                              {}
 342   2                  Stop_I2c();         
 343   2               if(T0IR)return(NOK);/*超时*/
 344   2       
 345   2              }
 346   1                      
 347   1                      //alarmrcv=1;
 348   1                       return(NOK);
 349   1      }
 350          
 351          recept(uchar *s)
 352          {
 353   1              uchar i;
 354   1              uchar sum;
 355   1              uchar j;
 356   1              //uchar len;    /*保存长度字节*/
 357   1              uchar *pp;
 358   1              uchar   k;
 359   1      //uint  tagesave;       
 360   1              startwait(5);/*80ms*/
 361   1              pp=s;   /*保存数据的原始指针*/
 362   1              TR0=1;
 363   1      //      maxtr=0;
 364   1              for(j=0;j<5;j++)//07-22-03
CX51 COMPILER V7.20   DISPLAY                                                              08/15/2005 15:35:54 PAGE 7   

 365   1              {
 366   2              s=pp;   /*取指针*/
 367   2              sum=0;
 368   2              
 369   2      //      maxtr=0;        /*整个帧传送时间20ms*/
 370   2              Start_I2c();               /*启动总线*/
 371   2      
 372   2              if(SendByte(READ932)!=OK) goto out;  /*发送932器件地址,无应答返回失败标志*/
 373   2              
 374   2      
 375   2                  for(i=0;i<4;i++)
 376   2              {   
 377   3                      *s=RcvByte();      /*接收数据*/
 378   3                      sum+= *s;
 379   3                      s++;
 380   3                      Ack_I2c(0);     /*发送应答位*/  
 381   3        
 382   3              } 
 383   2              *s=RcvByte();  //07-22-03    /*接收校验和,最后字节*/
 384   2              sum+=*s;
 385   2              s++;
 386   2              *s=sum;
 387   2              if(sum==0xFF && !T0IR) //07-22-03       /*接收正确且在规定时间内*/
 388   2                      {
 389   3                              Ack_I2c(1);   /*发送非应位*/
 390   3                              for(k=0;k<2;k++)                 
 391   3                              {}
 392   3                              Stop_I2c();   /*结束总线*/ 
 393   3                              
 394   3                              //alar(1);
 395   3                              return(OK);
 396   3                      }
 397   2              out:Ack_I2c(0);   /*发送应位,重发5次*/
 398   2                  for(k=0;k<5;k++)             
 399   2                              {}
 400   2                  Stop_I2c();         
 401   2               if(T0IR)return(NOK);/*超时*/
 402   2       
 403   2              }
 404   1                      
 405   1                      //alarmrcv=1;
 406   1                       return(NOK);
 407   1      }
 408          
 409          
 410          /*******************************************************************
 411                           字节数据传送函数               
 412          函数原型: void  SendByte(uchar c);2464使用
 413          功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
 414               此状态位进行操作.(不应答或非应答都使ack=0 假)     
 415               发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
 416          ********************************************************************/
 417          bit  SendByte2464(uchar c)
 418          {
 419   1      bit sendack;
 420   1       uchar BitCnt;
 421   1              TOGGLE_WD(); 
 422   1       for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
 423   1          {
 424   2           if((c<<BitCnt)&0x80)SDA=1;   /*判断发送位*/
 425   2             else  SDA=0;                
 426   2           _Nop();

⌨️ 快捷键说明

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