📄 tuner.lst
字号:
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 + -