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

📄 tuner.lst

📁 一个带收音的功放程序, VFD显示驱动用一个非常实用的方法, 稍加修改即可换成不同的VFD, 功放芯片用M61538
💻 LST
📖 第 1 页 / 共 3 页
字号:
 510   1              RadioFreq(Current_Freq);
 511   1              RadioOpen();    
 512   1              TO_MAIN_DISPLAY = 0;
 513   1              Channel_Display = 100;//这个值用来显示台号后再显示频率的时间差
 514   1      }
 515          
 516          
 517          //执行上一曲频率
 518          void Proc_Tuner_PREV_KEY(void)
 519          {
 520   1      
 521   1              Manual_Scan_Enable = Manual_Scan_End;
 522   1              Auto_Scan_Enable = Auto_Scan_Stop;
 523   1      
 524   1              if(FM_AM_Select == FM_MODE)
 525   1              {
 526   2                      if(Scan_Channel == 0)
 527   2                              Scan_Channel = FM_MAX_Channel - 1;
 528   2                      else
 529   2                              Scan_Channel--;
 530   2              }
 531   1              else
 532   1              {
 533   2                      
 534   2                      if(Scan_Channel == 0)
 535   2                              Scan_Channel = AM_MAX_Channel - 1;
 536   2                      else
 537   2                              Scan_Channel--;
 538   2              }
 539   1              
 540   1              if(FM_AM_Select == FM_MODE)
 541   1              {
 542   2                      DeltFMFreq = I2C_GetByte(A24C02, (FM_Start + (Scan_Channel * 2) + 1));
 543   2                      DeltFMFreq <<= 8;
 544   2                      DeltFMFreq +=  I2C_GetByte(A24C02, (FM_Start + (Scan_Channel * 2)) );
 545   2                      if(DeltFMFreq > FMFREQMAX)
 546   2                              DeltFMFreq = 0;
 547   2                      Current_Freq = FMFREQMIN+ DeltFMFreq;
 548   2              }
 549   1              else
 550   1              {
 551   2                      DeltAMFreq = I2C_GetByte(A24C02, (AM_Start + Scan_Channel));
C51 COMPILER V7.20   TUNER                                                                 06/30/2005 14:02:57 PAGE 10  

 552   2                      if(DeltAMFreq > AMFREQMAX)
 553   2                              DeltAMFreq = 0;
 554   2                      Current_Freq = AMFREQMIN+ DeltAMFreq;
 555   2              }
 556   1              RadioMute();
 557   1              RadioFreq(Current_Freq);
 558   1              RadioOpen();    
 559   1              TO_MAIN_DISPLAY = 0;
 560   1              Channel_Display = 100;
 561   1      }
 562          
 563          //整机上电初始化Tuner, 进入FM模式, 
 564          void    Tuner_Open(void)
 565          {               
 566   1              Scan_Channel = 0;
 567   1              DeltFMFreq = I2C_GetByte(A24C02, (FM_Start + 0));
 568   1              DeltFMFreq += (WORD)( I2C_GetByte(A24C02, (FM_Start +  1)) << 8);
 569   1              if(DeltFMFreq > FMFREQMAX)
 570   1                      DeltFMFreq = 0; 
 571   1              Current_Freq = FMFREQMIN+ DeltFMFreq;
 572   1              RadioMute();
 573   1              RadioFreq(Current_Freq);
 574   1              RadioOpen();
 575   1      }
 576          
 577          
 578          //从其他通道输入模式转换到tuner输入模式
 579          void    Change_Tuner_Mode(void)
 580          {               
 581   1              if(FM_AM_Select == FM_MODE)//如果在FM MODE
 582   1              {                               
 583   2                      Current_Freq = FMFREQMIN+ DeltFMFreq;//设置FM的工作频率         
 584   2              }
 585   1              else
 586   1              {               
 587   2                      Current_Freq = AMFREQMIN+ DeltAMFreq;//设置AM的工作频率 
 588   2              }       
 589   1              RadioMute();              //中频静音
 590   1              RadioFreq(Current_Freq);  //设置当前频率
 591   1              RadioOpen();              //打开收音    
 592   1      }
 593          
 594          //tuner单步调整
 595          void    Tuner_Step(BYTE Direct)
 596          {               
 597   1              if(Direct == 0)
 598   1                      RadioDown();//频率减一步
 599   1          else
 600   1                      RadioUp(); //频率加一步
 601   1              RadioMute();  //中频静音
 602   1              RadioFreq(Current_Freq);//设置当前频率
 603   1              RadioOpen();    
 604   1      }
 605          
 606          //执行到快进到下一个可以锁定的频率
 607          void    Proc_Tuner_FF_KEY(void)
 608          {
 609   1               Auto_Scan_Enable   = 0; //自动扫描禁止
 610   1               Manual_Scan_Enable = 1; //手动扫描打开,并设置向后(频率加)方向  
 611   1      }
 612          
 613          //执行快退到上一个可以锁定的频率
C51 COMPILER V7.20   TUNER                                                                 06/30/2005 14:02:57 PAGE 11  

 614          void    Proc_Tuner_FB_KEY(void)
 615          {
 616   1               Auto_Scan_Enable   = 0; //自动扫描禁止
 617   1               Manual_Scan_Enable = -1;//手动扫描打开,并设置向前(频率减)方向          
 618   1      }
 619          
 620          
 621          //执行自动扫描台的频率
 622          void    Proc_Tuner_AUTOSCAN_KEY(void)
 623          {
 624   1               Auto_Scan_Enable   = 1;//执行自动扫描功能
 625   1               Manual_Scan_Enable = 0;//手动扫描禁止
 626   1               Auto_Scan_Start = 0;   //将第一次扫描标志置位
 627   1      }
 628          
 629          // FM/AM之间的切换
 630          void    Proc_FMAM_Change(void)
 631          {       
 632   1              Scan_Channel = 0;
 633   1              if(FM_AM_Select == FM_MODE)
 634   1              {               
 635   2                      Current_Freq = AMFREQMIN+ DeltAMFreq;
 636   2                      FM_AM_Select = AM_MODE;
 637   2              }
 638   1              else
 639   1              {               
 640   2                      Current_Freq = FMFREQMIN+ DeltFMFreq;
 641   2                      FM_AM_Select = FM_MODE;
 642   2              }
 643   1              //假如切换前另外一个模式正在自动/手动扫描,可以停止
 644   1              Auto_Scan_Enable   = 0;
 645   1              Manual_Scan_Enable = 0;
 646   1              Auto_Scan_Start = 0;
 647   1              
 648   1              RadioMute();
 649   1              RadioFreq(Current_Freq);
 650   1              RadioOpen();    
 651   1      }
 652          
 653          //从静音状态恢复到收音状态时, FM/AM的显示要加上部分特殊ICON
 654          void    Tuner_MuteOFF_Display(void)
 655          {       
 656   1              if(FM_AM_Select == FM_MODE)
 657   1              {               
 658   2                      VFD_ICON_Display(ICON_FM | ICON_MHZ);
 659   2              }
 660   1              else
 661   1              {               
 662   2                      VFD_ICON_Display(ICON_AM | ICON_KHZ);
 663   2              }
 664   1              
 665   1      }
 666          //执行TUNER存储
 667          void Proc_Tuner_Memory(void)
 668          {
 669   1      
 670   1              //如果前面已经按下了MEMORY_KEY,
 671   1              if((Memory_Start == 1) && (NumberKey_Dealed == 0))
 672   1              {
 673   2                      if(Current_Key < KEY_5PLUS) //如果按下的按键是KEY_0, KEY_1,KEY_2,KEY_3,KEY_4
 674   2                      {
 675   3                              Digital_Number += Current_Key;//记忆数字键      
C51 COMPILER V7.20   TUNER                                                                 06/30/2005 14:02:57 PAGE 12  

 676   3                              NumberKey_Dealed = 1;
 677   3                      }               
 678   2                      else if(Current_Key == KEY_5PLUS) //如果按下的按键是KEY_5PLUS
 679   2                              Digital_Number += 5;
 680   2                      
 681   2                      //判断输入的数字是否大于台号的最大值
 682   2                      if( ((Digital_Number > FM_MAX_Channel) && (FM_AM_Select == FM_MODE))
 683   2                               || ((Digital_Number > AM_MAX_Channel) && (FM_AM_Select == AM_MODE))
 684   2                               || (Digital_Number == 0) )//如果数字台号为零,也为非法值
 685   2                      {
 686   3      
 687   3                              Digital_Number = 0;  //如果大于, 返回
 688   3                              Memory_Start = 0;
 689   3                              TO_MAIN_DISPLAY = 50;
 690   3                              return;
 691   3                      }                                       
 692   2                      TO_MAIN_DISPLAY = 400;
 693   2                      
 694   2              }
 695   1      }
 696          
 697          
 698          /*=======================  各频率通道的频率初始值设定  =================*/
 699          //十个字节对应的频率是87.5M, 90M, 98M, 106M, 108MHZ
 700          code BYTE FM_Default_Freq[] = {0,0, 50,0, 210,0, 0x72,0x1, 0x9A,0x1};
 701          
 702          //对应的频率是530K, 600K, 1000K, 1400K, 1710KHZ
 703          code BYTE AM_Default_Freq[] = {0, 14, 94, 174, 236};
 704          
 705          /*=======================  各频率通道的频率初始值设定  =================*/
 706          //用于在初始化EEPROM, 该函数在POWER_ON的时候调用, 用来对FM和AM的存储频率
 707          //初始化, 在产品出货前,工程也可以通过一些定义的按键顺序来初始化,
 708          /*=======================  各频率通道的频率初始值设定  =================*/
 709          void Tuner_Channel_Init(void)
 710          {
 711   1              BYTE EEPROML;
 712   1              BYTE EEPROMH;
 713   1              //先读出AT24C02的地址Channel_Test(0x20,0x21)的值, 
 714   1              //如果分别等于0x55和0xAA,那么认为无需要初始化
 715   1              EEPROML = I2C_GetByte( A24C02, Channel_Test );
 716   1              EEPROMH = I2C_GetByte( A24C02, Channel_Test + 1);
 717   1              if((EEPROML == 0x55) && (EEPROMH == 0xAA))
 718   1                      return;
 719   1      
 720   1              //FM 模式, 先写入87.5M, 90M, 98M, 106M, 108MHZ的频率
 721   1              for(EEPROML = 0; EEPROML < 10; EEPROML++)
 722   1              {
 723   2                      I2C_PutByte(A24C02, (FM_Start + EEPROML), FM_Default_Freq[EEPROML]);
 724   2                      DelayX1ms(2);
 725   2              }
 726   1              //剩下的(FM_MAX_Channel -5)的空间内都写入87.5MHZ,即偏差都为0
 727   1              for(EEPROML = 10; EEPROML < (FM_MAX_Channel * 2); EEPROML ++)
 728   1              {
 729   2                      I2C_PutByte(A24C02, (FM_Start + EEPROML), 0);
 730   2                      DelayX1ms(2);
 731   2              }
 732   1              
 733   1              //AM 模式,先写入530K, 600K, 1000K, 1400K, 1710Khz的频率
 734   1              for(EEPROML = 0; EEPROML < 5; EEPROML ++)
 735   1              {
 736   2                      I2C_PutByte(A24C02, (AM_Start + EEPROML), AM_Default_Freq[EEPROML]);
 737   2                      DelayX1ms(2);
C51 COMPILER V7.20   TUNER                                                                 06/30/2005 14:02:57 PAGE 13  

 738   2              }
 739   1              //在剩余(AM_MAX_Channel - 5)个的空间内写入530K,即偏差为0的频率
 740   1              for(EEPROML = 5; EEPROML < AM_MAX_Channel; EEPROML ++)
 741   1              {
 742   2                      I2C_PutByte(A24C02, (AM_Start + EEPROML), 0);
 743   2                      DelayX1ms(2);
 744   2              }
 745   1      
 746   1              //写标志为,证明EEPROM已经初始化
 747   1              I2C_PutByte(A24C02, Channel_Test, 0x55);
 748   1              DelayX1ms(2);
 749   1              I2C_PutByte(A24C02, Channel_Test + 1, 0xAA);
 750   1              return;
 751   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1848    ----
   CONSTANT SIZE    =     15    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      18
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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