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

📄 fm_i2cdrv2.msa

📁 yts收音模块用汇编语言写的,介绍了收音的搜台和处理过程
💻 MSA
📖 第 1 页 / 共 2 页
字号:
        
//=========================================================
//        I2C Exit:
//            Input parameter:NO
//            Output parameter:NO.
//=========================================================  
I2C_Exit:
            PUSH    AF
            IN      A,(SDA_outport)
            RES     SDA_outport_num,A
            OUT     (SDA_outport),A 
            IN      A,(SCL_outport)
            RES     SCL_outport_num,A
            OUT     (SCL_outport),A   
            POP     AF
            RET
        
//=========================================================
//        I2C Start Condition:
//            Input parameter:NO
//            Output parameter:NO.
//=========================================================
I2C_Start: 
            PUSH    AF
            IN      A,(SDA_doport)
            RES     SDA_doport_num,A
            OUT     (SDA_doport),A
            CALL    LWRD I2C_wait5us
            IN      A,(SCL_doport)
            RES     SCL_doport_num,A
            OUT     (SCL_doport),A
            POP     AF
            RET         
//=========================================================
//        I2C Stop Condition:
//            Input parameter:NO
//            Output parameter:NO.
//=========================================================               
I2C_Stop: 
            PUSH    AF
            IN      A,(SCL_doport)
            SET     SCL_doport_num,A
            OUT     (SCL_doport),A
            CALL    LWRD I2C_wait5us
            IN      A,(SDA_doport)
            SET     SDA_doport_num,A
            OUT     (SDA_doport),A   
            POP     AF
            RET
            
//========================================================
//  I2C Transfer One Byte
//A 为待传数据,返回时A中为响应类型,0为ACK, 1为NACK
//若为地址字节且欲读取数据,B为1,否则为0
//========================================================
I2Ctransbyte:     
            PUSH    BC
            LD      C,A          
            CALL    LWRD I2CSendbyte
//SDA  output-->input                
            IN      A,(SDA_outport)
            RES     SDA_outport_num,A
            OUT     (SDA_outport),A 
            IN      A,(SDA_inport)
            SET     SDA_inport_num,A
            OUT     (SDA_inport),A  
//SCL output 1                
            CALL    LWRD I2C_wait5us
            IN      A,(SCL_doport)
            SET     SCL_doport_num,A
            OUT     (SCL_doport),A
             
            IN      A,(SDA_dinport)
            BIT     SDA_dinport_num,A
            JR      NZ,GetNACK
            
            LD      C,00H
            LD      A,B
            CP      01H
            JR      Z,I2Creadaddbyte
            
            IN      A,(SDA_inport)
            RES     SDA_inport_num,A
            OUT     (SDA_inport),A 

            IN      A,(SDA_doport)
            RES     SDA_doport_num,A
            OUT     (SDA_doport),A  
            JR      ACKgetok
I2Creadaddbyte: 
            CALL    LWRD I2C_wait5us
            IN      A,(SCL_doport)
            RES     SCL_doport_num,A
            OUT     (SCL_doport),A
            JR      I2Ctransok
GetNACK:                
            LD      C,01H
            IN      A,(SDA_doport)
            SET     SDA_doport_num,A
            OUT     (SDA_doport),A  
ACKgetok:                    
            IN      A,(SDA_outport)
            SET     SDA_outport_num,A
            OUT     (SDA_outport),A
             
            CALL    LWRD I2C_wait5us
            
            IN      A,(SCL_doport)
            RES     SCL_doport_num,A
            OUT     (SCL_doport),A
            
            IN      A,(SDA_doport)
            RES     SDA_doport_num,A
            OUT     (SDA_doport),A 
I2Ctransok:
            LD      A,C
            POP     BC
            RET
            
//==================================================
//I2C Receive One Byte
//A入口为准备响应,返回为接受到的数值
//==================================================
I2Crecebyte:
            PUSH    BC
            LD      B,A 
            PUSH    BC
            
            IN      A,(SCL_outport)
            RES     SCL_outport_num,A
            OUT     (SCL_outport),A
            IN      A,(SCL_inport)
            SET     SCL_inport_num,A
            OUT     (SCL_inport),A
waitsclrelease:
            IN      A,(SCL_dinport)
            BIT     SCL_dinport_num,A
            JR      Z,waitsclrelease 
            
            IN      A,(SCL_inport)
            RES     SCL_inport_num,A
            OUT     (SCL_inport),A

            IN      A,(SCL_doport)
            SET     SCL_doport_num,A
            OUT     (SCL_doport),A
            IN      A,(SCL_outport)
            SET     SCL_outport_num,A
            OUT     (SCL_outport),A
 
            LD      B,08H 
SDAInextbit:               
            IN      A,(SCL_doport)
            SET     SCL_doport_num,A
            OUT     (SCL_doport),A  
             
            CALL    LWRD I2C_wait3us 
            
            IN      A,(SDA_dinport)
            BIT     SDA_dinport_num,A
            JR      Z,SDAI0
SDAI1:          
            SCF
            RL      C
            JR      SDAI_OK                
SDAI0:
            SLA     C
SDAI_OK:
            LD      A,B
            CP      01H
            JR      Z,I2CRlastbit
            
            PUSH    BC
            POP     BC
            
            IN      A,(SCL_doport)
            RES     SCL_doport_num,A
            OUT     (SCL_doport),A   
               
            CALL    LWRD I2C_wait5us                      
            DJNZ    SDAInextbit              
I2CRlastbit:   
            IN      A,(SDA_inport)
            RES     SDA_inport_num,A
            OUT     (SDA_inport),A 

            BIT     0,C
            JR      NZ,I2CRlastbit1
            IN      A,(SDA_doport)
            RES     SDA_doport_num,A
            OUT     (SDA_doport),A  
            JR      I2CRlastbitOK      
I2CRlastbit1:      
            IN      A,(SDA_doport)
            SET     SDA_doport_num,A
            OUT     (SDA_doport),A    
I2CRlastbitOK:         
            IN      A,(SDA_outport)
            SET     SDA_outport_num,A
            OUT     (SDA_outport),A 
            
            IN      A,(SCL_doport)
            RES     SCL_doport_num,A
            OUT     (SCL_doport),A          
            
            LD      A,C
            POP     BC
            LD      C,A
            LD      A,B
            CP      00H
            JR      NZ,GenNACK
            
            IN      A,(SDA_doport)
            RES     SDA_doport_num,A
            OUT     (SDA_doport),A  
            
            CALL    LWRD I2C_wait5us 

            IN      A,(SCL_doport)
            SET     SCL_doport_num,A
            OUT     (SCL_doport),A   
                     
            CALL    LWRD I2C_wait5us 
            
            IN      A,(SCL_doport)
            RES     SCL_doport_num,A
            OUT     (SCL_doport),A  
            IN      A,(SDA_outport)
            RES     SDA_outport_num,A
            OUT     (SDA_outport),A 
            IN      A,(SDA_inport)
            SET     SDA_inport_num,A
            OUT     (SDA_inport),A 
            JR      ACKgenok
GenNACK:
            IN      A,(SDA_doport)
            SET     SDA_doport_num,A
            OUT     (SDA_doport),A  
            
            CALL    LWRD I2C_wait5us 

            IN      A,(SCL_doport)
            SET     SCL_doport_num,A
            OUT     (SCL_doport),A 
                    
            CALL    LWRD I2C_wait5us 
            
            IN      A,(SCL_doport)
            RES     SCL_doport_num,A
            OUT     (SCL_doport),A  
            IN      A,(SDA_doport)
            RES     SDA_doport_num,A
            OUT     (SDA_doport),A   
ACKgenok:      
            LD      A,C
            POP     BC
            RET
                                 
//==================================================
//I2C Send 8Bit Data
//    Input Parameter:C:Send Data
//    Output Parameter:NO
//==================================================
I2CSendbyte:                
            PUSH    BC     
            LD      B,8
SDAOnextbit:            
            SLA     C
            JR      C,SDAO1
SDAO0:      
            IN      A,(SDA_doport)
            RES     SDA_doport_num,A
            OUT     (SDA_doport),A            
            JR      SDAO_OK
SDAO1:      
            IN      A,(SDA_doport)
            SET     SDA_doport_num,A
            OUT     (SDA_doport),A    
SDAO_OK:     
            CALL    LWRD I2C_wait5us
            
            IN      A,(SCL_doport)
            SET     SCL_doport_num,A
            OUT     (SCL_doport),A
                
            CALL    LWRD I2C_wait5us
            
            IN      A,(SCL_doport)
            RES     SCL_doport_num,A
            OUT     (SCL_doport),A
            DJNZ    SDAOnextbit  
            POP     BC                 
            RET
//==================================================
//   Delay 5us
//==================================================
I2C_wait5us:
           PUSH    AF
           PUSH    BC
           NOP
           NOP
           POP     BC
           POP     AF
           RET
           
//==================================================
//   Delay 3us
//==================================================           
I2C_wait3us:
           PUSH    AF
           PUSH    BC 
           NOP
           NOP   
           POP     BC
           POP     AF
           RET

//==================================================
//   Wait 10ms
//==================================================
FMwait10ms:
        PUSH    AF
        PUSH    BC

        LD      BC,09FFH
FMwait10msloop:                        
        PUSH    DE
        POP     DE
        PUSH    DE
        POP     DE
        PUSH    DE
        POP     DE
        PUSH    DE
        POP     DE
        PUSH    DE
        POP     DE
        DEC     BC
        LD      A,B
        OR      C
        JR      nZ,FMwait10msloop
        
        POP     BC
        POP     AF
        RET
        
//==================================================
//   Wait 20ms
//==================================================
FMwait20ms:
        PUSH    AF
        PUSH    BC

        LD      BC,1500H
FMwait20msloop:                        
        PUSH    DE
        POP     DE
        PUSH    DE
        POP     DE
        PUSH    DE
        POP     DE
        PUSH    DE
        POP     DE
        PUSH    DE
        POP     DE
        DEC     BC
        LD      A,B
        OR      C
        JR      nZ,FMwait20msloop
        
        POP     BC
        POP     AF
        RET 

//==================================================
//   Wait 30ms
//==================================================        
FMwait30ms: 
        PUSH    AF
        PUSH    BC

        LD      BC,1E00H
FMwait30msloop:                        
        PUSH    DE
        POP     DE
        PUSH    DE
        POP     DE
        PUSH    DE
        POP     DE
        PUSH    DE
        POP     DE
        PUSH    DE
        POP     DE
        DEC     BC
        LD      A,B
        OR      C
        JR      nZ,FMwait30msloop
        
        POP     BC
        POP     AF
        RET 

END	      	

⌨️ 快捷键说明

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