⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 psr12.asm

📁 motorola HC908SR12芯片编程2
💻 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 + -