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

📄 iap_sst.asm.bak

📁 iap_sst89c58.zip:--------SST89C58/54单片机的iap在线编程/在线下载监控程序源程序(KC51)
💻 BAK
📖 第 1 页 / 共 2 页
字号:
;			R5 = Address Byte Low
;		 (2) Sector Count (in R6)
;
;	RETURNS:	Nothing
;		 
;	DESTROYED:	R0, R4, R5, R6
;************************************************************************ 

sector_e:				;扇区擦除子程序
  mov    a,r4				;
  anl    a,#0f0h
  cjne   a,#0f0h,sector_e1		;判断擦除的是B0区还是B1区
  mov    r0,#40h			;是B1区,为小扇区(64字节)
  sjmp   sector_e2			;
sector_e1:	
  mov    r0,#80h			;是B0区,为大扇区(128字节)
sector_e2:	
  mov    a,SFCF
  orl    a,#0c0h			; VIS = 1,IAPEN=1,激活IAP功能
  mov    SFCF,a			; put SFCF, ISP ENABLE which enables 4K block
  mov    SFAH,r4			;装入要擦除的扇区高地址
  mov    SFAL,r5			;装入要擦除的扇区低地址
  clr    ea				;在擦除过程中,禁止一切中断
  mov    SFCM,#0bh			;执行扇区擦除命令SFCM=#0BH
  nop
  nop
  nop
  acall  done?			;等待擦除操作完毕
  setb   ea
  jb     ERR,sector_e3		;擦除超时,中断退出
  djnz   COUNT,se_nxt		;
  sjmp   sector_e3			;所有扇区均已擦完
sector_e3:	
  jnb    TX,$  
  clr    TX
  mov    a,FLAGS
  mov    sbuf,a			; send FLAGS byte to PC
  nop
  ret
se_nxt:
  clr    c				; configure for next sector
  mov    a,r5				;转到下一个扇区的字节地址
  add    a,r0
  mov    r5,a				;计算下一个扇区的字节首地址 
  mov    a,r4
  addc   a,#00h
  mov    r4,a				; high-byte address updated for next sector
  sjmp   sector_e2			; go erase next sector

;************************************************************************ 
;
; Name:	PROGRAM BYTE ROUTINE
;
;	INPUTS: (1) Starting Address
;			R4, DPH = AdrHi
;			R5, DPL = AdrLo
;		(2) Byte Count (in R6)
;
;	RETURNS: Nothing
;************************************************************************ 
	
program_b:				;字节编程子程序
  jnb    RX,$  
  clr    RX
  mov    a,b
  mov    PCDATA,a			;接收要编程的字节数据
  mov    a,SFCF
  orl    a,#0c0h			; VIS = 1,IAPEN=1,激活IAP功能
  mov    SFCF,a
  mov    SFAH,dph			; 设置要编程的字节地址
  mov    SFAL,dpl
  mov    SFDT,PCDATA
  mov    SFCM,#0eh			; 字节编程命令,SFCM=#0eh
  nop
  nop
  nop
  acall  done?			;等待操作完毕
  jb     ERR,program_err		;超时退出
  inc    dptr				;字节地址加一
  mov    a,FLAGS
  jnb    TX,$			
  clr    TX
  mov    sbuf,a			;发送标志给 PC
  nop
  djnz   COUNT,program_b		;判断是否数据全部写完 
program_1:	
  mov    a,SFST
  mov    STATUS,a
  jb     BUSY,program_1		;等待最后一个字节编程完毕 
  sjmp   program_2
program_err:	
  mov    a,FLAGS
  jnb    TX,$  
  clr    TX
  mov    sbuf,a			; send error to PC 
program_2:		
  mov    a,FLAGS
  jnb    TX,$  
  clr    TX
  mov    sbuf,a			; last send... 
  nop
  nop
  ret

;************************************************************************ 
;
; Name:	VERIFY BYTE ROUTINE
;
;	INPUTS:	 (1) Starting Address
;			R4, DPH = Address Byte High
;			R5, DPL = Address Byte Low
;		 (2) Sector Byte Length (in R6)
;
;	RETURNS: SFDT = Last Data Read
;		
;	DESTROYED:  	R4, R5, R6
;************************************************************************ 

verify_b:				;字节校验子程序
  mov    a,SFCF
  orl    a,#0c0h			;VIS = 1,IAPEN=1,激活IAP功能
  mov    SFCF,a
  mov    SFAH,dph			; load sfah with high address byte
  mov    SFAL,dpl			; load sfal with low address byte
  mov    SFCM,#0ch			; issue IAP complete command,字节校验
  nop
  nop
  nop
  mov    a,SFDT			;读出单元的内容,并发给PC
  jnb    TX,$  
  clr    TX
  mov    sbuf,a			; send data byte to PC
  inc    dptr
  djnz   COUNT,verify_b		; next byte until count reaches zero
  mov    a,FLAGS			;读完所有的字节
  jnb    TX,$  
  clr    TX
  mov    sbuf,a			;发送标志到PC
  nop
  nop
  ret
;------------------------
BLOCK_E:				;块擦除子程序
  mov    a,SFCF
  orl    a,#0c0h			;VIS = 1,IAPEN=1,激活IAP功能
  mov    SFCF,a
  mov    a,r4
  jz     BLOCK_E1			;R4=0,擦除B0块内容
  sjmp   BLOCK_E2
BLOCK_E1:
  mov    SFAH,#00h			;sfah=#00h,擦除B0块内容,sfah=#F0h,擦除B1块内容
  mov    SFDT,#55h
  clr    ea
  mov    SFCM,#0dh			;块擦除命令
  nop
  nop
  acall  done?			;等待操作完毕
  setb   ea
BLOCK_E2:
  jnb    TX,$  
  clr    TX
  mov    a,FLAGS
  mov    sbuf,a			;发送标志
  nop
  nop
  ret
;------------------------
BURST_P:					;闪速编程子程序
  mov    a,SFCF
  orl    a,#0c0h				;VIS = 1,IAPEN=1,激活IAP功能
  mov    SFCF,a
  mov    SFAH,dph
  mov    SFAL,dpl
BURST_P1:
  jnb    RX,$  
  clr    RX
  mov    a,b
  mov    PCDATA,a				;接收下一个字节数据
  mov    SFDT,PCDATA
  mov    SFCM,#06h				;闪速编程
  acall  test_busy				;闪速编程结束?
  inc    dptr
  inc    SFAL
  djnz   COUNT,BURST_P1			;编程下一个字节
  acall  done?
  mov    a,FLAGS
  jnb    TX,$  
  clr    TX
  mov    sbuf,a
  nop
  ret
;-----------------------------
test_busy:					;闪速编程结束?
  mov    a,SFST
  anl    a,#08h
  cjne   a,#00h,test_busy
  ret
;-------------------------------
LOCK_P:				;加密编程子程序
  mov    SFDT,#55h
  mov    b,PCDATA			;取加密的数据
  mov    a,#05h
  mul    ab
  mov    dptr,#LOCK_P1	
  jmp    @a+dptr
LOCK_P1:			
  mov    SFCM,#0fh			;加密位SB1编程命令 PROGRAMMING
  sjmp   LOCK_P2	
  mov    SFCM,#03h			;加密位SB2编程命令 PROGRAMMING
  sjmp   LOCK_P2	
  mov    SFCM,#05h			;加密位SB3编程命令 PROGRAMMING
LOCK_P2:	
  mov    a,SFST
  anl    a,#04h			;检测FLASH_BUSY
  cjne   a,#00h,LOCK_P2	
  nop
  ret
;************************************************************************
;*									*
;*	     CHECK WHETHER THE FLASH OPERATION IS COMPLETED	 	*
;*									*
;************************************************************************
done?:					;检测FLASH操作是否结束子程序
  mov    r0,#0ffh
loadr1:
  mov    r1,#0ffh
copy:
  mov    a,SFST			
  mov    STATUS,a
  jnb    BUSY,ready			;BUSY=0,操作结束
  djnz   r1,copy	
  djnz   r0,loadr1	
  setb   ERR				;操作超时,置超时标志
  ret
ready:
  clr    ERR				;操作结束,置操作结束标志
  ret
;************************************************************************
;*									*
;*		      SERIAL INTERRUPT SERVICE ROUTINE			*
;*									*
;************************************************************************
rs232: 			;串行中断子程序
   push   acc
  jbc    ri,rxdpc	
  clr    ti			;是发送中断,置发送标志TX
  setb   TX			; set flag for sent data to PC
  pop    acc
  reti

rxdpc:
  setb   RX			;是接收中断,置接收标志RX 
  mov    a,sbuf
  mov    b,a			;将接收的数据放入B中
  clr    TX
  mov    sbuf,a		;再将接收的数据发给PC用来校验
  pop    acc
  reti
  ajmp   loop			;软件陷阱
  nop
  nop
  nop
  ajmp   loop

END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -