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

📄 rx2iaplib.a51

📁 这是《Keil Cx51 V7.0单片机高级语言编程与uVision2应用实践》教材各章中列出的全部程序例子。
💻 A51
📖 第 1 页 / 共 2 页
字号:
        MOV     R7,A                     ; A中返回值 -> R7
        ANL     AUXR1,#0DFH              ; 禁止 bootrom
        MOV     CMOD,R2                  ; 恢复CMOD(恢复看门狗状态)
        POP     IE                       ; 恢复中断状态
        RET     

; *************************** 数据字节读取函数 **************************
; 函数原型: unsigned char iap_read_data_byte(unsigned int addr);
; 功    能: 从FLASH中读取一个字节的数据并返回给主调函数。
; 参    数:addr = 16位FLASH地址。
; **********************************************************************
        RSEG  ?PR?_iap_read_data_byte?RX2IAPLIB
_iap_read_data_byte:
        PUSH    IE                       ; 关中断
        CLR     EA
        MOV     A,CMOD
        MOV     R2,A                     ; 保存 CMOD
        JNB     ACC.6,?IAPTAG12          ; 禁止看门狗
        ANL     CMOD,#0BFH
?IAPTAG12:
        ORL     AUXR1,#020H              ; 允许 bootrom
        MOV     R0,iap_freq              ; 晶振频率 -> R0
        MOV     R1,#03H
        MOV     DPH,R6                   ; FLASH地址 -> DPTR
        MOV     DPL,R7
        CALL    0FFF0H                   ; 调用IAP子程序
        MOV     R7,A                     ; A中的返回值 -> R7
        ANL     AUXR1,#0DFH              ; 禁止 bootrom
        MOV     CMOD,R2                  ; 恢复CMOD(恢复看门狗状态)
        POP     IE                       ; 恢复中断状态
        RET     

; ***************************** 块擦除函数 ******************************
; 函数原型: void iap_erase_block(unsigned char block);
; 功    能: 擦除FLASH中的一个块。
; 参    数:待擦除的FLASH块地址。
; **********************************************************************
        RSEG  ?PR?_iap_erase_block?RX2IAPLIB
_iap_erase_block:
        PUSH    IE                       ; 关中断
        CLR     EA
        MOV     A,CMOD
        MOV     R2,A                     ; 保存 CMOD
        JNB     ACC.6,?IAPTAG13          ; 禁止看门狗
        ANL     CMOD,#0BFH
?IAPTAG13:
        ORL     AUXR1,#020H              ; 允许 bootrom
        MOV     R0,iap_freq              ; 晶振频率 -> R0
        MOV     R1,#01H
        MOV     DPH,R7                   ; 块地址参数 -> DPH
        MOV     DPL,#00H
        CALL    0FFF0H                   ; 调用IAP子程序
        ANL     AUXR1,#0DFH              ; 禁止 bootrom
        MOV     CMOD,R2                  ; 恢复CMOD(恢复看门狗状态)
        POP     IE                       ; 恢复中断状态

; **************************** 芯片擦除函数 ****************************
; 函数原型: void iap_erase_chip(void);
; 功    能: 擦除整个FLASH。
; **********************************************************************
        RSEG  ?PR?iap_erase_chip?RX2IAPLIB
iap_erase_chip:
        CLR     EA                       ; 关中断
        ANL     CMOD,#0BFH               ; 禁止看门狗
        ORL     AUXR1,#020H              ; 允许 bootrom
        MOV     R0,iap_freq              ; 晶振频率 -> R0
        MOV     R1,#08H
        CALL    0FFF0H                   ; 调用IAP子程序
        RET                              

; ************************** 引导向量读取函数 *****************************
; 函数原型: unsigned char iap_read_boot_vector(void);
; 功    能: 返回读取的引导向量字节。
; **********************************************************************
        RSEG  ?PR?iap_read_boot_vector?RX2IAPLIB
iap_read_boot_vector:
        PUSH    IE                       ; 关中断
        CLR     EA
        MOV     A,CMOD
        MOV     R2,A                     ; 保存 CMOD
        JNB     ACC.6,?IAPTAG14          ; 禁止看门狗
        ANL     CMOD,#0BFH
?IAPTAG14:
        ORL     AUXR1,#020H              ; 允许 bootrom
        MOV     R0,iap_freq              ; 晶振频率 -> R0
        MOV     R1,#07H
        MOV     DPTR,#0002H
        CALL    0FFF0H                   ; 调用IAP子程序
        MOV     R7,A                     ; 返回值 -> R7
        ANL     AUXR1,#0DFH              ; 禁止 bootrom
        MOV     CMOD,R2                  ; 恢复CMOD(恢复看门狗状态)
        POP     IE                       ; 恢复中断状态
        RET     

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

; ********************** 引导向量与状态字节擦除函数 ***********************
; 函数原型: void iap_erase_boot_vector_status_byte(void);
; 功    能: 擦除引导向量与状态字节。
; **********************************************************************
        RSEG  ?PR?iap_erase_boot_vector_status_byte?RX2IAPLIB
iap_erase_boot_vector_status_byte:
        PUSH    IE                       ; 关中断
        CLR     EA
        MOV     A,CMOD
        MOV     R2,A                     ; 保存 CMOD
        JNB     ACC.6,?IAPTAG16          ; 禁止看门狗
        ANL     CMOD,#0BFH
?IAPTAG16:
        ORL     AUXR1,#020H              ; 允许 bootrom
        MOV     R0,iap_freq              ; 晶振频率 -> R0
        MOV     R1,#04H
        MOV     DPH,#00H
        CALL    0FFF0H                   ; 调用IAP子程序
        ANL     AUXR1,#0DFH              ; 禁止 bootrom
        MOV     CMOD,R2                  ; 恢复CMOD(恢复看门狗状态)
        POP     IE                       ; 恢复中断状态
        RET     

; ***************************** 状态字节编程函数 **************************
; 函数原型: void iap_program_status_byte(unsigned char status_byte);
; 功    能: 编程状态字节。
; 参    数:status_byte = 待编程的状态字节。
; **********************************************************************
        RSEG  ?PR?_iap_program_status_byte?RX2IAPLIB
_iap_program_status_byte:
        PUSH    IE                       ; 关中断
        CLR     EA
        MOV     A,CMOD
        MOV     R2,A                     ; 保存 CMOD
        JNB     ACC.6,?IAPTAG17          ; 禁止看门狗
        ANL     CMOD,#0BFH
?IAPTAG17:
        ORL     AUXR1,#020H              ; 允许 bootrom
        MOV     R0,iap_freq              ; 晶振频率 -> R0
        MOV     R1,#06H
        MOV     A,R7                     ; 待编程的状态字节参数 -> A 
        MOV     DPTR,#0000H
        CALL    0FFF0H                   ; 调用IAP子程序
        ANL     AUXR1,#0DFH              ; 禁止 bootrom
        MOV     CMOD,R2                  ; 恢复CMOD(恢复看门狗状态)
        POP     IE                       ; 恢复中断状态
        RET     

; ***************************** 引导向量编程函数 **************************
; 函数原型: void iap_program_boot_vector(unsigned char boot_vector);
; 功    能: 重新编程引导向量。
; 参    数:boot_vecto = 待编程的引导向量字节。
; **********************************************************************
        RSEG  ?PR?_iap_program_boot_vector?RX2IAPLIB
_iap_program_boot_vector:
        PUSH    IE                       ; 关中断
        CLR     EA
        MOV     A,CMOD
        MOV     R2,A                     ; 保存 CMOD
        JNB     ACC.6,?IAPTAG18          ; 禁止看门狗
        ANL     CMOD,#0BFH
?IAPTAG18:
        ORL     AUXR1,#020H              ; 允许 bootrom
        MOV     R0,iap_freq              ; 晶振频率 -> R0
        MOV     R1,#06H
        MOV     A,R7                     ; 待编程的引导向量字节参数 -> A
        MOV     DPTR,#0001H
        CALL    0FFF0H                   ; 调用IAP子程序
        ANL     AUXR1,#0DFH              ; 禁止 bootrom
        MOV     CMOD,R2                  ; 恢复CMOD(恢复看门狗状态)
        POP     IE                       ; 恢复中断状态
        RET     

         END


⌨️ 快捷键说明

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