📄 psr12.asm
字号:
;HC908SR12芯片编程器,电路是SR12编程器
;11.0592MHz时钟,一个T=0.36169us
RamPtr EQU $68
BufLen EQU $69
DataLen EQU $6D
xAddrH EQU $6E ;存放地址
xAddrL EQU xAddrH+1
DataBuf EQU xAddrH+2 ;待写入的数据缓冲区
;========== PTA口位定义 ===================
pBit8 EQU 0 ;输入数据的第8位(In)
pCS EQU 5 ;片选位(In)
pINTx EQU 6 ;INTx的状态(In)
pCLRD EQU 7 ;使D触发器输出0(OUT)
;======== PTC口位定义 =====================
pIn_Out EQU 5 ;传送方向位(In):0-输入,1-输出信息
;位定义
Include "d:\HC908\SR12编程\SR12Reg.INC"
org $80
;由PTA.0传送的程序:
GetP: MOV #$FF,PTA
MOV #$80,DDRA ;PTA.7为输出
LDHX #Start
GetP_1: BRSET pCS,PTA,Start ;若pCS=1,则数据已传完
BCLR pCLRD,PTA ;使D触发器输出0
BSET pCLRD,PTA
BRCLR pIntx,PTA,$ ;等待89C52送数据
MOV PTD,X+
BRA GetP_1
;由PTD传送的指令(PA0=1):
; =00h 无功能操作
; =01h 接收编程数据
; =02h 写Flash,校验
org $100
Start: LDA #$FF
STA FLBPR ;Flash保护寄存器=ff,各区均可擦除
MOV #%00001111,DDRC ;C口的低4位输出,回送操作后的信息
BRCLR 6,$60,Start2 ;60H.6=1则Flash可读写
BSR ChkFlash
BNE Start1
Start_1: CLR PTC ;回答"准备就绪"
Start_2: BCLR pCLRD,PTA ;使D触发器输出0
BSET pCLRD,PTA
BRCLR pIntx,PTA,$ ;等待89C52取数据
BRA M1
Start1: BSR EraAll ;擦除
BEQ Start_1
MOV #$4,PTC ;擦不干净
BRA Start_2
Start2: BSR EraAll ;擦除
MOV #$1,PTC ;需重新上电
BRA Start_2
;整片擦除子程: 按11.09512MHz时钟,T=0.3616us
EraAll: 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 ;延时4ms
EraA_1: LDA #93t ;100us延时
DBNZA $
DBNZX EraA_1
LDA #%00001100
STA FLCR ;ERASE位=0
LDA #93t ;100us延时
DBNZA $
STA FLCR
BSR Dl3us ;延时3us
ChkFlash:LDHX #$C000 ;检查是否为全FFH
ChkB_1: LDA ,X
INCA
BNE ChkFl_R ;出错
AIX #1
PSHH
PULA
CMP #$F0
BNE ChkB_1
LDHX #$FFD0
ChkB_2: LDA ,X
INCA
BNE ChkFl_R
INCX
BNE ChkB_2
ChkFl_R: TSTA
Dl3us: RTS
M1: BRSET pCS,PTA,M1 ;等待89C52送选通信号
BCLR pCLRD,PTA ;使D触发器输出0
BSET pCLRD,PTA
BRCLR pIntx,PTA,$ ;等待89C52送数据
LDA PTD
BRCLR pBit8,PTA,M2 ;非命令转
DBNZA M1_1
LDHX #(DataBuf-2) ;指令=1 准备读编程数据
CLR DataLen
BRA M1
M1_1: DBNZA M1
BSR Write ;指令=2,写Flash
JMP Start_2
M2: 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: CLR PTC ;正确,回答OK
RTS
AckErr: MOV #$3H,PTC ;出错
RTS
;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 + -