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

📄 xprog.asm

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