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

📄 5045.lst

📁 单片及c语言轻松入门的随书光盘
💻 LST
📖 第 1 页 / 共 2 页
字号:
 219          {       uchar tmp;
 220   1              Sck=0;
 221   1              CS=0;
 222   1              tmp=READ_INST;
 223   1              if(Address>255)
 224   1                      tmp|=0x08;
 225   1              OutByte(tmp);
 226   1              tmp=(uchar)(Address&0x00ff);
 227   1              OutByte(Address);
 228   1              tmp=InByte();
 229   1              Sck=0;
 230   1              CS=1;
 231   1              return (tmp);
 232   1      }
 233          /*******************************************************************************************
 234          ;名称:RstWatchDog
 235          ;描述:复位看门狗定时器
 236          ;功能:这段程序用来复位看门狗定时器,不发送命令
 237          *******************************************************************************************/
 238          void RstWatchDog()
 239          {   CS=0;
 240   1          nop2();
C51 COMPILER V7.06   5045                                                                  02/28/2006 10:27:15 PAGE 5   

 241   1          CS=1;
 242   1      }
 243          /*******************************************************************************************
 244          ;名称:WriteString
 245          ;描述:字符中写入
 246          ;功能:向X5045指定单元开始写入一串数据
 247          ;参数:*s 指向待写数据 Adress 指定待写eeprom地址 Len 待写入字节长度 
 248          ;说明:不能跨页写
 249          *******************************************************************************************/
 250          void WriteString(uchar *s,uint Adress,uchar Len)
 251          {       uchar i=0;
 252   1              WP=1;
 253   1              WrenCmd();              //写允许
 254   1              WrsrCmd(NoPro); //打开写保护块
 255   1              for(i=0;i<Len;i++)
 256   1                      ByteWrite(Adress+i,*(s+i));
 257   1              WP=0;
 258   1      }
 259          /*******************************************************************************************
 260          ;名称:ReadString
 261          ;描述:字符中读出
 262          ;功能:从X5045指定单元读出一串数据,写入s指定的开始地址
 263          ;参数:*s 指向待存数据区 Adress 指定待读eeprom地址 Len 待读入字节长度 
 264          ;说明:不能跨页写
 265          *******************************************************************************************/
 266          
 267          void ReadString(uchar *s,uint Adress,uchar Len)
 268          {
 269   1              uchar i=0;
 270   1              for(i=0;i<Len;i++)
 271   1                      *(s+i)=ByteRead(Adress+i);
 272   1      }
 273          
 274          /*延时程序
 275            由Delay参数确定延迟时间
 276          */
 277          void mDelay(unsigned int Delay) 
 278          {       unsigned int i;
 279   1              for(;Delay>0;Delay--)
 280   1              {       for(i=0;i<124;i++)
 281   2                      {;}
 282   2              }
 283   1      }    
 284          
 285          //以下是中断程序,实现显示及键盘处理
 286          void Timer0() interrupt 1
 287          {       uchar tmp;
 288   1              static uchar    dCount; //计数器,显示程序通过它得知现正显示哪个数码管
 289   1              static uchar    KCount; //用于键盘的计数器,控制去键抖延时,首次按下延时,连续按下时的延时
 290   1              static  bit             KMark;  //有键被按下
 291   1              static  bit     KFunc1; //用于S3键
 292   1              TH0=TH0Val;
 293   1              TL0=TL0Val;     
 294   1              tmp=BitTab[dCount];             //根据当前的计数值取位值
 295   1              P2=P2|0xfc;                             //P2与11111100B相或,将高6位置1
 296   1              P2=P2&tmp;                              //P2与取出的位值相与,将某一位清零
 297   1              tmp=DispBuf[dCount];    //根据当前的计数值取显示缓冲待显示值    
 298   1              tmp=DispTab[tmp];               //取字形码
 299   1              P0=tmp;                                 //送出字形码
 300   1              dCount++;                               //计数值加1
 301   1              if(dCount==6)                   //如果计数值等于6,则让其回0
 302   1                      dCount=0;       
C51 COMPILER V7.06   5045                                                                  02/28/2006 10:27:15 PAGE 6   

 303   1      
 304   1              P3|=0x3c;                               //按按键的各位置1
 305   1              tmp=P3;
 306   1              tmp|=0xc3;                              //未接键的各位置1
 307   1              tmp=~tmp;                               //取反各位
 308   1              if(!tmp)                                //如果结果是0表示无键被按下
 309   1              {       KMark=0;                        
 310   2                      KFirst=0;
 311   2                      KCount=0;
 312   2                      KFunc1=0;
 313   2                      return;                                 
 314   2              }
 315   1              if(!KMark)                              //如果键按下标志无效
 316   1              {       KCount=4;                       //去键抖
 317   2                      KMark=1;                
 318   2                      return;
 319   2              }
 320   1              KCount--;
 321   1              if(KCount!=0)                   //如果不等于0
 322   1                      return;
 323   1              if((tmp&0xfb)==0)               //P3.2被按下
 324   1              {       if(KFunc)                       //要求计数值操作
 325   2                              NumCount++;
 326   2                      else
 327   2                              AddrCount++;
 328   2              }
 329   1              else if((tmp&0xf7)==0)  //P3.3被按下
 330   1              {       if(KFunc)                       //要求计数值操作
 331   2                              NumCount--;
 332   2                      else
 333   2                              AddrCount--;
 334   2              }
 335   1              else if((tmp&0xef)==0)  //P3.4被按下
 336   1              {       if(!KFunc1)                     //该位为0才进行切换,防止长时间按着反复切换
 337   2                      {       KFunc=!KFunc;           //切换状态
 338   3                              KFunc1=1;
 339   3                      }
 340   2              }
 341   1              else if((tmp&0xdf)==0)
 342   1              {       KEnter=1;
 343   2              }
 344   1              else                                    //无键按下(出错处理)
 345   1              {       KMark=0;                        
 346   2                      KFirst=0;
 347   2                      KCount=0;
 348   2                      KFunc1=0;
 349   2              }
 350   1              if(KFirst)                              //不是第一次被按下(连加)
 351   1              {       KCount=20;
 352   2              }
 353   1              else                                    //第一次被按下(间隔较长)
 354   1              {       KCount=200;
 355   2                      KFirst=1;
 356   2              }
 357   1      }       
 358          
 359          void Init()
 360          {       TMOD=0x01;
 361   1              TH0=TH0Val;
 362   1              TL0=TL0Val;     
 363   1              ET0=1;                          //开T0中断
 364   1              EA=1;                           //开总中断
C51 COMPILER V7.06   5045                                                                  02/28/2006 10:27:15 PAGE 7   

 365   1              TR0=1;                          //T0开始运行
 366   1      }
 367          
 368          void Calc(uchar Dat1,uchar Dat2)        //第一个参数放在第1、2位,第二个参数放入第5、6位
 369          {       DispBuf[0]=Dat1/16;
 370   1              DispBuf[1]=Dat1%16;
 371   1      
 372   1              DispBuf[4]=Dat2/16;
 373   1              DispBuf[5]=Dat2%16;
 374   1      }
 375          
 376          void main()
 377          {
 378   1      
 379   1              uchar   Mtd[5];         //待写数据存入该数组
 380   1              uchar   Mrd[5];         //读出的数据存入该数组
 381   1      
 382   1              Init();
 383   1      
 384   1              WrsrCmd(NoWdt);         //关闭看门狗
 385   1              WrsrCmd(NoPro);         //不保护
 386   1              
 387   1              DispBuf[2]=Hidden;
 388   1              DispBuf[3]=Hidden;
 389   1              DispBuf[4]=Hidden;
 390   1              DispBuf[5]=Hidden;
 391   1      
 392   1              D1Led=0;                        //点亮"读"控制灯
 393   1              CS=1;
 394   1              SO=1;
 395   1              Sck=0;
 396   1              SI=0;
 397   1              RstWatchDog();          //复位看门狗
 398   1              for(;;)
 399   1              {       
 400   2                      Calc(AddrCount,NumCount);
 401   2                      if(KFunc)                               
 402   2                      {       D2Led=0;                        //点亮"读"灯
 403   3                              D1Led=1;                        //关断"写"灯
 404   3                      }
 405   2                      else
 406   2                      {       D1Led=0;                        //点亮"写"灯
 407   3                              D2Led=1;                        //关掉"读"灯
 408   3                      }
 409   2                      if(KEnter)                              //按下了回车键
 410   2                      {       if(KFunc)                       //写数据
 411   3                              {       Mtd[0]=NumCount;//当前的计数值作为待写入的值
 412   4                                      WP=1;
 413   4                                      D8Led=0;                //点亮指示灯
 414   4                                      WriteString(Mtd,AddrCount,1);   //从Mtd开始的单元中取出1字节数据写入
 415   4                                      WP=0;
 416   4                              }
 417   3                              else                            //读数据
 418   3                              {       D8Led=0;                //点亮指示灯
 419   4                                      ReadString(Mrd,AddrCount,1);//读出1字节数据,存入Mrd开始的单元中
 420   4                                      NumCount=Mrd[0];
 421   4                              }
 422   3                              KEnter=0;                       //清回车键被按下的标志
 423   3                              mDelay(100);            //延时一段时间(为看清D8亮过)
 424   3                              D8Led=1;                
 425   3                      }
 426   2              }       
C51 COMPILER V7.06   5045                                                                  02/28/2006 10:27:15 PAGE 8   

 427   1      }
 428          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    743    ----
   CONSTANT SIZE    =     25    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     10      23
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      5    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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