fm_i2cdrv1.msa

来自「炬力方案176*132软件源码,适用于AK1025」· MSA 代码 · 共 797 行 · 第 1/2 页

MSA
797
字号
        //LD     DE,LWRD Analogtempbuf
        //LD     (DE),A
        //CALL   LWRD SetPAVolume
        LD    E,A
        mPA_SetVolume
        
FM_VolumeSet_exit:
        POP    DE
        POP    BC
        POP    AF
        RET
//==============================================     
 
/**************************************************************
Function is set volume
Input parameter:DE(DE is first address of input structure).
    1.serch frequency
    2.serch direction
*************************************************************/       
FM_SEARCH_Drv:
        PUSH    AF
        PUSH    BC
        PUSH    DE
// FM mute
        //IN      A,(0D5H)
        //RES     2,A
        //OUT     (0D5H),A
//------------------        
        LD      A,(DE)
        LD      L,A
        INC     DE
        LD      A,(DE)
        LD      H,A
        LD      (LWRD FREQ_RF),HL            //frequency
        INC     DE
        LD      A,(DE)
        LD      (LWRD SOFT_SUD),A            //serach direction
        LD      A,00H
        LD      (LWRD WSET_MUTE),A
        
        CALL    LWRD CALCULATE_PLL
        CALL    LWRD ASSEMBLE_WB  
        CALL    LWRD Checkstation                 //看是否存在台
        LD      A,(LWRD FM_result)
        CP      0
        JR      Z,FMSearcherrexit
        LD      A,(LWRD tempresult_LEV)
        LD      B,A
//将HLSI取反再试一次!        
        LD      A,(LWRD WSET_HLSI)
        LD      D,A
        BIT     0,A
        JR      NZ,FMsearchloop1
        INC     A
        INC     A
FMsearchloop1:
        DEC     A
        LD      (LWRD WSET_HLSI),A
        CALL    LWRD CALCULATE_PLL
        CALL    LWRD ASSEMBLE_WB 
        CALL    LWRD Checkstation                 //看是否存在台
        LD      A,(LWRD FM_result)
        CP      0
        JR      Z,FMSearcherrexit
        LD      A,(LWRD tempresult_LEV)
//比较不同的HLSI差异
        CP      B
        JR      NC,FMsearchloop2
        LD      C,A
        LD      A,B
        LD      B,C
        JR      FMsearchloop3
FMsearchloop2:
        LD      E,A
        LD      A,B
        LD      (LWRD tempresult_LEV),A
        LD      A,D
        LD      (LWRD WSET_HLSI),A
        LD      A,E
FMsearchloop3:        
        SUB     B
        CP      LEVdiffrence
        JR      NC,FMSearcherrexit        

        POP      DE
        PUSH     DE
        LD       A,01H
        LD      (DE),A
        CALL    LWRD FM_SETMUTE_Drv  
        LD      A,01H    
        LD      (LWRD FM_result),A    
        JR      FM_SEARCH_Drv_exit     
FMSearcherrexit:
        LD      A,00H    
        LD      (LWRD FM_result),A
FM_SEARCH_Drv_exit:
//FM not mute        
        //IN      A,(0D5H)
        //SET     2,A
        //OUT     (0D5H),A 
        
        POP     DE
        POP     BC
        POP     AF
        RET
//==============================================

//看是否存在台      
Checkstation:        
        PUSH    AF
        PUSH    BC
        PUSH    HL
        LD      A,(LWRD SOFT_SLEV)
        LD      B,A  
         
        LD      C,3
Checkstationloop1:  
        DEC     C
        JP      Z,LWRD FMerrstop
        CALL    LWRD WRITE_ONEFRAME
        CP      00h
        JR      Z,Checkstationloop1         
Read_status_time1:
        CALL    LWRD READ_STATUS
        CP      00H
        JR      Z,Checkstationloop1
        
        CALL    LWRD DISASSEMBLE_RB  
        LD      A,(LWRD RSET_IFCOUNTER) 
        LD      (LWRD Searchtemp_IF),A 
        LD      A,(LWRD RSET_STEREO) 
        LD      (LWRD Searchtemp_STEREO),A    
        LD      A,(LWRD RSET_LEV) 
        LD      (LWRD Searchtemp_LEV),A 
        CP      B
        JR      C,FMerrstop        
//开始判断!!!!
adjuststation:
//比较IFcounter,判断停台是否准确,可选!!!!
#ifdef  checkIFcounter     
        LD      A,(LWRD Searchtemp_IF)
        CP      IFhighlimit
        JR      NC,FMerrstop
        CP      IFlowlimit
        JR      C,FMerrstop
#endif
//比较sreteo信息
#ifdef  checkstereo
        LD      A,(LWRD Searchtemp_STEREO)
        CP      0
        JR      Z,FMerrstop
#endif  
//优化level等级 
       LD      A,(LWRD Searchtemp_LEV)
       LD      (LWRD tempresult_LEV),A
       JR      Checkstationexit
FMerrstop:
       LD      A,00H
       LD      (LWRD FM_result),A 
Checkstationexit:
       POP     HL
       POP     BC
       POP     AF
       RET  
//====================================================== 
//教准确的返回当前频率上的信息
Teststation:
        PUSH    AF
        PUSH    BC
        PUSH    HL

        LD      B,3
Teststationloop1:  
        DEC     B
        JR      Z,Teststationexit
        CALL    LWRD WRITE_ONEFRAME
        CP      0
        JR      Z,Teststationloop1
Teststation_time1:
        CALL    LWRD READ_STATUS
        CP      00H
        JR      Z,Teststationloop1
        CALL    LWRD DISASSEMBLE_RB  
        LD      A,(LWRD RSET_LEV) 
        LD      (LWRD Searchtemp_LEV),A 
Teststationexit:
        POP     HL
        POP     BC
        POP     AF
        RET       
//===============================================================       
            
//===============================================================       
//优化选择HLSI的算法,优化IF的算法
FM_setfrequency:
        PUSH    AF
        PUSH    BC
        PUSH    DE
        PUSH    HL

        LD      A,01H                    
        LD     (LWRD WSET_MUTE),A        
        LD      A,01H
        LD     (LWRD WSET_HLSI),A        
//HIGH/LOW side injection optimal
        CALL    LWRD CALCULATE_PLL
        CALL    LWRD ASSEMBLE_WB 
        
        LD      HL,(LWRD WSET_PLLLB)
        LD      BC,0037H
        ADD     HL,BC
        LD      A,H
        SET     7,A
        LD      (LWRD WRITE_BUFFER),A
        LD      A,L 
        LD      (LWRD WRITE_BUFFER+1),A
        CALL    LWRD Teststation
        LD      A,(LWRD FM_result)
        CP      0
        JP      Z,LWRD FM_HLSI1
        LD      A,(LWRD Searchtemp_LEV)
        LD      (LWRD FMadclevel1),A  
        
        LD      HL,(LWRD WSET_PLLLB)
        LD      BC,006EH
        SCF
        CCF
        SBC     HL,BC
        LD      A,H
        SET     7,A
        LD      (LWRD WRITE_BUFFER),A
        LD      A,L 
        LD      (LWRD WRITE_BUFFER+1),A
        CALL    LWRD Teststation
        LD      A,(LWRD FM_result)
        CP      0
        JP      Z,LWRD FM_HLSI1
        LD      A,(LWRD Searchtemp_LEV)
        LD      (LWRD FMadclevel2),A   
        
        LD      B,A
        LD      A,(LWRD FMadclevel1)
        CP      B
        JR      C,FM_HLSI1
        LD      A,00H
        LD      (LWRD WSET_HLSI),A        //HIGH/LOW side injection
        CALL    LWRD CALCULATE_PLL       
FM_HLSI1:        
//打开MUTE??
        LD      A,00H                      
        LD      (LWRD WSET_MUTE),A
        CALL    LWRD ASSEMBLE_WB 
        LD      C,3
FM_setfrequency_loop:     
        DEC     C
        JR      Z,FMsetfreq_exit
        CALL    LWRD WRITE_ONEFRAME
        CP      0
        JR      Z,FM_setfrequency_loop       
FMsetfreq_exit: 
        POP     HL
        POP     DE
        POP     BC
        POP     AF
        RET
//============================================================ 
/************************************************************
Function is assemble write buffer.
    Input parameter:no.
    Output parameter:no.
    Operation condition:
************************************************************/
ASSEMBLE_WB:                              //Subroutine is assemble WRITE_BUFFER
       PUSH    AF
       PUSH    BC
       PUSH    DE
       PUSH    HL           
//ONE_BYTE:
       LD       HL,LWRD WRITE_BUFFER        //First address of WRITE_BUFFER
       LD       A,(LWRD WSET_PLLHB)
       LD       B,A
       LD       A,(LWRD WSET_MUTE)
       CP       00H
       JR       Z,ASSEMBLEloop1
       SET      7,B
ASSEMBLEloop1:       
       LD       A,(LWRD WSET_SM)
       CP       00H
       JR       Z,ASSEMBLEloop2
       SET      6,B
ASSEMBLEloop2:
       LD       (HL),B
       INC    HL
//TWO
       LD       A,(LWRD WSET_PLLLB)  
       LD       (HL),A
       INC    HL               
//THREE_BYTE: 
       LD       A,(LWRD WSET_SSL)
       SRL      A
       LD       (LWRD WSET_SSL1),A
       LD       A,00H
       RLA
       LD       (LWRD WSET_SSL0),A        
       LD       DE,LWRD WSET_SUD
       LD       BC,0800H
FMWSET_nextbit3:
       LD       A,(DE)
       RRA
       LD       A,C
       RLA
       LD       C,A
       INC      DE
       DJNZ     FMWSET_nextbit3
       LD       (HL),A
       INC      HL       
       LD       BC,0800H
FMWSET_nextbit4:
       LD       A,(DE)
       RRA
       LD       A,C
       RLA
       LD       C,A
       INC      DE
       DJNZ     FMWSET_nextbit4
       LD       (HL),A
       INC      HL 
//FIVE       
       LD       C,00H
       LD       A,(LWRD WSET_DTC)
       RRCA
       LD       C,A
       LD       A,(LWRD WSET_PLLREF)
       RLA
       LD       A,C
       RRA
       LD       (HL),A
       POP      HL
       POP      DE
       POP      BC
       POP      AF
       RET
//==============================================================       
/***************************************************************
Function is disassemble read buffer.
    Input parameter:no.
    Output parameter:no.
    Operation condition:
***************************************************************/
DISASSEMBLE_RB:
      PUSH    AF
      PUSH    BC
      PUSH    HL
      
      LD      HL,LWRD READ_BUFFER        //First address of READ_BUFFER
      LD      A,(HL)
      RLA
      LD      C,A
      LD      A,00H
      RLA
      LD      (LWRD RSET_RF),A
      
      LD      A,C
      RLA
      LD      A,00H
      RLA
      LD      (LWRD RSET_BLF),A
        
      INC     HL      
      INC     HL
      LD      A,(HL)
      RLA
      LD      A,00H
      RLA
      LD      (LWRD RSET_STEREO),A
      LD      A,(HL)
      RES     7,A
      LD      (LWRD RSET_IFCOUNTER),A
          
      INC     HL
      LD      A,(HL)
      LD      B,0F0H
      AND     B
      SCF
      CCF
      RRA
      RRA
      RRA
      RRA
      LD     (LWRD RSET_LEV),A
      
      POP    HL
      POP    BC
      POP    AF
      RET
//========================================================                 
END

⌨️ 快捷键说明

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