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

📄 bat512.asm

📁 c语言和汇编语言混合编程实例详解.rar
💻 ASM
字号:
;这是读写AT24CXX EEPROM程序,文件名为BAT512.ASM
;功能: 适用AT24CXX EEPROM系列共11个型号的读写,具体为
;     (1) 页写入
;     (2) 页写入校验
;     (3) 字节写入
;     (4) 字节写入校验

SDA   BIT INT1
SCL   BIT INT0

FADDR EQU 0A0H        ;AT24CXX固定地址
PADDR EQU 0           ;可编程地址(0-7)
SIZE  EQU 10000H      ;AT24CXX所包含的字节数(80H,100H,200H,400H,800H,1000H,2000H,4000H,8000H,10000H)
PSIZE EQU 128         ;每页字节数(8,16,32,64,128,256)
FILL  EQU 77H         ;待写入的数值(0-255)

ZDATA  EQU  7DH
ADDRLO EQU  7EH
ADDRHI EQU  7FH
BUFFER EQU  80H       ;缓冲区地址

      ORG 0000H
      LJMP MAIN
      ORG 0080H
MAIN: MOV SP,#050H
      CLR EA
      SETB SDA
      SETB SCL
      NOP
      LCALL BYTE_FILL
      JC ERRO
      LCALL VERIFY_BYTE_FILL
      JC ERRO
      LCALL PAG_FILL
      JC ERRO
      LCALL VERIFY_PAG_FILL
ERRO:
      SJMP $


PAG_FILL:             ;页写入
      MOV B,#PSIZE
      MOV R0,#BUFFER
X61:
      MOV @R0 ,#FILL
      INC R0
      DJNZ B, X61
      MOV DPTR,#0000H
X62:  MOV ADDRLO,DPL
      MOV ADDRHI,DPH
      MOV R1 ,#PSIZE
      MOV B,#120
X63:  MOV A,#PADDR
      LCALL WRITE_BLOCK
      JNC X64
      DJNZ B,X63
      SETB C
      LJMP X66
X64:  MOV A,DPL
      ADD A,#PSIZE
      MOV DPL,A
      JNC X65
      INC DPH
X65:  CJNE A,#00H,X62
      MOV A,DPH
      CJNE A,#0ffH,X62
      CLR C
X66:  RET

BYTE_FILL:               ;字节写入
      MOV ZDATA,#FILL
      MOV DPTR,#00000H
X51:  MOV ADDRLO,DPL
      MOV ADDRHI,DPH
      MOV B,#120
X52:  MOV A,#PADDR
      LCALL WRITE_BYTE
      JNC X53
      DJNZ B,X52
      SETB C
      LJMP X54
X53:  INC DPTR
      MOV A,DPL
      CJNE A,#00H,X51
      MOV A,DPH
      CJNE A,#01H,X51
      CLR C
X54:  RET

VERIFY_PAG_FILL:         ;页写入校验
      MOV DPTR,#0000H
X71:  MOV ADDRLO,DPL
      MOV ADDRHI,DPH
      MOV R1 ,#PSIZE
      MOV B,#120
X72:  MOV A,#PADDR
      LCALL READ_BLOCK
      JNC X74
      DJNZ B,X72
X73:  SETB C
      LJMP X77
X74:  MOV B,#PSIZE
      MOV R0 ,#BUFFER
X75:  CJNE @R0,#FILL,X73
      INC R0
      DJNZ B, X75
      MOV A,DPL
      ADD A,#PSIZE
      MOV DPL,A
      JNC X76
      INC DPH
X76:  CJNE A,#00H,X71
      MOV A,DPH
      CJNE A,#0ffH,X71
      CLR C
X77:  RET

VERIFY_BYTE_FILL:       ;字节写入校验
      MOV DPTR,#0000H
      MOV ADDRLO,DPL
      MOV ADDRHI,DPH
      MOV B,#120
X81:  MOV A,#PADDR
      LCALL READ_RANDOM
      JNC X82
      DJNZ B,X81
      LJMP X86
X82:  CJNE A,#FILL,X86
      LJMP X85
X83:  MOV A,#PADDR
      LCALL  READ_CURRENT
      JC X87
      CJNE A,#FILL,X86
X85:  INC DPTR
      MOV A,DPH
      CJNE A,#01H,X83
      CLR C
      LJMP X87
X86:  SETB C
X87:  RET

WRITE_BLOCK:       ;块写入
      LCALL START
      JC X38
      RL A
      ORL A,#FADDR
      CLR ACC.0
      LCALL SHOUT
      JC X37
      MOV A,ADDRHI
      LCALL SHOUT
      JC X37
      MOV A,ADDRLO
      LCALL SHOUT
      JC X37
      MOV R0 ,#BUFFER
  X36:MOV A, @R0
      LCALL SHOUT
      JC X37
      INC R0
      DJNZ R1 ,X36
      CLR C
  X37:LCALL STOP
  X38:RET

 WRITE_BYTE:        ;字节写入
      LCALL START
      JC X49
      RL A
      ORL A,#FADDR
      CLR ACC.0
      LCALL SHOUT
      JC X48
      MOV A,ADDRHI
      LCALL SHOUT
      JC X48
      MOV A,ADDRLO
      LCALL SHOUT
      JC X48
      MOV A ,ZDATA
      LCALL SHOUT
      JC X48
      CLR C
  X48:LCALL STOP
  X49:RET

READ_CURRENT:       ;现行地址读
      LCALL START
      JC X45
      RL A
      ORL A,#FADDR
      SETB ACC.0
      LCALL SHOUT
      JC X44
      LCALL SHIN
      LCALL NAK
      CLR C
  X44:LCALL STOP
  X45:RET


 READ_RANDOM:     ;随机读
      PUSH B
      MOV B,A
      LCALL START
      JC X47
      RL A
      ORL A,#FADDR
      CLR ACC.0
      LCALL SHOUT
      JC X46
      MOV A,ADDRHI
      LCALL SHOUT
      JC X46
      MOV A,ADDRLO
      LCALL SHOUT
      JC X46
      MOV A,B
      LCALL READ_CURRENT
      LJMP X47
  X46:LCALL STOP
  X47:POP B
      RET

 READ_BLOCK:        ;序列读
      LCALL START
      JC X35
      RL A
      ORL A,#FADDR
      MOV R0 ,A
      CLR ACC.0
      LCALL SHOUT
      JC X34
      MOV A,ADDRHI
      LCALL SHOUT
      JC X34
      MOV A,ADDRLO
      LCALL SHOUT
      JC X34
      LCALL START
      JC X34
      MOV A,R0
      SETB ACC.0
      LCALL SHOUT
      JC X34
      MOV R0 ,#BUFFER
  X31:LCALL SHIN
      MOV @R0 ,A
      CJNE R1 ,#1,X32
      LCALL NAK
      LJMP  X33
  X32:LCALL ACK
      INC R0
      DJNZ R1 ,X31
 X33: CLR C
 X34: LCALL STOP
 X35: RET

START:SETB SDA
      SETB SCL
      JNB SDA,X40
      JNB SCL,X40
      NOP
      CLR SDA
      NOP
      NOP
      NOP
      NOP
      NOP
      CLR SCL
      CLR C
      LJMP X41
X40:  SETB C
X41:  RET
STOP: CLR SDA
      NOP
      NOP
      SETB SCL
      NOP
      NOP
      NOP
      NOP
      NOP
      SETB SDA
      RET
SHOUT:PUSH B
      MOV B,#8
X42:  RLC A
      MOV SDA,C
      NOP
      SETB SCL
      NOP
      NOP
      NOP
      NOP
      CLR SCL
      DJNZ B,X42
      SETB SDA
      NOP
      NOP
      SETB SCL
      NOP
      NOP
      NOP
      NOP
      MOV C,SDA
      CLR SCL
      POP B
      RET
SHIN: SETB SDA
      PUSH B
      MOV B,#8
X43:  NOP
      NOP
      NOP
      SETB SCL
      NOP
      NOP
      MOV C,SDA
      RLC A
      CLR SCL
      DJNZ B,X43
      POP B
      RET
ACK:  CLR SDA
      NOP
      NOP
      SETB SCL
      NOP
      NOP
      NOP
      NOP
      CLR SCL
      RET
NAK:  SETB SDA
      NOP
      NOP
      SETB SCL
      NOP
      NOP
      NOP
      NOP
      CLR SCL
      RET
      END

⌨️ 快捷键说明

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