📄
字号:
;************************************************
; STC89C5XRC/RD+ 系列单片机 闪存功能程序
;************************************************
; 1) 闪存到外存 MOV_EEPROM_EXRAM
; 2) 外存到闪存 MOV_EXRAM_EEPROM
; 3) 清缓存 QHC
; 4) 建立修正表 madeXZB
; 5) 修正表送外存 MOV_code_EXRAM
;------------------------------------------------
; 闪存 = 8000H--807FH
; 外存 = 0280H--02FFH
; 须有 "音量修正表(TAB_YLXZB)" 存在
;************************************************
PROC MOV_EEPROM_EXRAM,MOV_EXRAM_EEPROM
;************************************************
; 闪存到外存
;************************************************
MOV_EEPROM_EXRAM:
PUSH PSW
PUSH ACC
PUSH AUXR1
MOV AUXR1,#0 ;选DPTR
PUSH DPH
PUSH DPL
INC AUXR1 ;换DPTR
PUSH DPH
PUSH DPL
MOV ACC,R7
PUSH ACC
;-----------
MOV AUXR1,#0 ;选DPTR
MOV DPTR,#EEPROM_ADD ;EEPROM
INC AUXR1 ;换DPTR
MOV DPTR,#EXRAM_ADD ;EXRAM
MOV R7,#FlashAmount ;数量
MEEX1:
MOV AUXR1,#0 ;回DPTR
LCALL byte_read ;读字节
INC DPTR
INC AUXR1 ;换DPTR
MOVX @DPTR,A
INC DPTR
DJNZ R7,MEEX1
;-----------
POP ACC
MOV R7,A
MOV AUXR1,#1 ;选DPTR
POP DPL
POP DPH
INC AUXR1 ;换DPTR
POP DPL
POP DPH
POP AUXR1
POP ACC
POP PSW
RET
;************************************************
; 外存到闪存
;************************************************
;EEPROM_ADD=8000H--807FH
;XRAM_ADD =0280H--02FFH
;------------------------------------------------
MOV_EXRAM_EEPROM:
PUSH PSW
PUSH ACC
PUSH AUXR1
MOV AUXR1,#0 ;选DPTR
PUSH DPH
PUSH DPL
INC AUXR1 ;换DPTR
PUSH DPH
PUSH DPL
MOV ACC,R7
PUSH ACC
;-----------
MOV AUXR1,#0 ;选DPTR
MOV DPTR,#EEPROM_ADD ;EEPROM
LCALL sector_erase ;擦除扇区
INC AUXR1 ;换DPTR
MOV DPTR,#EXRAM_ADD ;EXRAM
MOV R7,#FlashAmount ;数量
MEXE1:
MOV AUXR1,#1 ;换DPTR
MOVX A,@DPTR
INC DPTR
INC AUXR1 ;回DPTR0
LCALL byte_program ;字节编程
INC DPTR
DJNZ R7,MEXE1
;-----------
POP ACC
MOV R7,A
MOV AUXR1,#1 ;选DPTR
POP DPL
POP DPH
INC AUXR1 ;换DPTR
POP DPL
POP DPH
POP AUXR1
POP ACC
POP PSW
RET
;************************************************
; 读字节
;************************************************
;入口:DPTR = 字节地址
;返回:A = 读出字节
;------------------------------------------------
byte_read:
MOV ISP_CONTR,#ENABLE_ISP ;打开 IAP 功能, 设置 Flash 操作等待时间
MOV ISP_CMD,#01 ;Select Read AP Mode
MOV ISP_ADDRH,DPH ;Fill page address in ISP_ADDRH & ISP_ADDRL
MOV ISP_ADDRL,DPL
CLR EA
MOV ISP_TRIG,#46H ;Trigger ISP processing
MOV ISP_TRIG,#0B9H ;Trigger ISP processing
NOP
MOV A,ISP_DATA ;数据在ISP_DATA
SETB EA
LCALL IAP_Disable ;关闭 IAP 功能, 清与 ISP 有关的特殊功能寄存器
RET
;************************************************
; 擦除扇区
;************************************************
;入口:DPTR = 扇区地址
;------------------------------------------------
sector_erase:
MOV ISP_CONTR,#ENABLE_ISP ;打开 IAP 功能, 设置 Flash 操作等待时间
MOV ISP_CMD,#03H ;Select Page Erase Mode
MOV ISP_ADDRH,DPH ;Fill page address in ISP_ADDRH & ISP_ADDRL
MOV ISP_ADDRL,DPL
LCALL trigger_ISP ;触发起动 ISP
LCALL IAP_Disable ;关闭 IAP 功能, 清与 ISP 有关的特殊功能寄存器
RET
;************************************************
; 字节编程
;************************************************
;入口:DPTR = 字节地址, A= 须编程字节的数据
;------------------------------------------------
byte_program:
MOV ISP_CONTR,#ENABLE_ISP ;打开 IAP 功能, 设置 Flash 操作等待时间
MOV ISP_CMD,#02H ;Select Byte Program Mode
MOV ISP_ADDRH,DPH ;Fill page address in ISP_ADDRH & ISP_ADDRL
MOV ISP_ADDRL,DPL
MOV ISP_DATA,A ;数据进ISP_DATA
LCALL trigger_ISP ;触发起动 ISP
LCALL IAP_Disable ;关闭 IAP 功能, 清与 ISP 有关的特殊功能寄存器
RET
;************************************************
; 触发起动 ISP
;************************************************
trigger_ISP:
CLR EA
MOV ISP_TRIG,#46H ;Trigger ISP processing
MOV ISP_TRIG,#0B9H ;Trigger ISP processing
NOP
SETB EA
RET
;************************************************
; 关闭 IAP 功能
;************************************************
IAP_Disable:
MOV ISP_CONTR,#0 ;清与 ISP 有关的特殊功能寄存器
MOV ISP_CMD,#0
MOV ISP_TRIG,#0
RET
;************************************************
END
;************************************************
; 清缓存
;************************************************
PROC QHC
QHC:
PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
MOV A,R7
PUSH ACC
MOV DPTR,#EXRAM_ADD
MOV R7,#FlashAmount
QHC1:
MOV A,#0
MOVX @DPTR,A ;清缓存
INC DPTR
DJNZ R7,QHC1
POP ACC
MOV R7,A
POP DPL
POP DPH
POP ACC
POP PSW
RET
END
;************************************************
; 建立修正表
;************************************************
PROC madeXZB
madeXZB:
PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
MOV A,R7
PUSH ACC
;--------
LCALL MOV_EEPROM_EXRAM ;读闪存
MOV DPTR,#EXRAM_ADD ;头数据地址首
MOV R7,#21
madeXZBT:
MOVX A,@DPTR
INC DPTR
CJNE A,#60H,madeXZB1
DJNZ R7,madeXZBT
;-----------------
MOV DPTR,#EXRAM_END_ADD-19+1;尾数据地址首
MOV R7,#19
madeXZBW:
MOVX A,@DPTR
INC DPTR
CJNE A,#60H,madeXZB1
DJNZ R7,madeXZBW
;-----------------
;己经有修正表
LJMP madeXZB3
madeXZB1:
;无修正表
LCALL MOV_code_EXRAM ;读修正表
LCALL MOV_EXRAM_EEPROM ;写闪存
LCALL MOV_EEPROM_EXRAM ;读闪存
A1234567:;???????????????????
LCALL FWY;?????????????????????
LJMP A1234567;?????????????????
madeXZB3:
;--------
POP ACC
MOV R7,A
POP DPL
POP DPH
POP ACC
POP PSW
RET
END
;************************************************
; 读修正表
;************************************************
PROC MOV_code_EXRAM
MOV_code_EXRAM:
PUSH PSW
PUSH ACC
PUSH AUXR1
MOV AUXR1,#0 ;选DPTR
PUSH DPH
PUSH DPL
INC AUXR1 ;换DPTR
PUSH DPH
PUSH DPL
MOV ACC,R7
PUSH ACC
MOV AUXR1,#0 ;选DPTR
MOV DPTR,#TAB_YLXZB ;音量修正表
INC AUXR1 ;换DPTR
MOV DPTR,#EXRAM_ADD ;EXRAM
MOV R7,#FlashAmount ;数量
MCEX1:
MOV AUXR1,#0 ;回DPTR
MOV A,#0
MOVC A,@A+DPTR ;读音量修正表
INC DPTR
INC AUXR1 ;换DPTR
MOVX @DPTR,A
INC DPTR
DJNZ R7,MCEX1
POP ACC
MOV R7,A
MOV AUXR1,#1 ;选DPTR
POP DPL
POP DPH
INC AUXR1 ;换DPTR
POP DPL
POP DPH
POP AUXR1
POP ACC
POP PSW
RET
END
;************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -