📄 library.asm
字号:
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 + -