📄 prog.asm
字号:
;HC908SR12芯片编程
;11.0592MHz时钟,一个T=0.36169us
Flag1 EQU $61 ;标志单元
RamPtr EQU $68
BufLen EQU $69
DataLen EQU $6D
xAddrH EQU $6E ;存放地址
xAddrX EQU xAddrH+1
DataBuf EQU xAddrH+2 ;待写入的数据缓冲区
;PTA口位定义
pBit8 EQU 0 ;输入数据的第8位(In)
pCLRD1 EQU 3 ;使D1触发器输出0(OUT)
pReady EQU 4 ;数据准备好位(In)
pINT1 EQU 5 ;INT1的状态(In)
pCS_Ans EQU 6 ;片选通位(In)/状态报告位(OUT)
pCLRD2 EQU 7 ;使D2触发器输出0(OUT)
;位定义
bEnGet EQU 0 ;Flag1.0=1为接收编程字节
Del_Sub EQU $FF6B ;监控中的子程
Include "d:\HC908\SR12编程\SR12Reg.INC"
org $100
;由PTA.0传送的程序:
GetP: MOV #%10001000,DDRA
MOV #$FF,PTA
MOV #%00011101,DDRC
LDHX #Start
MOV #(Pend-Start),DataLen
GetP_1: BCLR pCLRD1,PTA ;使D触发器输出0
BSET pCLRD1,PTA
BRCLR pReady,PTA,$ ;等待89C52送数据
MOV PTD,X+
DBNZ DataLen,GetP_1
BRA Start
;由PTD传送的指令(PA0=1):
; =00h 无功能操作
; =01h 接收编程数据
; =02h 写Flash,校验
; =03h 整片擦除
org $120
Start: LDA #$FF
STA FLBPR ;Flash保护寄存器=ff,各区均可擦除
M0: CLR Flag1
MOV #$FF,PTC
M1: ; BCLR pCS_Ans,DDRA
BRSET pCS_Ans,PTA,M1 ;等待89C52送选通信号
BCLR pCLRD1,PTA ;使D触发器输出0
BSET pCLRD1,PTA
BRCLR pReady,PTA,$ ;等待89C52送数据
LDA PTD
BRCLR pBit8,PTA,M2 ;非命令转
DBNZA M1_1
LDHX #(DataBuf-2) ;指令=1 准备读编程数据
CLR DataLen
BSET bEnGet,Flag1
BRA M1
M1_1: DBNZA M1_2
BSR Write ;指令=2,写Flash
BRA M0
M1_2: DBNZA M0
BSR EraAll ;指令=3, 整片擦除Flash
BRA M0
M2: BRCLR bEnGet,Flag1,M0
GetData: MOV PTD,X+ ;读编程数据(<=64+2Byte)
INC DataLen
BRA M1
;Flash编程
Write: BCLR 0,PTC ;L10亮=======调试========
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 pCS_Ans,PTA ;正确,回答OK
BCLR 3,PTC ;L2亮(绿色)=======调试=======
BRA ACK_1
AckErr: BSET pCS_Ans,PTA ;出错
BCLR 4,PTC ;L1亮(红)=======调试=======
Ack_1: BSET pCS_Ans,DDRA
BCLR pCLRD2,PTA
BSET pCLRD2,PTA
BRCLR pINT1,PTA,$
BCLR pCS_Ans,DDRA
RTS
Dl100us: LDA #90t ;100us延时
DBNZA $
Dl3us: RTS
;整片擦除:按11.0592MHz时钟,T=0.3616us
EraAll: BCLR 0,PTC ;L10亮(红)=======调试=======
LDA #%00000110
STA FLCR ;Flash控制寄存器的MASS位和ERASE位=1
STA $C000 ;写任意数到Flash区的任意单元
LDA #9 ;[2]
DBNZA $ ;[3] 延时10us
LDA #%00001110
STA FLCR ;HVEN位=1
LDX #40T
EraA_1: BSR Dl100us ;延时4ms
DBNZX EraA_1
LDA #%00001100
STA FLCR ;ERASE位=0
BSR Dl100us ;延时100us
STA FLCR
BSR Dl3us
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 FLCR
STA ,X
LDA #9
DBNZA $ ;延时10us
LDA #%1001 ;HVEN位=1
STA FLCR
WrF_1: PSHH ; [2]
PSHX ; [2]
CLRH ; [1]
LDX RamPtr ; [3]
LDA ,X ; [2]
PULX ; [2]
PULH ; [2] ;14T
STA ,X
INCX ; [1]
INC RamPtr ; [4]
CMP #$FF ; [2]
BEQ WrF_2 ; [3]
LDA #18t ; [2]
DBNZA $ ;延时30us [3]
WrF_2: DBNZ BufLen,WrF_1 ; [5] 14+17+18x3=85T=30.7us
BSR WrF_R ;使最后一个字节延时30us
BSR WrF_R
WrF_3: LDA #%1000 ;PGM位=0
STA FLCR
WrF_X: LDA #5t ;延时5us
DBNZA $
STA FLCR
WrF_R: RTS
pEnd: END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -