;;;這是STC15W系列的 匯編語言編寫的 停電保存數據,上電恢復數據 部分的程序
;;;在 STC12C系列 上有使用過,
;;; STC8F2K08S2 可以對比一下幾個相關寄存器地址是否一致,一致可以直接使用
;;;用C語言的沒有
; / *** *** *** *** *** *** / CPU STC15W404AS
; / *** *** *** *** *** *** / 12.000MHz
WDT_CONTR EQU 0C1H ; 看門狗
ISP_DATA EQU 0C2H ; EEPROM 數據寄存器
ISP_ADDRH EQU 0C3H ; 地址寄存器H
ISP_ADDRL EQU 0C4H ; 地址寄存器L
ISP_CMD EQU 0C5H ; 命令寄存器
ISP_TRIG EQU 0C6H ; 觸發寄存器
ISP_CONTR EQU 0C7H ; ( 等待時間 < 6M 4 )
ISPRH EQU 78H ; ( 等待時間 < 12M 3 )
ISPRL EQU 79H ; ( 等待時間 < 20M 2 )
ISPWH EQU 7AH ; ( 等待時間 < 12M 3 )
ISPWL EQU 7BH ; ( 等待時間 < 20M 2 )
; / *** *** *** *** *** *** / 通用數據存儲器 RAM 256 字節
; / *** *** *** *** *** *** / 定義內部RAM L EEPROM 5K
RIV_R0 EQU 1CH
RIV_R1 EQU 1DH
PTJSA0 EQU 50H ; 停電保存數據
PTJSA1 EQU 51H ; 可以根據需要字節
; -------------------------------
; / *** *** *** *** *** *** /
; ISP - 78H 79H 7AH 7BH
PJSQS0 EQU 7EH
PJSQS1 EQU 7FH
; / *** *** *** *** *** *** / 通用 標志位
; / *** *** *** *** *** *** / 20H --- 2FH
PLVD_BZ BIT 26H ; 停電處理標志
PLVD_B2 BIT 27H
; / *** *** *** *** *** *** / 程序入口
; / *** *** *** *** *** *** /
ORG 0000H
L0000: LJMP MIN000 ; 初始化 主程序 START
ORG 0033H
L0033: LJMP LVD000 ; LVD 低電壓 ( LVDF )
; RETI
; / *** *** *** *** *** *** / ELVDI (低電壓) 中斷
; / *** *** *** *** *** *** /
; 5V-3.7V 5.50V - 3.30V 4.06V - 1.32V
LVD000: PUSH PSW ; 電流檢測
PUSH ACC
SETB RS0 ; 1 區 R1 R3
CLR RS1
ANL PCON, #11011111B ; 清 LVDF 位
MOV A, PCON
JNB ACC.5, LVD008 ; LVDF
CLR EA
CLR TR1
SETB PLVD_BZ
JNB PLVD_B2, LVD008
CLR PLVD_B2
LVD003: MOV A, PJSQS0 ; 數據
MOV B, #08H
MUL AB
MOV ISPWL, A ; 0000H - 01FFH
MOV ISPWH, B
MOV R1, #PTJSA0 ; 斷電保存數據寫入
MOV R3, #08H
LVD006: MOV A, @R1
LCALL ISP010 ; 字節寫
INC ISPWL
INC R1
DJNZ R3, LVD006
INC PJSQS0
LVD007: ANL PCON, #11011111B ; 清 LVDF 位
MOV A, PCON
JB ACC.5, LVD007
LVD008: CLR PLVD_BZ
SETB EA
POP ACC
POP PSW
RETI
; / *** *** *** *** *** *** / 初始化 主程序A
; / *** *** *** *** *** *** /
MIN000: MOV SP, #0B0H ; 初始化 主程序 SP = B0H - FFH
MOV IE, #11000000B ; IE.6 ( EPCA_LVD 中斷 )
MIN002: LCALL MIM000 ; 初始化
MIN010: NOP ; 主程序
NOP
MOV WDT_CONTR, #3EH ; 看門狗 初始化 12M ( 1.0485 S )
NOP ; 喂狗 同
NOP
; 主控程序在這里加入
MIN050: JMP MIN010
RET
; / *** *** *** *** *** *** / 讀寫 STC15W404AS EEPROM
; / *** *** *** *** *** *** / 1 字節讀
ISP000: MOV ISP_CONTR, #83H ; 打開 IAP 功能 設置等待時間
MOV ISP_CMD, #01H ; 送字節讀命令
MOV ISP_ADDRH, ISPRH ; 送地址高字節
MOV ISP_ADDRL, ISPRL ; 送地址低字節
CLR EA ; 關中斷
MOV ISP_TRIG, #5AH ; 起動 ISP/IAP 觸發寄存器
MOV ISP_TRIG, #0A5H
NOP
MOV A, ISP_DATA ; 將讀出的數據送往Acc
JB PLVD_BZ, $+5
SETB EA
LCALL ISP030 ; 關閉 IAP 功能
RET
; / *** *** *** *** *** *** / 1 字節編程
ISP010: MOV ISP_CONTR, #83H ; 打開 IAP 功能 設置等待時間
MOV ISP_CMD, #02H ; 送字節編程命令
MOV ISP_ADDRH, ISPWH ; 送地址高字節
MOV ISP_ADDRL, ISPWL ; 送地址低字節
MOV ISP_DATA, A ; 數據進ISP_DATA
CLR EA ; 關中斷
MOV ISP_TRIG, #5AH ; 起動 ISP/IAP 觸發寄存器
MOV ISP_TRIG, #0A5H
NOP
JB PLVD_BZ, $+5
SETB EA
LCALL ISP030 ; 關閉 IAP 功能
RET
; / *** *** *** *** *** *** / 擦除扇區
ISP020: MOV ISP_CONTR, #83H ; 打開 IAP 功能 設置等待時間
MOV ISP_CMD, #03H ; 送擦除扇區命令
MOV ISP_ADDRH, ISPWH ; 送地址高字節
MOV ISP_ADDRL, ISPWL ; 送地址低字節
CLR EA ; 關中斷
MOV ISP_TRIG, #5AH ; 起動 ISP/IAP 觸發寄存器
MOV ISP_TRIG, #0A5H
NOP
JB PLVD_BZ, $+5
SETB EA
LCALL ISP030 ; 關閉 IAP 功能
RET
; / *** *** *** *** *** *** / 關閉 IAP 功能
ISP030: MOV ISP_CONTR, #00H
MOV ISP_CMD, #00H
MOV ISP_TRIG, #00H
MOV ISP_ADDRH, #0FFH ; 指向非EEPROM區
MOV ISP_ADDRL, #0FFH
RET
RET
; / *** *** *** *** *** *** / 初始化 STC15W404AS
; / *** *** *** *** *** *** / 讀回DAT ***
MIM000: MOV R4, #20 ; 50000 uS * 20
MIM001: NOP
NOP
MOV WDT_CONTR, #3CH ; 看門狗 初始化 12M ( 1.0485 S )
NOP
NOP ; 喂狗 同
DJNZ R4, MIM001
CLR PLVD_BZ ;
CLR PLVD_B2
MOV RIV_R1, #50 ; 30 S
LCALL MIM050 ; 機器編號
NOP
MIM010: MOV PJSQS0, #40H ; 讀回 編碼
MIM013: DEC PJSQS0 ; 0000H - 01FFH
MOV A, PJSQS0
CJNE A, #0FFH, MIM015
RET
MIM015: MOV B, #08H ; 計算地址
MUL AB
MOV ISPRL, A ; 0000H - 01FFH
MOV ISPRH, B
LCALL ISP000 ; 字節讀
CJNE A, #0FFH, MIM016
JMP MIM013
MIM016: MOV R0, #PTJSA0
MOV R3, #08H
MIM018: LCALL ISP000 ; 字節讀
MOV @R0, A ; 寫 RAM
INC ISPRL
INC R0
DJNZ R3, MIM018
INC PJSQS0
MIM050: RET
; / *** *** *** *** *** *** / 結束
END |