📄 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 + -