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

📄 library.asm

📁 便携式压力传感器
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	LCALL   I2CRDNBYT
	RET
  
;===================================================
; 利用PCF8574T实现SPI总线器件片选操作
; 2002/2/1
;===================================================
PCF8574CSWR:
	MOV     SLA,#PCF8574CS
	MOV     I2CNUMBYT,#1            ;单字节写
	LCALL   I2CWRNBYTP
	RET

PCF8574CSRD:
	MOV     SLA,#PCF8574CS
	MOV     I2CNUMBYT,#1            ;单字节读
	LCALL   I2CRDNBYT
	RET

;===================================================
; SPI存储器/存储卡操作子程序
; 2002/3/2
;===================================================
	;**********************************************
	;向SPI存储卡连续写SPINBYT字节数据(少于128字节)
	;**********************************************
AT45D04CARDWRNBYT:
	CLR     SPISCLK
	MOV     R1,#I2CDBUF
	MOV     @R1,#AT45D04CARDCS      ;选中SPI存储卡
	LCALL   PCF8574CSWR

	MOV     SPIDAT,#053H            ;(SPIDAT)=053H,Main Memory Page To Buffer1 Transfer
	LCALL   SPIBYTSND

	PUSH    SPIPGL
	MOV     A,SPIPGL
	CLR     C
	RLC     A
	MOV     SPIPGL,A
	MOV     A,SPIPGH
	RLC     A

	MOV     SPIDAT,A
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIPGL
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIADR
	LCALL   SPIBYTSND
	POP     SPIPGL

	MOV     R1,#I2CDBUF
	MOV     @R1,#0FFH               ;停止所有SPI总线器件操作
	LCALL   PCF8574CSWR
	LCALL   DELAY25

	CLR     SPISCLK
	MOV     R1,#I2CDBUF
	MOV     @R1,#AT45D04CARDCS      ;选中SPI存储卡
	LCALL   PCF8574CSWR

	MOV     SPIDAT,#082H            ;(SPIDAT)=082H,Main Memory Page Program Through Buffer1
	LCALL   SPIBYTSND

	PUSH    SPIPGL
	MOV     A,SPIPGL
	CLR     C
	RLC     A
	MOV     SPIPGL,A
	MOV     A,SPIPGH
	RLC     A

	MOV     SPIDAT,A
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIPGL
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIADR
	LCALL   SPIBYTSND
	POP     SPIPGL

	MOV     R6,SPINBYT
	MOV     R0,#SPIDBUF
AT45D04CARDWRNBYT02:
	MOV     SPIDAT,@R0
	LCALL   SPIBYTSND
	INC     R0
	DJNZ    R6,AT45D04CARDWRNBYT02

	MOV     R1,#I2CDBUF
	MOV     @R1,#0FFH               ;停止所有SPI总线器件操作
	LCALL   PCF8574CSWR
	LCALL   DELAY25
	RET
  
	;**********************************************
	;从SPI存储卡连续读SPINBYT字节数据(少于128字节)
	;**********************************************
AT45D04CARDRDNBYT:
	CLR     SPISCLK
	MOV     R1,#I2CDBUF
	MOV     @R1,#AT45D04CARDCS      ;选中SPI存储卡
	LCALL   PCF8574CSWR

	MOV     SPIDAT,#0D2H            ;(SPIDAT)=0D2H,Main Memory Page Read
	LCALL   SPIBYTSND

	PUSH    SPIPGL
	MOV     A,SPIPGL
	CLR     C
	RLC     A
	MOV     SPIPGL,A
	MOV     A,SPIPGH
	RLC     A

	MOV     SPIDAT,A
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIPGL
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIADR
	LCALL   SPIBYTSND
	
	POP     SPIPGL
	MOV     R6,#4
AT45D04CARDRDNBYT02:
	MOV     SPIDAT,#0
	LCALL   SPIBYTSND
	DJNZ    R6,AT45D04CARDRDNBYT02

	MOV     R6,SPINBYT
	MOV     R0,#SPIDBUF
AT45D04CARDRDNBYT03:
	LCALL   SPIBYTRCV
	MOV     @R0,A
	INC     R0
	DJNZ    R6,AT45D04CARDRDNBYT03

	MOV     R1,#I2CDBUF
	MOV     @R1,#0FFH               ;停止所有SPI总线器件操作
	LCALL   PCF8574CSWR
	LCALL   DELAY1MS
	RET

AT45D04CARDRDNBYTD:
	CLR     SPISCLK
	MOV     R1,#I2CDBUF
	MOV     @R1,#AT45D04CARDCS      ;选中SPI存储卡
	LCALL   PCF8574CSWR

	MOV     SPIDAT,#0D2H            ;(SPIDAT)=0D2H,Main Memory Page Read
	LCALL   SPIBYTSND

	PUSH    SPIPGL
	MOV     A,SPIPGL
	CLR     C
	RLC     A
	MOV     SPIPGL,A
	MOV     A,SPIPGH
	RLC     A

	MOV     SPIDAT,A
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIPGL
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIADR
	LCALL   SPIBYTSND
	
	POP     SPIPGL
	MOV     R6,#4
AT45D04CARDRDNBYTD02:
	MOV     SPIDAT,#0
	LCALL   SPIBYTSND
	DJNZ    R6,AT45D04CARDRDNBYTD02

	MOV     R6,SPINBYT
	MOV     R0,#(SPIDBUF+60H)
AT45D04CARDRDNBYTD03:
	LCALL   SPIBYTRCV
	MOV     @R0,A
	INC     R0
	DJNZ    R6,AT45D04CARDRDNBYTD03

	MOV     R1,#I2CDBUF
	MOV     @R1,#0FFH               ;停止所有SPI总线器件操作
	LCALL   PCF8574CSWR
	LCALL   DELAY1MS
	RET

	;**********************************************
	;向SPI存储器连续写SPINBYT字节数据(少于128字节)
	;**********************************************
AT45D04WRNBYT:
	CLR     SPISCLK
	MOV     R1,#I2CDBUF
	MOV     @R1,#AT45D04CS          ;选中机内串行数据存储器
	LCALL   PCF8574CSWR

	MOV     SPIDAT,#053H            ;(SPIDAT)=053H,Main Memory Page To Buffer1 Transfer
	LCALL   SPIBYTSND

	PUSH    SPIPGL
	MOV     A,SPIPGL
	CLR     C
	RLC     A
	MOV     SPIPGL,A
	MOV     A,SPIPGH
	RLC     A

	MOV     SPIDAT,A
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIPGL
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIADR
	LCALL   SPIBYTSND
	POP     SPIPGL

	MOV     R1,#I2CDBUF
	MOV     @R1,#0FFH               ;停止所有SPI总线器件操作
	LCALL   PCF8574CSWR
	LCALL   DELAY25

	CLR     SPISCLK
	MOV     R1,#I2CDBUF
	MOV     @R1,#AT45D04CS          ;选中机内串行数据存储器
	LCALL   PCF8574CSWR

	MOV     SPIDAT,#082H            ;(SPIDAT)=082H,Main Memory Page Program Through Buffer1
	LCALL   SPIBYTSND

	PUSH    SPIPGL
	MOV     A,SPIPGL
	CLR     C
	RLC     A
	MOV     SPIPGL,A
	MOV     A,SPIPGH
	RLC     A

	MOV     SPIDAT,A
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIPGL
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIADR
	LCALL   SPIBYTSND
	POP     SPIPGL

	MOV     R6,SPINBYT
	MOV     R0,#SPIDBUF
AT45D04WRNBYT02:
	MOV     SPIDAT,@R0
	LCALL   SPIBYTSND
	INC     R0
	DJNZ    R6,AT45D04WRNBYT02

	MOV     R1,#I2CDBUF
	MOV     @R1,#0FFH               ;停止所有SPI总线器件操作
	LCALL   PCF8574CSWR
	LCALL   DELAY25
	RET
  
	;**********************************************
	;从SPI存储器连续读SPINBYT字节数据(少于128字节)
	;**********************************************
AT45D04RDNBYT:
	CLR     SPISCLK
	MOV     R1,#I2CDBUF
	MOV     @R1,#AT45D04CS          ;选中机内串行数据存储器
	LCALL   PCF8574CSWR

	MOV     SPIDAT,#0D2H            ;(SPIDAT)=0D2H,Main Memory Page Read
	LCALL   SPIBYTSND

	PUSH    SPIPGL
	MOV     A,SPIPGL
	CLR     C
	RLC     A
	MOV     SPIPGL,A
	MOV     A,SPIPGH
	RLC     A

	MOV     SPIDAT,A
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIPGL
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIADR
	LCALL   SPIBYTSND
	
	POP     SPIPGL
	MOV     R6,#4
AT45D04RDNBYT02:
	MOV     SPIDAT,#0
	LCALL   SPIBYTSND
	DJNZ    R6,AT45D04RDNBYT02

	MOV     R6,SPINBYT
	MOV     R0,#SPIDBUF
AT45D04RDNBYT03:
	LCALL   SPIBYTRCV
	MOV     @R0,A
	INC     R0
	DJNZ    R6,AT45D04RDNBYT03

	MOV     R1,#I2CDBUF
	MOV     @R1,#0FFH               ;停止所有SPI总线器件操作
	LCALL   PCF8574CSWR
	LCALL   DELAY1MS
	RET
  
	;********************************
	;发送SPI存储器控制命令(SPIDAT)
	;********************************
SPIBYTSND:
	MOV     A,SPIDAT
	CLR     C
	MOV     R7,#08          ;发送8位SPI存储器控制命令
SPIBYTSND01:
	CLR     SPISCLK
	RLC     A
	MOV     SPIDIN,C
	SETB    SPISCLK
	DJNZ    R7,SPIBYTSND01
	RET


	;********************************
	;读SPI
	;********************************
SPIBYTRCV:
	CLR     A
	CLR     C
	MOV     R7,#08          ;读8位SPI串行数据
SPIBYTRCV01:
	CLR     SPISCLK
	NOP                     ;至少15个延时空操作
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	MOV     C,SPIDOUT
	RLC     A
	SETB    SPISCLK
	DJNZ    R7,SPIBYTRCV01
	RET
	   
	;********************************
	;读取SPI存储器状态寄存器
	;********************************
SPIRDYCHK:
	MOV     SPIDAT,#0D7H    ;SPI存储器控制命令(SPIDAT)
	LCALL   SPIBYTSND
SPIRDYCHK01:
	LCALL   SPIBYTRCV
	ANL     A,#10000000B
	CJNE    A,#80H,SPIRDYCHK01
	RET
	
	;**********************************************
	;向SPI存储卡连续写SPINBYT字节数据(少于256字节)
	;**********************************************
AT45D04CARDWRNBYTR:
	CLR     SPISCLK
	MOV     R1,#I2CDBUF
	MOV     @R1,#AT45D04CARDCS      ;选中SPI存储卡
	LCALL   PCF8574CSWR

	MOV     SPIDAT,#053H            ;(SPIDAT)=053H,Main Memory Page To Buffer1 Transfer
	LCALL   SPIBYTSND

	PUSH    SPIPGL
	MOV     A,SPIPGL
	CLR     C
	RLC     A
	MOV     SPIPGL,A
	MOV     A,SPIPGH
	RLC     A

	MOV     SPIDAT,A
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIPGL
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIADR
	LCALL   SPIBYTSND
	POP     SPIPGL

	MOV     R1,#I2CDBUF
	MOV     @R1,#0FFH               ;停止所有SPI总线器件操作
	LCALL   PCF8574CSWR
	LCALL   DELAY25

	CLR     SPISCLK
	MOV     R1,#I2CDBUF
	MOV     @R1,#AT45D04CARDCS      ;选中SPI存储卡
	LCALL   PCF8574CSWR

	MOV     SPIDAT,#082H            ;(SPIDAT)=082H,Main Memory Page Program Through Buffer1
	LCALL   SPIBYTSND

	PUSH    SPIPGL
	MOV     A,SPIPGL
	CLR     C
	RLC     A
	MOV     SPIPGL,A
	MOV     A,SPIPGH
	RLC     A

	MOV     SPIDAT,A
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIPGL
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIADR
	LCALL   SPIBYTSND
	POP     SPIPGL

	MOV     R6,SPINBYT
	MOV     DPTR,#SPIDBUFR
AT45D04CARDWRNBYTR02:
	MOVX    A,@DPTR
	MOV     SPIDAT,A
	LCALL   SPIBYTSND
	INC     DPTR
	DJNZ    R6,AT45D04CARDWRNBYTR02

	MOV     R1,#I2CDBUF
	MOV     @R1,#0FFH               ;停止所有SPI总线器件操作
	LCALL   PCF8574CSWR
	LCALL   DELAY25
	RET
	
	;**********************************************
	;从SPI存储卡连续读SPINBYT字节数据(少于256字节)
	;**********************************************
AT45D04CARDRDNBYTR:
	CLR     SPISCLK
	MOV     R1,#I2CDBUF
	MOV     @R1,#AT45D04CARDCS      ;选中SPI存储卡
	LCALL   PCF8574CSWR
	
	MOV     SPIDAT,#0D2H            ;(SPIDAT)=0D2H,Main Memory Page Read
	LCALL   SPIBYTSND

	PUSH    SPIPGL
	MOV     A,SPIPGL
	CLR     C
	RLC     A
	MOV     SPIPGL,A
	MOV     A,SPIPGH
	RLC     A

	MOV     SPIDAT,A
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIPGL
	LCALL   SPIBYTSND
	MOV     SPIDAT,SPIADR

⌨️ 快捷键说明

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