📄 iap_lite.inc
字号:
; 文件名:IAP_LITE.IN
; 功能:实现IAP_Lite功能,进行字节擦除编程操作
; 日期:2003.11.03
; 说明:
; 定义页宽度屏蔽字(16字节时为0FH,64字节时为3FH)
PAGE_SIZE EQU 3FH
; IAP_Lite相关寄存器定义
FMADRH DATA 0E7H
FMADRL DATA 0E6H
FMCON DATA 0E4H
FMDATA DATA 0E5H
; 定义FLASH控制命令字
LOAD EQU 00H ; 加载数据
PROG EQU 48H ; 编程
ERS_PROG EQU 68H ; 擦除编程
ERS_S EQU 71H ; 擦除扇区
ERS_P EQU 70H ; 擦除页
; 名称:FLASH_WRBYTE
; 功能:写字节数据
; 入口参数:ACC 所要写入的数据
; DPTR 要写入的地址
; 出口参数:C置位时表示错误,清零时表示无错误
; 占用资源:ACC、DPTR、C位
FLASH_WRBYTE:
MOV FMCON,#LOAD ; 设置加载数据命令
MOV FMADRH,DPH ; 设置写入地址
MOV FMADRL,DPL
MOV FMDATA,A ; 写入数据
MOV FMCON,#ERS_PROG ; 擦除编程
MOV A,FMCON ; 读取操作状态字
ANL A,#0FH
CLR C
JZ FLASH_WRBEND ; 判断操作是否出错
SETB C ; 若出错,则置位C位
FLASH_WRBEND: RET
; 名称:FLASH_RDBYTE
; 功能:读字节数据
; 入口参数:DPTR 要写入的地址
; 出口参数:读出数据在ACC
; 占用资源:ACC、DPTR、C位
FLASH_RDBYTE:
CLR A
MOVC A,@A+DPTR
RET
; 名称:FLASH_WRNBYTE
; 功能:连续写多字节数据
; 入口参数:R1 RAM中数据缓冲区的指针
; R7 所要写入的数据个数
; DPTR 要写入的起始地址
; 出口参数:C置位时表示错误,清零时表示无错误
; 占用资源:ACC、R1、R7、DPTR、C位
; 说明:程序已自动处理页问题(页翻转)
FLASH_WRNBYTE:
CLR C
MOV A,R7 ; 若写入个数为0,直接退出
JZ FLASH_WRNBEND
FLASH_WRNBL1: MOV FMCON,#LOAD ; 设置加载数据命令
MOV FMADRH,DPH ; 设置写入地址
MOV FMADRL,DPL
FLASH_WRNBL2: MOV FMDATA,@R1 ; 取出数据并写入FMDATA
INC R1
INC DPTR ; 地址加1
MOV A,DPL
ANL A,#PAGE_SIZE
JZ FLASH_WRNBL3 ; 若已写满一页,则执行擦除编程操作
DJNZ R7,FLASH_WRNBL2
MOV FMCON,#ERS_PROG ; 擦除编程
MOV A,FMCON ; 读取操作状态字
ANL A,#0FH
JZ FLASH_WRNBEND ; 判断操作是否出错
SETB C ; 若出错,则置位C位
FLASH_WRNBEND: RET
FLASH_WRNBL3: MOV FMCON,#ERS_PROG ; 擦除编程
MOV A,FMCON ; 读取操作状态字
ANL A,#0FH
JZ FLASH_WRNBL4 ; 重新编程下一页数据
SETB C ; 若出错,则置位C位
RET ; 退出
FLASH_WRNBL4: DJNZ R7,FLASH_WRNBL1 ; 判断是否写完数据
RET
; 名称:FLASH_RDNBYTE
; 功能:连续读多字节数据
; 入口参数:R0 RAM中数据缓冲区的指针
; R7 所要读取的数据个数
; DPTR 要读取的起始地址
; 出口参数:无
; 占用资源:ACC、R0、R7、DPTR
FLASH_RDNBYTE:
MOV A,R7
JZ FLASH_RDNBEND
FLASH_RDNBL1: CLR A
MOVC A,@A+DPTR ; 读取数据
MOV @R0,A ; 保存数据到缓冲区
INC R0
INC DPTR ; 指向下一地址
DJNZ R7,FLASH_RDNBL1 ; 判断是否读完数据
FLASH_RDNBEND: RET
; 名称:ERASE_SECTOR
; 功能:扇区擦除
; 入口参数:DPTR 扇区地址
; 出口参数:C置位时表示错误,清零时表示无错误
; 占用资源:ACC、DPTR、C位
ERASE_SECTOR: MOV FMADRH,DPH ; 设置扇区地址(高字节)
MOV FMADRL,DPL ; 设置扇区地址(低字节)
MOV FMCON,#ERS_S ; 设置命令字ERS_S,擦除扇区
MOV A,FMCON ; 读取操作状态字
ANL A,#0FH
CLR C
JZ ERASES_END
SETB C ; 若出错,则置位C位
ERASES_END: RET ; 退出
; 名称:ERASE_PAGE
; 功能:页擦除
; 入口参数:DPTR 页地址
; 出口参数:C置位时表示错误,清零时表示无错误
; 占用资源:ACC、DPTR、C位
ERASE_PAGE: MOV FMADRH,DPH ; 设置页地址(高字节)
MOV FMADRL,DPL ; 设置页地址(低字节)
MOV FMCON,#ERS_P ; 设置命令字ERS_P,擦除扇区
MOV A,FMCON ; 读取操作状态字
ANL A,#0FH
CLR C
JZ ERASEP_END
SETB C ; 若出错,则置位C位
ERASEP_END: RET ; 退出
; 名称:FILL_PAGE
; 功能:页填充
; 入口参数:A 所要填充的数据
; DPTR 页地址
; 出口参数:C置位时表示错误,清零时表示无错误
; 占用资源:ACC、R7、DPTR、C位
; 说明:使用前要先擦除扇区
FILL_PAGE: PUSH ACC ; 保存
MOV A,#PAGE_SIZE ; 计算出一页的字节个数
INC A
MOV R7,A
MOV A,#PAGE_SIZE
CPL A
ANL A,DPL ; 设置页起始地址
MOV FMADRH,DPH ; 设置扇区地址(高字节)
MOV FMADRL,A ; 设置扇区地址(低字节)
MOV FMCON,#LOAD
POP ACC
FILLP_L1: MOV FMDATA,A
DJNZ R7,FILLP_L1
MOV FMCON,#PROG ; 设置页编程操作
MOV A,FMCON ; 读取操作状态字
ANL A,#0FH
CLR C
JZ FILLP_END
SETB C ; 若出错,则置位C位
FILLP_END: RET ; 退出
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -