📄 eepromttt.asm
字号:
org 0000h
ajmp MAIN
org 0040h
;EepromRGDefine
;声明特殊功能寄存器地址
ISP_DATA EQU 0E2H
ISP_ADDRH EQU 0E3H
ISP_ADDRL EQU 0E4H
ISP_CMD EQU 0E5H
ISP_TRIG EQU 0E6H
ISP_CONTR EQU 0E7H
;定义ISP/IAP命令及等待时间
ISP_IAP_BYTE_READ EQU 1 ;字节读
ISP_IAP_BYTE_PROGRAM EQU 2 ;字节编程,前提是该字节是空,0FFh
ISP_IAP_BYTE_ERASE EQU 3 ; 扇区擦除,要某字节为空,要擦一扇区
ISP_IAP_WAIT_TIME EQU 0 ;设置等待时间,40MHz以下0,20MHz以下1,10MHz以下2,5M以下3
MAIN: JNB P1.4, TT0
JNB P1.5, TT3
JNB P1.6, TT4
JB P1.4, TT1
LJMP MAIN
TT3: MOV R3, #20H
MOV R2, #00H
LCALL sub_Flash_Clr
SETB P0.6
LJMP MAIN
TT4: MOV R3, #20H
MOV R2, #01H
MOV A, #0F0H
JNB P0.6, TT4OVER
LCALL sub_Flash_WrB
CLR P0.6
TT4OVER:LJMP MAIN
TT0: MOV R3, #20H
MOV R2, #01H
MOV A, #00H
JNB P0.0, TT0OVER
LCALL sub_Flash_RdB
CJNE A, #0F0H, TT2
CLR P0.0
SETB P0.7
TT0OVER:LJMP MAIN
TT2: SETB P0.0
CJNE A, #0FFH, TT2OVER
CLR P0.7
TT2OVER:LJMP MAIN
TT1: SETB P0.0
LJMP MAIN
sub_Flash_RdB: MOV ISP_ADDRH, R3 ;送地址高字节
MOV ISP_ADDRL, R2 ;送地址低字节
CLR EA ;关中断,此时各种中断请求会被挂起来,一开中断,立即相应
MOV ISP_CONTR, #ISP_IAP_WAIT_TIME ;设置等待时间
ORL ISP_CONTR, #10000000B ;允许ispiap操作
MOV ISP_CMD, #ISP_IAP_BYTE_READ ;送字节读命令
MOV ISP_TRIG, #46H ;先送46h,再送b9h到触发器
MOV ISP_TRIG, #0B9H ;送完b9h,ispiap命令立即触发启动
NOP ;数据读出到ISP_DATA寄存器后,cpu继续执行程序
MOV ISP_CONTR, #00000000B ;禁止ispiap操作
MOV ISP_CMD, #00000000B ;去除ispiap命令
MOV ISP_TRIG, #00000000B ;防止ispiap命令误触发
MOV ISP_ADDRH, #0FFH ;送地址高字节单元为FF,防止误操作
MOV ISP_ADDRL, #0FFH ;送地址低字节单元为FF,防止误操作
SETB EA ;开中断,cpu处理完ispiap动作即可开中断
MOV A, ISP_DATA ;将读出的数据送往A
RET ;子程序返回
sub_Flash_WrB: MOV ISP_DATA, A ;从A送字节数据到ISP_DATA寄存器
MOV ISP_ADDRH, R3 ;送地址高字节
MOV ISP_ADDRL, R2 ;送地址低字节
CLR EA ;关中断,此时各种中断请求会被挂起来,一开中断,立即相应
MOV ISP_CONTR, #ISP_IAP_WAIT_TIME ;设置等待时间
ORL ISP_CONTR, #10000000B ;允许ispiap操作
MOV ISP_CMD, #ISP_IAP_BYTE_PROGRAM ;送字节写命令
MOV ISP_TRIG, #46H ;先送46h,再送b9h到触发器
MOV ISP_TRIG, #0B9H ;送完b9h,ispiap命令立即触发启动
NOP ;数据写入成功后,cpu继续执行程序
MOV ISP_CONTR, #00000000B ;禁止ispiap操作
MOV ISP_CMD, #00000000B ;去除ispiap命令
MOV ISP_TRIG, #00000000B ;防止ispiap命令误触发
MOV ISP_ADDRH, #0FFH ;送地址高字节单元为FF,防止误操作
MOV ISP_ADDRL, #0FFH ;送地址低字节单元为FF,防止误操作
SETB EA ;开中断,cpu处理完ispiap动作即可开中断
RET ;子程序返回
sub_Flash_Clr: MOV ISP_ADDRH, R3 ;送扇区起始地址高字节
MOV ISP_ADDRL, R2 ;送扇区起始地址低字节
CLR EA ;关中断,此时各种中断请求会被挂起来,一开中断,立即相应
MOV ISP_CONTR, #ISP_IAP_WAIT_TIME ;设置等待时间
ORL ISP_CONTR, #10000000B ;允许ispiap操作
MOV ISP_CMD, #ISP_IAP_BYTE_ERASE ;送扇区擦除命令
MOV ISP_TRIG, #46H ;先送46h,再送b9h到触发器
MOV ISP_TRIG, #0B9H ;送完b9h,ispiap命令立即触发启动
NOP ;扇区擦除成功后,cpu继续执行程序
MOV ISP_CONTR, #00000000B ;禁止ispiap操作
MOV ISP_CMD, #00000000B ;去除ispiap命令
MOV ISP_TRIG, #00000000B ;防止ispiap命令误触发
MOV ISP_ADDRH, #0FFH ;送地址高字节单元为FF,防止误操作
MOV ISP_ADDRL, #0FFH ;送地址低字节单元为FF,防止误操作
SETB EA ;开中断,cpu处理完ispiap动作即可开中断
RET ;子程序返回
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -