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

📄 rx2iaplib.a51

📁 这是《Keil Cx51 V7.0单片机高级语言编程与uVision2应用实践》教材各章中列出的全部程序例子。
💻 A51
📖 第 1 页 / 共 2 页
字号:
$NOMOD51
NAME    RX2IAPLIB
; 段定义 
?DT?RX2IAPLIB                                   SEGMENT DATA
?PR?iap_read_manufacturer_id?RX2IAPLIB          SEGMENT CODE
?PR?_iap_init?RX2IAPLIB                         SEGMENT CODE
?PR?_iap_read_device_id?RX2IAPLIB               SEGMENT CODE
?PR?iap_read_security_bits?RX2IAPLIB            SEGMENT CODE
?PR?_iap_program_security_bits?RX2IAPLIB        SEGMENT CODE
?PR?_iap_program_data_byte?RX2IAPLIB            SEGMENT CODE
?PR?_iap_read_data_byte?RX2IAPLIB               SEGMENT CODE
?PR?_iap_erase_block?RX2IAPLIB                  SEGMENT CODE
?PR?iap_erase_chip?RX2IAPLIB                    SEGMENT CODE
?PR?iap_read_boot_vector?RX2IAPLIB              SEGMENT CODE
?PR?iap_read_status_byte?RX2IAPLIB              SEGMENT CODE
?PR?iap_erase_boot_vector_status_byte?RX2IAPLIB SEGMENT CODE
?PR?_iap_program_status_byte?RX2IAPLIB          SEGMENT CODE
?PR?_iap_program_boot_vector?RX2IAPLIB          SEGMENT CODE

; 函数名及全局变量
        PUBLIC iap_freq
        PUBLIC iap_read_manufacturer_id
        PUBLIC _iap_init
        PUBLIC _iap_read_device_id
        PUBLIC iap_read_security_bits
        PUBLIC _iap_program_security_bits
        PUBLIC _iap_program_data_byte
        PUBLIC _iap_read_data_byte
        PUBLIC _iap_erase_block
        PUBLIC iap_erase_chip
        PUBLIC iap_read_boot_vector
        PUBLIC iap_read_status_byte
        PUBLIC iap_erase_boot_vector_status_byte
        PUBLIC _iap_program_status_byte
        PUBLIC _iap_program_boot_vector

; 特殊功能寄存器定仪
DPH     DATA    083H
DPL     DATA    082H
AUXR1   DATA    0A2H
EA      BIT     0AFH
CMOD    DATA    0D9H
ACC     DATA    0E0H
IE      DATA    0A8H

        RSEG  ?DT?RX2IAPLIB
?DT?RX2IAPLIB?BASE:
       iap_freq:   DS   1     ; 芯片使用的晶振频率(近似整数值)

; ************************* 芯片厂商ID读取函数 ***************************
; 函数原型: unsigned char iap_read_manufacturer_id(void);
; 功    能: 返回值为厂商ID (15H = Philips)。
; **********************************************************************
        RSEG  ?PR?iap_read_manufacturer_id?RX2IAPLIB
iap_read_manufacturer_id:
        PUSH    IE                       ; IE保存堆栈
        CLR     EA                       ; 关中断
        MOV     A,CMOD                   ; 保存CMOD
        MOV     R2,A                     
        JNB     ACC.6,?IAPTAG2           
        ANL     CMOD,#0BFH               ; 禁止看门狗
?IAPTAG2:
        ORL     AUXR1,#020H              ; 允许Boot Rom
        MOV     R0,iap_freq              ; 晶振频率值->R0
        MOV     R1,#00H
        MOV     DPTR,#0000H
        CALL    0FFF0H                   ; 调用IAP子程序
        MOV     R7,A                     ; 将A中的ID值->R7
        ANL     AUXR1,#0DFH              ; 禁止Boot Rom
        MOV     CMOD,R2                  ; 恢复CMOD(恢复看门狗状态)
        POP     IE                       ; 恢复中断状态
        RET     

; *************************** IAP初始化函数 ***************************
; 函数原型: void iap_init(unsigned char frequency);
; 功    能: 设置芯片晶振频率。
; 参    数:芯片所使用晶振的近似整数值。 
; **********************************************************************
        RSEG  ?PR?_iap_init?RX2IAPLIB
_iap_init:
        MOV     iap_freq,R7
        RET     
; end of iap_init

; *************************** 芯片ID读取函数 *****************************
; 函数原型: unsigned char iap_read_device_id(unsigned char id_number);
; 功    能: 读取器件ID.
; 参    数:id_number 可为 1 或 2.
; **********************************************************************
        RSEG  ?PR?_iap_read_device_id?RX2IAPLIB
_iap_read_device_id:
        PUSH    IE                       ; 关中断
        CLR     EA
        MOV     A,CMOD
        MOV     R2,A                     ; 保存 CMOD
        JNB     ACC.6,?IAPTAG4           ; 禁止看门狗
        ANL     CMOD,#0BFH
?IAPTAG4:
        ORL     AUXR1,#020H              ; 允许bootrom
        MOV     R0,iap_freq              ; 晶振频率->R0
        MOV     R1,#00H
        MOV     DPH,#00H
        MOV     DPL,R7                   ; 参数id_number -> DPL
        CALL    0FFF0H                   ; 调用IAP子程序
        MOV     R7,A                     ; 将A中的ID值->R7
        ANL     AUXR1,#0DFH              ; 禁止bootrom
        MOV     CMOD,R2                  ; 恢复CMOD(恢复看门狗状态)
        POP     IE                       ; 恢复中断状态
        RET     

; *************************** 保密位读取函数 ****************************
; 函数原型: unsigned char iap_read_security_bits(void);
; 功    能: 读取保密位状态,返回字节中的第1、2、3位分别对应保密位1、2、3。
; **********************************************************************
        RSEG  ?PR?iap_read_security_bits?RX2IAPLIB
iap_read_security_bits:
        PUSH    IE                       ; 关中断
        CLR     EA
        MOV     A,CMOD
        MOV     R2,A                     ; 保存 CMOD
        JNB     ACC.6,?IAPTAG6           ; 禁止看门狗
        ANL     CMOD,#0BFH
?IAPTAG6:
        ORL     AUXR1,#020H              ; 允许 bootrom
        MOV     R0,iap_freq              ; 晶振频率->R0
        MOV     R1,#07H
        MOV     DPTR,#0000H
        CALL    0FFF0H                   ; 调用IAP子程序
        MOV     R7,A                     ; 将A中的ID值->R7
        ANL     AUXR1,#0DFH              ; 禁止 bootrom
        MOV     CMOD,R2                  ; 恢复CMOD(恢复看门狗状态)
        POP     IE                       ; 恢复中断状态
        RET     

; *************************** 保密位编程函数 **************************
; 函数原型: void iap_program_security_bits(unsigned char bits);
; 功    能: 编程保密位,参数字节中的第1、2、3位分别对应保密位1、2、3。
; **********************************************************************
        RSEG  ?PR?_iap_program_security_bits?RX2IAPLIB
_iap_program_security_bits:
; prologue
        PUSH    IE                       ; 关中断
        CLR     EA
        MOV     A,CMOD
        MOV     R2,A                     ; 保存 CMOD
        JNB     ACC.6,?IAPTAG10          ; 禁止看门狗
        ANL     CMOD,#0BFH
?IAPTAG10:
        ORL     AUXR1,#020H              ; 允许 bootrom
        MOV     R6,#00H                  ; 位计数器
        MOV     A,R7                     ; 参数 -> A
        MOV     DPH,#00H
?IAPTAG7:
        JNB     ACC.1,?IAPTAG8           ; 检查ACC.1是否为1
        MOV     R0,iap_freq              ; 晶振频率->R0
        MOV     R1,#05H
        MOV     DPL,R6                   
        CALL    0FFF0H                   ; 调用IAP子程序
?IAPTAG8:
        CLR     C                        ; A带进位右移1位
        RRC     A
        INC     R6                       ; 位计数器加1
        CJNE    R6,#003H,?IAPTAG9        ; 检查3位全部完成否?
?IAPTAG9:
        JC      ?IAPTAG7                 ; 未完,返回编程下一位
; epologue
        ANL     AUXR1,#0DFH              ; 禁止 bootrom
        MOV     CMOD,R2                  ; 恢复CMOD(恢复看门狗状态)
        POP     IE                       ; 恢复中断状态
        RET     

; *************************** 数据字节编程函数 **************************
; 函数原型: unsigned char iap_program_data_byte(unsigned char val, 
;                                                  unsigned int addr);
; 功    能: 编程FLASH中的1个字节。
; 参    数:val  = 待编程的字节数据。
;           addr = 16位FLASH地址。
; 返 回 值:编程成功返回0,编程失败返回非0值。
; **********************************************************************
        RSEG  ?PR?_iap_program_data_byte?RX2IAPLIB
_iap_program_data_byte:
        PUSH    IE                       ; 关中断
        CLR     EA
        MOV     A,CMOD
        MOV     R2,A                     ; 保存 CMOD
        JNB     ACC.6,?IAPTAG11          ; 禁止看门狗
        ANL     CMOD,#0BFH
?IAPTAG11:
        ORL     AUXR1,#020H              ; 允许 bootrom
        MOV     R0,iap_freq              ; 晶振频率 -> R0
        MOV     R1,#02H
        MOV     DPH,R4                   ; 编程地址 -> DPTR
        MOV     DPL,R5
        MOV     A,R7                     ; 编程数据 -> A
        CALL    0FFF0H                   ; 调用IAP子程序

⌨️ 快捷键说明

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