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