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

📄 main.lst

📁 基于AT89S52控制芯片的电子万年历程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 214   2          case 7:str2[MONTHS]='J';str2[MONTHS+1]='U';str2[MONTHS+2]='L';break;
 215   2          case 8:str2[MONTHS]='A';str2[MONTHS+1]='U';str2[MONTHS+2]='G';break;
 216   2          case 9:str2[MONTHS]='S';str2[MONTHS+1]='E';str2[MONTHS+2]='P';break;
 217   2          case 10:str2[MONTHS]='O';str2[MONTHS+1]='C';str2[MONTHS+2]='T';break;
 218   2          case 11:str2[MONTHS]='N';str2[MONTHS+1]='O';str2[MONTHS+2]='V';break;
 219   2          case 12:str2[MONTHS]='D';str2[MONTHS+1]='E';str2[MONTHS+2]='C';break;
 220   2          
 221   2          }
 222   1      }
 223          
 224          void Delay(uint n)
 225          {
 226   1          uint i;
 227   1          for(i=0;i<n;i++);
 228   1      }
 229          
 230          void TxData(uchar dat)
 231          {
 232   1          SBUF = dat;
 233   1          while(TI!=1);
 234   1          TI = 0;
 235   1      }
 236          
 237          void Timer0Int() interrupt 1 using 2
 238          {
 239   1          if(Int0Flag==1) /*如果需要产生音乐频率则按音频改变TIMER0得中断周期*/
 240   1              {
C51 COMPILER V7.50   MAIN                                                                  03/19/2009 16:09:25 PAGE 5   

 241   2              P3^3 = ~P3^3; /*每个TIMER0中断翻转一下P3.3的电平以产生相应频率的方波*/
*** ERROR C141 IN LINE 241 OF MAIN.C: syntax error near '='
 242   2              TH0 = TH0Temp;
 243   2              TL0 = TL0Temp;
 244   2          }
 245   1      }
 246          
 247          void Timer1Int() interrupt 3 using 3 /*TIMER1中断服务程序,中断周期为10MS*/
 248           {
 249   1          uchar ucharTemp,ucharTemp1;
 250   1          static uchar s_paiCounter,s_paiNum;
 251   1          uint temp;
 252   1          static uint counter = 0;
 253   1          
 254   1          if(++counter>=10){                   /*如果100ms到则这只100ms标志位*/
 255   2              flg_100ms = 1;
 256   2              counter = 0;
 257   2          }
 258   1          temp = 65536-SCAN_CYCLE;              /*中断周期为10ms*/
 259   1          TH1 = temp>>8;                         /*temp/256相当于右移8位*/
 260   1          TL1 = temp-((temp>>8)<<8);             /*temp%256*/
 261   1          
 262   1          if(musicplayflg==1){                      /*如果需要播放音乐*/
 263   2          if(++s_paiCounter>=s_paiNum)          /**音乐一拍的时间*/
 264   2          {
 265   3              s_paiCounter = 0;                    
 266   3              ucharTemp = c_music[s_tableCounter++];
 267   3                  if(ucharTemp==0x00)           /*如果差到0x00则标识本首歌曲结束*/
 268   3                  {
 269   4                      Int0Flag = 0;             /*产生音乐平率标志置零*/
 270   4                      s_paiNum = 4*PAI_BASE;  /*歌曲结束后停止播放*/
 271   4                      P3^3 = 1;                /*把喇叭关掉*/
*** ERROR C141 IN LINE 271 OF MAIN.C: syntax error near '='
 272   4                      s_tableCounter = 0;
 273   4                      musicplayflg = 0;
 274   4                      TR0 = 0;
 275   4                  }
 276   3                  else                               /*如果查到非0X00则标识是音乐标识码*/
 277   3                  {
 278   4                      s_paiNum = (ucharTemp&0x0f)*PAI_BASE; /*音乐包是吗的低四位为节拍码*/
 279   4                      ucharTemp1 = (ucharTemp&0xf0)>>4;
 280   4                      if(ucharTemp1 == 0)                   /*如果音频码为零则标识不发音*/
 281   4                      {
 282   5                          Int0Flag = 0;
 283   5                      }
 284   4                  else      /*如果音频码不为零则按此改变TIMER0得中断周期*/
 285   4                  {
 286   5                  Int0Flag = 0;
 287   5                  temp = c_musicFreq[ucharTemp1-1];
 288   5                      TH0 = temp>>8;                   /*temp/256相当于右移8位*/
 289   5                      TL0 = temp-((temp>>8)<<8);       /*temp%256*/
 290   5                      TH0Temp = TH0;                   /*保存新的代表音频得TIMER0周期值*/
 291   5                      TL0Temp = TL0;
 292   5                      Int0Flag = 1;
 293   5                  }
 294   4                }
 295   3            }
 296   2          }
 297   1      }
 298          
 299          void ScanKeys(void)                             /*扫描键盘模块*/
 300          {
C51 COMPILER V7.50   MAIN                                                                  03/19/2009 16:09:25 PAGE 6   

 301   1          uchar scanValue = 0xef,iScan,scanTempUchar;
 302   1          for(iScan = 0;iScan<4;iScan++)
 303   1            {
 304   2                P1 = scanValue;                         /*发扫描值*/
 305   2                scanTempUchar = P1;                     /*读入扫描值*/
 306   2                if((scanTempUchar&0X01) == 0X00)        /*第一列被按*/
 307   2                {
 308   3                    keyFlag|=(0x0001<<(iScan*4+0));     /*设置此键的标志位*/
 309   3                }
 310   2                else
 311   2                {
 312   3                    keyFlag&=~(0x0001<<(iScan*4+0));    /*清此键的标志位*/
 313   3                }
 314   2                if((scanTempUchar&0x02) == 0x00)        /*第二列被按*/
 315   2                {
 316   3                    keyFlag|=(0x0001<<(iScan*4+1));       /*置此键的标志位*/
 317   3                }
 318   2                else
 319   2                {
 320   3                    keyFlag&=~(0x0001<<(iScan*4+1));      /*清此键的标志位*/
 321   3                }
 322   2                if((scanTempUchar&0x04) == 0x00)          /*第三列被按*/
 323   2                {
 324   3                    keyFlag|=0x0001<<(iScan*4+2);         /*置此键的标志位*/
 325   3                }
 326   2                else
 327   2                {
 328   3                    keyFlag&=~(0x0001<<(iScan*4+2));      /*清此键的标志位*/
 329   3                }
 330   2                if((scanTempUchar&0x08) == 0x00)          /*第四列被按*/
 331   2                {
 332   3                    keyFlag|=0x0001<<(iScan*4+3);         /*置此键的标志位*/
 333   3                }
 334   2                else
 335   2                {
 336   3                    keyFlag&=~(0x0001<<(iScan*4+3));      /*清此键标志位*/
 337   3                }
 338   2                scanValue = scanValue<<1|0x01;             /*置下次扫描值*/
 339   2            }
 340   1      }
 341          
 342          uchar KeyJudge(void)                                /*按键预处理*/
 343          {
 344   1            uchar j,counterKeyPressedNum;
 345   1            uchar keyRet = 0x55;                            /*初始按键返回码设定为无按码0x55*/
 346   1            uint uintTemp;
 347   1            
 348   1            ScanKeys();                                       /*扫描键盘*/
 349   1            if(keyFlag!=0)
 350   1            {
 351   2                Delay(1000);                                /*掩饰10ms以消除抖动*/
 352   2                ScanKeys();
 353   2                P1 = 0x0f;
 354   2                while((P1&0x0f)!=0x0f);                     /*没松开按键就等按键松开*/
 355   2                counterKeyPressedNum = 0;
 356   2                for(j=0;j<16;j++)
 357   2                {
 358   3                    uintTemp = ((uint)0x0001)<<j;
 359   3                    if((keyFlag&uintTemp)==uintTemp)     
 360   3                                                /*依次检测键盘扫描标志KeyFlag,如某位置一则按键个数寄存器加1*/
 361   3                    {
 362   4                              counterKeyPressedNum++;
C51 COMPILER V7.50   MAIN                                                                  03/19/2009 16:09:25 PAGE 7   

 363   4                                    keyRet = j;
 364   4                    }
 365   3                }
 366   2                if(counterKeyPressedNum>1)   /*如果不止一个键被按则丢弃此状态返回无码0x55*/
 367   2                {
 368   3                        return 0x55;
 369   3                }
 370   2                else                                    /*某键被按,返回此键的标识码*/
 371   2                {
 372   3                        return(keyRet);
 373   3                }
 374   2            }
 375   1            return(0x55);                               /*无键被按则返回无按码*/
 376   1      }
 377          
 378          void KeyHandle(uchar keyIndex)                       /*按键处理模块*/
 379          {
 380   1           static uchar cnt = 0;
 381   1           switch(keyIndex)
 382   1           {
 383   2              case 0x00:                                   /*按1键*/     
 384   2                showitem = SHOW_TIME;                   /*标识当前显示时间*/
 385   2                str1[0]='T';str1[1]='I';str1[2]='M';str1[3]='E';
 386   2                cnt = 0;
 387   2                current = CUR_MINUTE;
 388   2                if((cs.cs2 & 0x08) == 0x08){    /*如果闹钟标志位置位(设定闹钟过程中可能会设置)*/
 389   3                    cs.cs2 &= 0xf7;                      /*清闹钟标志位*/
 390   3                    PCF8563_SetCS(cs);                  /*写8563控制/状态字*/
 391   3                    }
 392   2                break;
 393   2              case 0x01:                                  /*按2键*/
 394   2                  showitem = SHOW_ALARM;           /*标识当前显示闹钟*/
 395   2                  str1[0]='A';str1[1]='L';str1[2]='R';str1[3]='M';
 396   2                  cnt = 0;
 397   2                  current = CUR_MINUTE;
 398   2                  break;
 399   2              case 0x02:                                /*按3见*/
 400   2                   if(showitem == SHOW_TIME){             /*如果显示时间*/
 401   3                        switch(cnt){                           /*设定项目更改*/
 402   4                        case 0:current = CUR_MINUTE;break;
 403   4                        case 1:current = CUR_HOUR;break;
 404   4                        case 2:current = CUR_DAY;break;
 405   4                        case 3:current = CUR_WEEKDAY;break;
 406   4                        case 4:current = CUR_MONTH;break;
 407   4                        case 5:current = CUR_YEAR;break;  
 408   4                        case 6:current = CUR_SECOND;break;               
 409   4                        }
 410   3                        if(++cnt>6){                              /*轮回*/
 411   4                              cnt = 0;
 412   4                        }
 413   3                  }else if(showitem == SHOW_ALARM){               /*如果显示闹钟*/
 414   3                        switch(cnt){
 415   4                        case 0:current = CUR_MINUTE;break;
 416   4                        case 1:current = CUR_HOUR;break;
 417   4                        }
 418   3                        if(++cnt>1){                              /*轮回*/
 419   4                            cnt = 0;
 420   4                        }
 421   3                     }
 422   2                   break;
 423   2              case 0x03:                                          /*INC*/
 424   2                    if(showitem == SHOW_TIME){                  /*如果显示时间*/
C51 COMPILER V7.50   MAIN                                                                  03/19/2009 16:09:25 PAGE 8   

 425   3                        PCF8563_ReadTime(&tm);                    /*读时间*/
 426   3                        set_min = (tm.minutes>>4)*10+(tm.minutes&0x0f);    /*BCD到HEX*/
 427   3                        set_hour = (tm.hours>>4)*10+(tm.hours&0x0f);
 428   3                        set_day = (tm.days>>4)*10+(tm.days&0x0f);
 429   3                        set_weekday = tm.weekdays;
 430   3                        set_month = (tm.mon_cen>>4)*10+(tm.mon_cen&0x0f);
 431   3                        set_year = (tm.years>>4)*10+(tm.years&0x0f);
 432   3                        set_second = (tm.seconds>>4)*10+(tm.seconds&0x0f);

⌨️ 快捷键说明

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