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

📄 eeprom.inc

📁 单片机LPC932的EEPROM读写程序
💻 INC
字号:
;EEPROM_Event:
;	JB	EEIF,have_data
;	RETI
;have_data:	CLR	EEIF
;	SETB	EE_PROM_FLAG
;	RETI
;-----------------------------------------------------------------------	
;Read_EEPROM:
;	ANL	PCONA,#10111111B
;	LCALL	Delay50us
;	MOV	A,#00H
;	MOV	ACC.0,C
;	MOV	DEECON,A
;	SETB	EA
;	SETB	EEIE
;Continue_Read_EEPROM:
;	ANL	DEECON,#01111111B
;	MOV	DEEADR,R1
;	NOP	
;	JNB	EE_PROM_FLAG,$
;	CLR	EE_PROM_FLAG
;	MOV	@R0,DEEDAT	
;	INC	R0
;	INC	R1
;	DJNZ	R3,Continue_Read_EEPROM
;	RET		
;-----------------------------------------------------------------------

;**********************************************************************
; 数据EEPROM

;   数据寄存器(DEEDAT)用于写入或读出数据EEPROM

;LPC932拥有512个字节的片内数据EEPROM;它们可用于保存配置参数;数据EEPROM

;由SFR控制,可字节读,字节写以及可擦除(通过行填充和块填充);用户通过3个SFR

;和1个中断对其进行读,写和填充:

;   地址寄存器(DEEADR)用于地址位7-0(最高位EADR8位于DEECON寄存器)

;   控制寄存器(DEECON)用于地址位8,设置操作模式以及状态位(见图17.1)
;=======================================================================
;数据EEPROM控制寄存器
;-------------------------------------------
;DEECON地址:F1H

;不可位寻址 		 7     6     5    4     3  2  1   0

;复位源:    任何复位	EEIF HVERR ECTL1 ECTL0  -  -  -  EADR8

;复位值:    0x00xxx0B

;位	    符号	功能

;DEECON.7   EEIF	数据EEPROM中断标志;当读或写操作完成时该位置位;

;			由软件清零

;DEECON.6   HVERR	高压错误;表示在编程或擦除时编程电压出错

;DEECON.5-4 ECTL1,ECTL0 操作模式选择

;	    ECTL1,ECTL0 操作模式

;	    00		字节读/写模式

;	    10		行(64 字节)填充

;	    11		块(512 字节)填充

;DEECON3-1  -		保留将来之用;用户程序请勿将其置1

;DEECON.0   EADR8	数据EEPROM 地址最高位;EADR7-0 位于DEEADR 中
;=======================================================================
;字节模式: 在该模式中,一次可以读和写一个字节数据;数据存放在DEEDAT寄存器

;	   而地址在DEEADR 寄存器中。

;行填充:   在该模式中,被寻址的行(64字节,地址DEEADR.5-0被忽略)按照DEEDAT

;          的格式填充;要将整个行都擦除为00h或将整个行编程为FFh,需要在执

;          行行填充之前将00h或FFh写入DEEDAT。

;块填充:   在该模式中,所有512个字节都按照DEEDAT的格式填充;为了将整个块

;          都擦除为00h或将整个块编程为FFh,需要在进行块填充之前将00h或

;          FFh写入DEEDAT;使用该命令之前EADR8 必须为1

;    在任何模式中,操作完成之后硬件都会置位EEIF位;如果IEN1.7和EA都置位,将

;产生中断请求;EEIF位通过软件清零
;=======================================================================
;数据EEPROM读
;字节的读取可通过查询或中断进行:

;1.  将DEECON中的ECTL1-0(DEECON.5-4)写为00并将正确的地址第8位写入EADR8

;    (注:如果正确的值已写入DEECON,就不再需要对该寄存器进行写操作)

;2.  不需要对DEEDAT进行写操作,将地址位7-0写入DEEADR。

;3.  如果EIEE(IEN1.7)和EA(IEN0.7)都为1,等待中断,然后读取/查询EEIF

;    (DEECON.7)位直到它变为1;如果EIEE或EA为0,中断被禁止,就只能使用查询

;    的方式

;4.  从DEEDAT寄存器读出EEPROM数据

;注: 如果在写DEEADR之前(如果DEECON.5-4=00)执行了写DEEDAT操作,将开始执行

;    对EEPROM的写操作;用户必须注意在读操作时避免出现这样的情况
;=======================================================================
;C=	地址第8位
;@R1=	读出EEPROM地址
;@R0=	读出DATA地址
;R3=	字节数
	RSEG	Seg_Prog
Read_EEPROM:
	CLR	EA
	ANL	PCONA,#10111111B
	LCALL	Delay50us
	MOV	A,#00000000B
	MOV	ACC.0,C
	MOV	DEECON,A
Continue_Read_EEPROM:
	ANL	DEECON,#01111111B
	MOV	DEEADR,R1
	NOP
Read_Wait_EEIF:
	MOV	A,DEECON
	JNB	ACC.7,Read_Wait_EEIF
	ANL	DEECON,#01111111B
	MOV	@R0,DEEDAT
	INC	R0
	INC	R1
	DJNZ	R3,Continue_Read_EEPROM
	ORL	PCONA,#01000000B	
	RET	
;=======================================================================
;数据EEPROM写

;字节的写入可通过查询或中断进行:

;1.  将DEECON中的ECTL1-0(DEECON.5-4)写为00并将正确的地址第8位写入EADR8

;    (注: 如果正确的值已写入DEECON,就不再需要对该寄存器进行写操作)

;2.  将数据写入DEEDAT

;3.  将地址位7-0写入DEEADR

;4.  如果EIEE(IEN1.7)和EA(IEN0.7)都为1,等待中断,然后读取/查询EEIF

;    (DEECON.7)位直到它变为1;如果EIEE或EA为0,中断被禁止,就只能使用查询

;    的方式;当EEIF为1时,操作完成,数据被写入

;5.  检查HVERR位:如果HVERR标志置位,则返回到步骤2

;    由于在写入DEEDAT寄存器后写DEEADR寄存器将立即执行写操作(如果

;    DEECON.5-4=00),因此用户在写DEEDAT寄存器的时候必须非常小心;

;    强烈建议用户在写DEEDAT寄存器之前禁止中断并在所有写操作执行完毕之后

;    重新使能中断;例如:

;	CLR EA ; 禁止中断

;	MOV DEEDAT,@R0	;写入数据格式

;	MOV DEEADR,@R1	;写入地址

;	SETB EA		;使能中断,

;    如果IEN1.7(EEIE)位置位,则等待中断并查询DEECON.7(EEIF)

;    另外,在掉电时有可能需要将一些信息保存到EEPROM;这样在电压跌落之前

;处理器只有30ms 执行时间;在电源关闭之时有可能刚好产生中断,这时器件不是

;将信息保存到EEPROM中,而是先跳转到中断服务程序;由于ISR 长度的不同,有可

;能无法及时退出ISR来完成EEPROM的写操作;那么在下次上电时,数据看上去像是

;出错了-因为它根本就没有被写进去;因此要保证信息掉电保存这部分代码拥有

;系统的最高优先级;
;=======================================================================
;C=	地址第8位
;@R1=	写入EEPROM地址
;@R0=	写入DATA地址
;R3=	字节数

Write_EEPROM:
	CLR	EA
	ANL	PCONA,#10111111B
	LCALL	Delay50us
	MOV	A,#00000000B
	MOV	ACC.0,C
	MOV	DEECON,A
Continue_Write_EEPROM:
	ANL	DEECON,#01111111B
	MOV	DEEDAT,@R0
	MOV	DEEADR,R1
	NOP
Write_Wait_EEIF:
	MOV	A,DEECON
	JB	ACC.6,Write_CLR_HVERR
	JNB	ACC.7,Write_Wait_EEIF
	ANL	DEECON,#01111111B	
	INC	R0
	INC	R1
	DJNZ	R3,Continue_Write_EEPROM
	ORL	PCONA,#01000000B
	RET
Write_CLR_HVERR:
	ANL	DEECON,#10111111B
	JMP	Continue_Write_EEPROM
	NOP
	NOP
;-----------------------------------------------------------------------
Read_EEPROM_RBWtr:			;剩余水量带校验码读共4字节
	MOV	R0,#RBWtr+0
	CLR	C
	MOV	R1,#RBWtr_EEPROM	;剩余水量的EE地址
	MOV	R3,#4
	LCALL	Read_EEPROM
	RET
Read_EEPROM_Flux:			;流量带校验码读共5字节
	MOV	R0,#Flux+0
	CLR	C
	MOV	R1,#Flux_EEPROM
	MOV	R3,#5
	LCALL	Read_EEPROM
	RET
Read_EEPROM_Floor:			;楼门号带校验码读共5字节
	MOV	R0,#Floor_ID
	CLR	C
	MOV	R1,#Floor_EEPROM_ID
	MOV	R3,#5
	LCALL	Read_EEPROM
	RET
	
Read_EEPROM_ReFlux:
	MOV	R0,#ReFlux
	CLR	C
	MOV	R1,#REflux_eeprom
	MOV	R3,#5
	LCALL	Read_EEPROM
	RET	

Read_EEPROM_7_day_vol:
	MOV	R0,#Vol_7_Date
	CLR	C
	MOV	R1,#Vol_7_Date_EE
	MOV	R3,#30
	LCALL	Read_EEPROM
	RET		

Read_EE_Deal_Code_Byte:
	MOV	R0,#Deal_code_Byte
	CLR	C
	MOV	R1,#Deal_code_Byte_EE
	MOV	R3,#10
	LCALL	Read_EEPROM
	RET	

Read_EEPROM_PassWord:
	MOV	R0,#IC_PassWord_Adr
	CLR	C
	MOV	R1,#IC_PassWord_Adr_EE
	MOV	R3,#6
	LCALL	Read_EEPROM
	RET
;=======================================================================
Write_EEPROM_RBWtr:		;写剩余水量包括CRC  总字节数=2+2=4
	MOV	R0,#RBWtr+0
	CLR	C
	MOV	R1,#RBWtr_EEPROM
	MOV	R3,#4
	LCALL	Write_EEPROM
	RET

Write_EEPROM_Flux:		;写流量包括CRC 总字节数=3+2=5
	MOV	R0,#Flux+0
	CLR	C
	MOV	R1,#Flux_EEPROM
	MOV	R3,#5
	LCALL	Write_EEPROM
	RET

Write_EEPROM_Floor:		;写门栋号包括CRC  总字节数=3+2=5
	MOV	R0,#Floor_ID
	CLR	C
	MOV	R1,#Floor_EEPROM_ID
	MOV	R3,#5
	LCALL	Write_EEPROM
	RET
	
Write_EEPROM_ReFlux:
	MOV	R0,#ReFlux
	CLR	C
	MOV	R1,#REflux_eeprom
	MOV	R3,#5
	LCALL	Write_EEPROM
	RET

Write_EEPROM_7_day_vol:
	MOV	R0,#Vol_7_Date
	CLR	C
	MOV	R1,#Vol_7_Date_EE
	MOV	R3,#30
	LCALL	Write_EEPROM
	RET
Write_EE_Deal_Code_Byte:
	MOV	R0,#Deal_code_Byte
	CLR	C
	MOV	R1,#Deal_code_Byte_EE
	MOV	R3,#10
	LCALL	Write_EEPROM
	RET	
Write_EEPROM_Operator_ID:
	MOV	R0,#Operator_ID
	CLR	C
	MOV	R1,#Operator_ID_EE
	MOV	R3,#5
	LCALL	Write_EEPROM
	RET

Write_EEPROM_PassWord:
	MOV	R0,#IC_PassWord_Adr
	CLR	C
	MOV	R1,#IC_PassWord_Adr_EE
	MOV	R3,#6
	LCALL	Write_EEPROM
	RET	
;========================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -