📄 eeprom.asm
字号:
;声明IAP/ISP/EEPROM有关的特殊功能寄存器的地址
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 01h ;字节读
isp_iap_byte_program equ 02h ;字节编程,可以将1写成0,
;要将1写成0,必须执行字节编程
isp_iap_sector_erase equ 03h ;扇区擦除,可以将0写成1
;要将0写成1,必须擦除整个扇区
;定义FASH操作等待时间及允许IAP/ISP/EEPROM操作的常数
;enable_isp equ 80h ;系统时钟<30MHz时,对ISP_CONTR设值
;enable_isp equ 81h ;系统时钟<24MHz时,对ISP_CONTR设值
;enable_isp equ 82h ;系统时钟<20MHz时,对ISP_CONTR设值
;enable_isp equ 83h ;系统时钟<12MHz时,对ISP_CONTR设值
;enable_isp equ 84h ;系统时钟<6MHz时,对ISP_CONTR设值
;enable_isp equ 85h ;系统时钟<3MHz时,对ISP_CONTR设值
;enable_isp equ 86h ;系统时钟<2MHz时,对ISP_CONTR设值
enable_isp equ 87h ;系统时钟<1MHz时,对ISP_CONTR设值
debug_data equ 5ah ;测试程序选定EEPROM单元的数值如正确
;应等于的数值
;选择MCU型号
data_flash_start_address equ 1000h ;STC12C2052AD系列单片机的EEPROM
;测试起始地址
;data_flash_start_address equ 2800h ;STC12C2052AD系列单片机的EEPROM
;测试起始地址
org 0000h
ajmp main
org 0100h
main: mov p1,#0f0h ;演试程序
acall delay
mov p1,#0fh ;
acall delay
mov sp,#7fh
;将EEPROM测试地址单元的内容读出
main1: mov dptr,#data_flash_start_address ;将EEPROM测试地址送DPTR
;字节地址对应EEPROM地址
;可以更改,每扇区512字节
;不可字节单擦除,只能整
;扇区擦除
acall byte_read
mov 40h,a
cjne a,#debug_data,data_not_equ_debug_data ;数据不对,就跳
data_is_debug_data: mov p1,#7fh,
acall delay
mov a,40h ;将EEPROMM送A
cpl a
mov p1,a
wait1: sjmp wait1
data_not_equ_debug_data:
;EEPROM里的错,点亮一灯,关显示,
;再将该EEPROM所在扇区整个擦除,将正确数写入
mov p1,#0fh
acall delay
mov a,40h
cpl a
mov p1,a
acall delay
mov dptr,#data_flash_start_address
acall sector_erase ;擦除整个扇区
mov a,#debug_data
acall byte_program ;字节编程
mov p1,#1101111b
wait2: sjmp wait2
;读一字节,调用前需打开IAP功能,入口:DPTR=字节地址,返回A=读出
;字节
byte_read: mov isp_contr,#enable_isp ;打开IAP功能,设置FLASH操作等待
;时间
mov isp_cmd,#isp_iap_byte_read ;设置为IAP-ISP-EEPROM
;字节读模式命令。
mov isp_addrh,dph ;目标单元地址的高8位地址设置
mov isp_addrl,dpl ;目标单元地址的低8位地址设置
mov isp_trig,#46h ;先送46H,
mov isp_trig,#0b9h ;再送0b9H,ISP-IAP命令被触发启动
nop
mov a,isp_data ;读出的数据在ISP_DATA单元中,送入累加器A
acall IAP_disable ;关闭IAP功能,清相关的特殊功能寄存器,
;使CPU处于安全状态,一次连续的IAP操作完
;成之后建议关闭IAP功能,不需要次都关
ret
byte_program: ;字节编程,调用前需打开IAP功能,入口:DAPT=字节地址,A=须编程
;字节数据
mov isp_contr,#enable_isp ;打开IAP
mov isp_cmd,#isp_iap_byte_program ;字节编程模式
mov isp_addrh,dph
mov isp_addrl,dpl
mov isp_data,a
mov isp_trig,#46h
mov isp_trig,#0b9h
nop
acall iap_disable
ret
sector_erase: ;擦除整个扇区
mov isp_contr,#enable_isp
mov isp_cmd,#03h ;擦除模式
mov isp_addrh,dph
mov isp_addrl,dpl
mov isp_trig,#46h
mov isp_trig,#0b9h
nop
acall iap_disable
ret
iap_disable: ;关闭IAP功能
mov isp_contr,#0
mov isp_cmd,#0
mov isp_trig,#0
ret
delay: nop
nop
nop
ret
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -