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

📄 lpc900sspi.asm

📁 MFRC522 单片机读写程序
💻 ASM
字号:
/**************************************Copyright (c)*************************************
**                              广州周立功单片机发展有限公司
**                                    研    究    所
**                                       产品一部 
**
**                                http://www.zlgmcu.com
**
**--------------文件信息-----------------------------------------------------------------
** 文 件 名:    LPC900SSPI.asm
** 文件描述:    LPC900模拟SPI总线操作函数
** 版    本:    V1.0
** 创 建 人:	
** 创建日期:	2006.12.04
** 最后修改日期:
**=======================================================================================
**-----------------修改记录--------------------------------------------------------------
** 修改内容:    
** 当前版本:
** 修 改 人:
** 修改日期:
** 注    意: 
**---------------------------------------------------------------------------------------
****************************************************************************************/
$NOMOD51
NAME    LPC900SSPI
$SET ( LPC900SSPI_GLOBALS )
$include (LPC900SSPI.inc)
;========================================================================================
?DT?LPC900SSPI		segment	data		       ; 定义程序段
?PR?LPC900SSPI		segment	code		       ; 定义程序段
;========================================================================================
    Rseg    ?DT?LPC900SSPI
SPI_Data:   DS      1
;========================================================================================
    Rseg    ?PR?LPC900SSPI
;****************************************************************************************
;** 函数原型:   void SPI_Init()
;** 函数功能:   SPI 初始化
;** 入口参数:   -
;** 出口参数:   -
;** 返 回 值:   -
;** 说    明:   模拟SPI接口不需要初始化,但需要保留以兼容硬件SPI
;****************************************************************************************
SPI_Init:
_SPI_Init:
    SETB    MF_NSS
    CLR     MF_SCK                      ; 空闲时为低电平
    RET
;****************************************************************************************
;** 函数原型:    void RcSetReg(unsigned char RegAddr, unsigned char RegVal)
;** 函数功能:    向SPI从机写入数据
;** 入口参数:    unsigned char RegAddr(R7)       ; 从机地址
;**              unsigned char RegVal(R5)        ; 写入的值
;** 出口参数:    -
;** 返 回 值:    -    
;****************************************************************************************
RcSetReg:
_RcSetReg:
    CLR     MF_NSS
    MOV     A,R7                        ; RegAddr
    RL      A
    ANL     A,#0FEH                     ; RegAddr<<1
    MOV     R7,A
    CALL    SPI_Transfers               ; 返回值在R7中
    MOV     A,R5                        ; RegVal
    MOV     R7,A
    CALL    SPI_Transfers               ; 返回值在R7中
    SETB    MF_NSS
    RET
;****************************************************************************************
;** 函数原型:   unsigned char RcGetReg(unsigned char RegAddr)
;** 函数功能:   从SPI从机指定的地址读出数据
;** 入口参数:   unsigned char RegAddr       ; 从机地址
;** 出口参数:   -
;** 返 回 值:   读出的值    
;****************************************************************************************
RcGetReg:
_RcGetReg:
    CLR     MF_NSS
    MOV     A,R7                        ; RegAddr
    RL      A                           ; 0x80|(RegAddr<<1)
    ANL     A,#0FEH
    ORL     A,#080H
    MOV     R7,A
    CALL    SPI_Transfers               ; 返回值在R7中
    MOV     R7,#00H
    CALL    SPI_Transfers               ; 返回值在R7中
    SETB    MF_NSS
    RET
;****************************************************************************************
;** 函数原型:   void RcModifyReg(unsigned char RegAddr, unsigned char ModifyVal, 
;**                               unsigned char MaskByte)
;** 函数功能:   修改SPI从机中指定地址的位
;** 入口参数:   unsigned char RegAddr       ; 从机地址
;**             unsigned char ModifyVal     ; 修改模式(置位/清位)
;**             unsigned char MaskByte      ; 修改的位(置1有效)
;** 出口参数:   -
;** 返 回 值:   -  
;****************************************************************************************/
RcModifyReg:
_RcModifyReg:
    MOV     A,R7                        ; R7 <- RegAddr
    MOV     R4,A                        ; 借用R4,保存地址
; 读出寄存器的值
    CALL    RcGetReg                    ; 影响R6,R7
; 修改相应的位
    MOV     A,R5                        ; R5 <- ModifyVal
    JZ      RcModifyReg_CLR
RcModifyReg_SET:
    MOV     A,R3
    ORL     A,R7
    MOV     R5,A
    SJMP    RcModifyReg_W
RcModifyReg_CLR:                        ; RegVal &= (~MaskByte)
    MOV     A,R3                        ; R3 <- MaskByte
    CPL     A
    ANL     A,R7
    MOV     R5,A
; 写入修改后的数据
RcModifyReg_W:
    MOV     A,R4
    MOV     R7,A                        ; R7 <- RegAddr
    SJMP    RcSetReg
;****************************************************************************************
;** 函数原型:   void ReadFIFO(unsigned char idata *DataBfr,unsigned char Len)
;** 函数功能:   读FIFO中的数据
;** 入口参数:   unsigned char Len(R5)       ; 读出的字节数
;** 出口参数:   unsigned char idata *DataBfr; 读出的数据
;** 返 回 值:   -  
;****************************************************************************************
ReadFIFO:
_ReadFIFO:
    MOV     A,R5
    JZ      ReadFIFO_END
    MOV     A,R7
    MOV     R0,A
; 开始读取FIFO
    CLR     MF_NSS
    MOV     R7,#(0x80|(FIFOAddr*2))
    CALL    SPI_Transfers
    SJMP    ReadFIFO_Next
ReadFIFO_Loop:
    MOV     R7,#(0x80|(FIFOAddr*2))
    CALL    SPI_Transfers
    MOV     @R0,A                       ; 返回值同时也在ACC中
    INC     R0
ReadFIFO_Next:
    DJNZ    R5,ReadFIFO_Loop
; 接收最后一字节数据
ReadFIFO_END:
    MOV     R7,#00H
    CALL    SPI_Transfers
    MOV     @R0,A                       ; 返回值同时也在ACC中
    SETB    MF_NSS
    RET
;****************************************************************************************
;** 函数原型:    void ReadFIFO(unsigned char idata *DataBfr,unsigned char Len)
;** 函数功能:    向FIFO中写入数据
;** 入口参数:    unsigned char idata *DataBfr; 写入的数据
;**              unsigned char Len           ; 写入的字节数
;** 出口参数:    
;** 返 回 值:    -
;** 描   述:    
;****************************************************************************************
WriteFIFO:
_WriteFIFO:
    MOV     A,R5
    JZ      WriteFIFO_END
    MOV     A,R7
    MOV     R0,A

    CLR     MF_NSS
    MOV     R7,#(FIFOAddr*2)
    CALL    SPI_Transfers
WriteFIFO_Loop:
    MOV     A,@R0
    MOV     R7,A
    CALL    SPI_Transfers
    INC     R0
    DJNZ    R5,WriteFIFO_Loop
    SETB    MF_NSS
WriteFIFO_END:
    RET
;****************************************************************************************
;** 函数原型:   unsigned char spi_transceive(unsigned char out)
;** 函数功能:   SPI数据传输
;** 入口参数:   unsigned char out(R7)       ; 要发送的数据
;** 出口参数:   -
;** 返 回 值:   接收的数据
;** 说    明:   CCLK/14   
;****************************************************************************************
SPI_Transfers:
_SPI_Transfers:
    CLR     MF_SCK                      ; 1
    SETB    MF_MISO                     ; 1
    MOV     R6,#08H
SPI_Transfers_Loop:
    MOV     A,R7                        ; 1
    RLC     A                           ; 1
    MOV     MF_MOSI,C                   ; 1
    MOV     R7,A                        ; 1
    NOP                                 ; 7
    SETB    MF_SCK                      ; 1
    NOP                                 ; 1
    MOV     A,SPI_Data                  ; 1
    MOV     C,MF_MISO                   ; 1
    RLC     A                           ; 1
    MOV     SPI_Data,A                  ; 1
    NOP                                 ; 7
    CLR     MF_SCK
    DJNZ    R6,SPI_Transfers_Loop
SPI_Transfers_END:
    MOV     R7,SPI_Data
    RET
;========================================================================================
END

⌨️ 快捷键说明

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