📄 xprog.asm
字号:
;HC908SR12芯片编程
;11.0592MHz时钟,一个T=0.36169us
xFLCR EQU $60 ;************
xFLBPR EQU $61 ;************
Flag1 EQU $62 ;标志单元
RamPtr EQU $68
BufLen EQU $69
DataLen EQU $6D
xAddrH EQU $6E ;存放地址
xAddrX EQU xAddrH+1
DataBuf EQU xAddrH+2 ;待写入的数据缓冲区
RW0 EQU $60
RW1 EQU $61
RW2 EQU $62
;PTA口位定义
pBit8 EQU 0 ;输入数据的第8位(In)
pCLRD EQU 3 ;使D触发器输出0(OUT)
pReady EQU 4 ;数据准备好位(In)
pINT1 EQU 5 ;选通INT1(OUT)
pCS EQU 6 ;片选通位(In)/状态报告位(OUT)
pAnswer EQU 6 ;状态报告位(OUT)
;位定义
bEnGet EQU 0 ;Flag1.0=1为接收编程字节
Del_Sub EQU $FF6B ;监控中的子程
Include "d:\HC908\试监控\SR12Reg.INC"
;由PTD传送的指令(PA0=1):
; =00h 无功能操作
; =01h 接收编程数据
; =02h 写Flash,校验
; =03h 整片擦除
org $C000
MOV #$1,CONFIG1 ;禁止COP
MOV #$FF,PTA
mov #%00101000,DDRA
BSET 4,DDRC
LDA #$FF
STA xFLBPR ;Flash保护寄存器=ff,各区均可擦除
M0: CLR Flag1
M1: BCLR pCS,DDRA
BRSET pCS,PTA,M1 ;等待89C52送选通信号
BCLR pCLRD,PTA ;使D触发器输出0
BSET pCLRD,PTA
BCLR 4,PTC ;LED亮
BRCLR pReady,PTA,$ ;等待89C52送数据
LDA PTD
BSET 4,PTC ;LED灭
BRCLR pBit8,PTA,M2 ;非命令转
DECA
BNE M1_1
LDHX #(DataBuf-2) ;指令=1 准备读编程数据
CLR DataLen
BSET bEnGet,Flag1
BRA M1
M1_1: DECA
BNE M1_2
BSR Write ;指令=2,写Flash
BRA M0
M1_2: DECA
BNE M1_Err
BSR EraAll ;指令=3, 整片擦除Flash
BRA M0
M1_Err BSR AckErr
BRA M0
M2: BRCLR bEnGet,Flag1,M1_Err
GetData: MOV PTD,X+ ;读编程数据(<=64+2Byte)
INC DataLen
BRA M1
;Flash编程
Write: LDA DataLen
SUB #3
BCS ACKErr
INCA
STA BufLen
STA DataLen
LDHX xAddrH
BSR WrFlash
LDHX xAddrH ;检查写入正确否
MOV #DataBuf,RamPtr
Write_1: PSHH
PSHX
CLRH
LDX RamPtr
LDA ,X
PULX
PULH
CMP ,X
BNE AckErr ;出错转
INCX
INC RamPtr
DBNZ DataLen,Write_1
AckOK: BCLR pAnswer,PTA ;正确,回答OK
BRA ACK_1
AckErr: BSET pAnswer,PTA ;出错
Ack_1: BSET pAnswer,DDRA
BCLR pINT1,PTA
BCLR bEnGet,Flag1 ;产生INT1信号
BSR Dl3us
BSET pINT1,PTA
Dl100us: LDA #90t ;100us延时
DBNZA $
Dl3us: RTS
;整片擦除:按11.0592MHz时钟,T=0.3616us
EraAll: LDA #%00000110
STA xFLCR ;Flash控制寄存器的MASS位和ERASE位=1
; STA $C000 ;写任意数到Flash区的任意单元
LDA #9 ;[2]
DBNZA $ ;[3] 延时10us
LDA #%00001110
STA xFLCR ;HVEN位=1
LDX #40T
EraA_1: BSR Dl100us ;延时4ms
DBNZX EraA_1
LDA #%00001100
STA xFLCR ;ERASE位=0
BSR Dl100us ;延时100us
ChkFFH: LDHX #$C000 ;检查是否为全FFH
ChkB_1: LDA ,X
INCA
BNE AckErr ;错
AIX #1
PSHH
PULA
CMP #$F0
BNE ChkB_1
LDHX #$FFD0
ChkB_2: LDA ,X
INCA
BNE AckErr
INCX
BNE ChkB_2
BRA ACKOK
;Flash编程.IN:HX=Flash的起始地址,编程区所对应的Flash保护寄存器的位应=1
;编程的数据存放在DataBuf开始的RAM中.
;若调WrFlashX,则需置BufLen=编程的字节数(<64)
WrFlash: MOV #DataBuf,RamPtr
LDA #1 ;PGM位=1
STA xFLCR
STA ,X
LDA #8
DBNZA $ ;延时10us
LDA #%1001 ;HVEN位=1
STA xFLCR
WrF_1: PSHH ; [2]
PSHX ; [2]
CLRH ; [1]
LDX RamPtr ; [3]
LDA ,X ; [2]
PULX ; [2]
PULH ; [2] ;延时5.7us
STA ,X
INCX ; [1]
INC RamPtr ; [4]
CMP #$FF ; [2]
BEQ WrF_2 ; [3]
LDA #16t ; [2]
DBNZA $ ;延时30us [3]
WrF_2: DBNZ BufLen,WrF_1 ; [5] 33+16x3=81T=33us
BSR WrF_R ;使最后一个字节延时33us
BSR WrF_R
WrF_3: LDA #%1000 ;PGM位=0
STA xFLCR
LDA #4t ;延时5us
WrF_X: DBNZA $
CLRA
STA xFLCR
WrF_R: RTS
pEnd: END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -