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

📄 eeprom.asm

📁 stc的资料
💻 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 + -