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

📄 prog.asm

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