查看: 798|回复: 0

ADuC841的例程——片内存储器与数据传送指令

[复制链接]
  • TA的每日心情
    郁闷
    2013-9-12 12:12
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2016-3-1 16:20:27 | 显示全部楼层 |阅读模式
    分享到:
    1. 第四单元  片内存储器与数据传送指令



    2. 实验4-1:外部数据块搬移(≤256字节)

    3. 把处于程序存储器中从Data_TAB开始的256个字节数据传送到外部数据存储器从1000H开始的256个单元中去。



    4.               $mod841                                         ; 包含841的头文件

    5.                             ORG  0000H                                ; 实验板开始执行的第一条指令所处的地址

    6.                             LJMP  MAIN                              ; 跳转到主程序

    7.                             ORG  0100H                                ; 主程序开始的地址;避开中断入口地址

    8. MAIN:                MOV  DPTR, #         Data_TAB        ; 使DPTR指向程序存储器中的Data_TAB开始的256个字节数据

    9.                             MOV  P2, #10H                           ; 使P2口指向XDATA中的目的地址高8位

    10.                             MOV  R0, #00H                           ; 使R0口指向XDATA中的目的地址低8位起始地址

    11. MOVEDATA:   MOV  A, #00H                                      ; 清除累加器,以便下一条指令能准确指向程序存储器中的数据

    12. MOVC  A, @A+DPTR               ; 从程序存储器中读取数据,请注意指令形式

    13.                             MOVX  @R0, A                          ; 把数据写到XDATA中

    14.                             INC  DPTR                                  ; 修改源数据指针

    15.                             INC  R0                                        ; 修改目的数据指针

    16.                             CJNE  R0, #00H, MOVEDATA ; 没有送完256个数据,跳转到MOVEDATA继续送数

    17. HALT:                LJMP  HALT                               ; 送完256个数据,在此死循环,实际程序中应为后续操作

    18. ;++++++++以下为XCODE中的数据表++++++++       ; 用以分隔程序,使程序清晰易懂

    19. Data_TAB:                                                                ; 常数或数据表格前用标号表示其起始地址

    20. DB  0, 1, 2, 3, 4, 5, 6, 7                                   ; 立即数可以用十进制数表示,也可以用十六进制数表示, 后者有后缀“H”

    21. DB  8, 9, 0AH, 0BH, 0CH, 0DH, 0EH, 0FH ; 十六进制数中最高位数为A~F时,前面要补数字“0”

    22. DB  10H, 11H, 12H, 13H, 14H, 15H, 16H, 17H    ; 十六进制数中最高位数为A~F时,前面要补数字“0”

    23. DB  18H, 19H, 1AH, 1BH, 1CH, 1DH, 1EH, 1FH          ; 每行起始用伪指令“DB”定义数据,“DB”表示数据字节

    24. ……

    25. DB  0F8H, 0F9H, 0FAH, 0FBH, 0FCH, 0FDH, 0FEH, 0FFH          ; 每个数据字节之间用英文逗号分隔

    26. ;+++++++ +++++表格结束++++++++++++++++ ; 用以分隔程序,使程序清晰易懂

    27.                    END                                                         ; 程序结束,编译程序不理会END以后的内容



    28. 实验4-2:外部数据块搬移(65280>数据字节数>256)

    29. 把处于外部数据存储器从Data_BLOCK开始的NUMB(65280>NUMB>256)个字节数据传送到串口数据缓冲器(SBUF)中去。



    30.               $mod841                                         ; 包含841的头文件

    31.                             ORG  0000H                                ; 实验板开始执行的第一条指令所处的地址

    32.                             LJMP  MAIN                              ; 跳转到主程序

    33.                             ORG  0100H                                ; 主程序开始的地址;避开中断入口地址

    34. MAIN:                MOV  DPTR, #         Data_BLOCK     ; 使DPTR指向XDATA中的Data_BLOCK开始数据块

    35.                             MOV  R0, #NUMB_LOW          ; #NUMB_LOW为#NUMB的低位字节放到作为低位字节计数器的R0中

    36.                             MOV  R1, #NUMB_HIGH+1    ; #NUMB_HIGH为#NUMB的高位字节加1放到作为高位字节计数器的R1中

    37. MOVEDATA:   MOVX  A, @ DPTR                            ; 从XDATA中读取数据,请注意指令形式

    38.                             MOV  SBUF, A                                     ; 把数据写到SBUF中

    39.                             INC  DPTR                                  ; 修改源数据指针

    40.                             DJNZ  R0, MOVEDATA           ; 没有送完NUMB个数据,跳转到MOVEDATA继续送数

    41.                             DJNZ  R1, MOVEDATA           ;

    42. HALT:                LJMP  HALT                               ; 送完NUMB个数据,在此死循环,实际程序中应为后续操作

    43. ;==================================    ; 用以分隔程序,使程序清晰易懂

    44.                    END                                                         ; 程序结束,编译程序不理会END以后的内容





    45. 实验4-3:外部数据块搬移(65536>数据字节数>1)

    46. 把处于外部数据存储器(XDATA)中从Data_TAB1开始的NUMB个字节数据传送到外部数据存储器从Data_TAB2开始的NUMB个单元中去。



    47.               $mod841                                         ; 包含841的头文件

    48.                             ORG  0000H                                ; 实验板开始执行的第一条指令所处的地址

    49.                             LJMP  MAIN                              ; 跳转到主程序

    50.                             ORG  0100H                                ; 主程序开始的地址;避开中断入口地址

    51. MAIN:                MOV  DPTR, # Data_TAB1       ; 使DPTR指向XDATA中的Data_TAB1开始的数据块

    52.                             MOV  R0, # Data_TAB2_LOW  ; # Data_TAB2的低位字节放到R0中

    53.                             MOV  P2, # Data_TAB2_HIGH ; # Data_TAB2的高位字节放到P2中

    54.                             MOV  R2, #0                                ; R2作为送数个数计数器的低位字节计数器

    55.                             MOV  R3, #0                                ; R3作为送数个数计数器的高位字节计数器

    56. MOVEDATA:   MOVX  A, @ DPTR                            ; 从XDATA中的Data_TAB1开始的数据块读取数据

    57.                             MOVX  @R0, A                          ; 把数据写到XDATA中的Data_TAB2开始的数据块中

    58.                             INC  DPTR                                  ; 修改源地址指针

    59.                             INC  R0                                        ; 修改目的地址指针低位字节

    60.                             CJNE  R0, #0, MOVEDATA1    ; 目的地址指针低位字节是否有进位

    61.                             INC  P2                                         ; 目的地址指针低位字节有进位,高位字节加1

    62. MOVEDATA1: INC  R2                                        ; 修改已传送数据个数计数指针低位字节

    63.                             CJNE  R2, #0, MOVEDATA2    ; 已传送数据个数计数指针低位字节是否有进位

    64.                             INC  R3                                        ; 已传送数据个数计数指针低位字节有进位,高位字节加1

    65. MOVEDATA2: CJNE  R2, #NUMB_LOW, MOVEDATA; 比较已传送数据个数计数指针低位字节,不等则继续送数

    66. CJNE  R3, #NUMB_HIGH, MOVEDATA; 低位字节相等,比较高位字节,不等则继续送数

    67. HALT:                LJMP  HALT                               ; 送完数据块搬移,在此死循环,实际程序中应为后续操作

    68. ;==================================    ; 用以分隔程序,使程序清晰易懂

    69.                    END                                                         ; 程序结束,编译程序不理会END以后的内容



    70. 实验4-4:清除外部数据存储器(0000H~7FFFH)

    71. 清除外部数据存储器(XDATA)中从0000H到7FFFH的所有单元。



    72.               $mod841                                         ; 包含841的头文件

    73.                             ORG  0000H                                ; 实验板开始执行的第一条指令所处的地址

    74.                             LJMP  MAIN                              ; 跳转到主程序

    75.                             ORG  0100H                                ; 主程序开始的地址;避开中断入口地址

    76. MAIN:                MOV  DPTR, #0000H                 ; 使DPTR指向XDATA中的起始地址9000H

    77.                             MOV  A, #0                                 ; 清除累加器

    78. CLR_RAM:        MOVX  @ DPTR, A                            ; 清除DPTR所指向的XDATA单元(即写入数据00H)

    79.                             INC  DPTR                                  ; 修改地址指针

    80.                             MOV  R0, DPH                                     ; 把地址指针的高位字节送到R0中进行判断

    81.                             CJNE  R0, #80H, CLR_RAM     ; 完成清除XDATA?

    82. HALT:                LJMP  HALT                               ; 完成清除XDATA,在此死循环,实际程序中应为后续操作

    83. ;==================================    ; 用以分隔程序,使程序清晰易懂

    84.                    END                                                         ; 程序结束,编译程序不理会END以后的内容



    85. 实验4-5:清除片内数据存储器(DATA+IDATA)

    86. 清除片内数据存储器(DATA+IDATA),即片内从00H至FFH所有单元。



    87.               $mod841                                         ; 包含841的头文件

    88.                             ORG  0000H                                ; 实验板开始执行的第一条指令所处的地址

    89.                             LJMP  MAIN                              ; 跳转到主程序

    90.                             ORG  0100H                                ; 主程序开始的地址;避开中断入口地址

    91. MAIN:                MOV  R0, #0FFH                        ; 使R0指向IDATA中的最大的地址FFH

    92.                             MOV  A, #0                                 ; 清除累加器

    93. CLR_RAM:        MOV  @ R0, A                                     ; 清除DPTR所指向的IDATA单元(即写入数据00H)

    94.                             DJNZ  R0, CLR_RAM                ; 完成清除IDATA?

    95. HALT:                LJMP  HALT                               ; 完成清除IDATA,在此死循环,实际程序中应为后续操作

    96. ;==================================    ; 用以分隔程序,使程序清晰易懂

    97.                    END                                                         ; 程序结束,编译程序不理会END以后的内容



    98. 实验4-6:读写RAM

    99. 把处于数据存储器(RAM)中从Data_TAB1开始的NUMB(<256)个字节数据传送到数据存储器从Data_TAB2开始的NUMB个单元中去。



    100.               $mod841                                         ; 包含841的头文件

    101.                             ORG  0000H                                ; 实验板开始执行的第一条指令所处的地址

    102.                         LJMP  MAIN                              ; 跳转到主程序

    103. ORG  0100H                                ; 主程序开始的地址;避开中断入口地址

    104. MAIN:                MOV  R0, #Data_TAB1        ; 使R0指向DATA中的Data_TAB1开始的数据块

    105.                         MOV  R1, #Data_TAB2       ; 使R1指向DATA中的Data_TAB2开始的数据块

    106.                         MOV  R2, #0                   ; R2作为送数个数计数器的低位字节计数器

    107. MOVEDATA:   MOV  A,  @R0                      ; 从DATA中的Data_TAB1开始的数据块读取数据

    108.                         MOV  @R1,A               ; 把数据写到DATA中的Data_TAB2开始的数据块中

    109.                         INC   R0                   ; 修改源地址指针

    110.                         INC   R1                   ; 修改目的地址指针低位字节

    111.                         INC   R2                   ; 修改已传送数据个数计数字节

    112.                         CJNE  R2, #NUMB, MOVEDATA  ; 比较已传送数据个数计数指针字节,不等则继续送数

    113. HALT:                LJMP  HALT                     ; 送完数据块搬移,在此死循环,实际程序中应为后续操作

    114. ;==================================    ; 用以分隔程序,使程序清晰易懂

    115.                    END                    ; 程序结束,编译程序不理会END以后的内容



    116. 实验4-7:读写XRAM

    117. 把ADC采样获得的1k个字节数据送入处于片内XRAM的从0000H开始的存储区内,再把这1k个字节数据传送到DAC中去。实际上该程序实现数字存储示波(滚动显示)。



    118.               $mod841                                         ; 包含841的头文件

    119.                             ORG  0000H                                ; 实验板开始执行的第一条指令所处的地址

    120.                         LJMP  MAIN                              ; 跳转到主程序

    121. ORG  0100H                                ; 主程序开始的地址;避开中断入口地址

    122. MAIN:                MOV  CFG841, #01                    ; 使能片内XRAM,默认时为片外数据存储器

    123.                         MOV  DPTR, #0                       ; 使DPTR指向XDATA中的起始地址

    124.                         MOV  ADCCON1,#0A4H              ; 写ADC控制字

    125.                         MOV  ADCCON2,#00H                ; 选择0通道采样

    126.                    MOV  DACCON, #0DH       ; 写DAC控制字

    127.                         MOV  R2, #0                          ; 1k的低位字节放到作为低位字节计数器的R2中

    128.                         MOV  R3, #3                               ; 1k的高位字节放到作为高位字节计数器的R3中

    129.                    SETB    SCONV                     ; 将SCONV置1,则ADC开始单步转换

    130.                LCALL DELAY                      ; 调延时,等待ADC转换完毕

    131. SENDDATA:     MOV A, ADCDATAH                 ; 将采样值的高字节放入累加器A中

    132.                         MOVX @DPTR, A            ; 将采样值的高字节送入XRAM

    133.                         INC  DPTR                          ; 修改源地址指针

    134.                         MOV  A, ADCDATAL        ; 将采样值的低字节放入累加器A中

    135.                         MOVX @DPTR, A            ; 将采样值的低字节送入XRAM

    136.                         INC  DPTR                  ; 修改源地址指针

    137.                             ANL DPH, #03H                                     ; 保证DPTR指向0000H~03FFH的范围内

    138.                   SETB    SCONV            ; 将SCONV置1,则ADC开始单步转换

    139.                             SETB P3.3                                      ; 送同步脉冲,P3.3接示波器的外部触发信号

    140.                             CLR P3.3

    141. MOVEDATA:           MOVX A, @DPTR              ; 从XDATA中读取数据送DAC,DAC输出接示波器

    142.                        MOV  DAC0H, A               ; 将XRAM中的数据送DAC输出,先送高字节

    143.                        INC  DPTR                    ; 修改地址指针

    144.                        MOVX A, @DPTR             ; 从XDATA中读取数据

    145.                        MOV  DAC0L, A               ; 将XRAM中的数据送DAC输出,送低字节

    146.                        INC  DPTR                               ; 修改地址指针

    147.                             ANL DPH, #03H                                     ; 保证DPTR指向0000H~03FFH的范围内

    148.                        DJNZ R2, MOVEDATA                     ; 没有送完NUMB个数据,跳转到MOVEDATA继续采数

    149.                        DJNZ R3, MOVEDATA

    150.                         MOV  R2, #0                          ; 1k的低位字节放到作为低位字节计数器的R2中

    151.                         MOV  R3, #3                               ; 1k的高位字节放到作为高位字节计数器的R3中

    152. HALT:                LJMP  SENDDATA              ; 送完1帧数据,跳转采样新数据和送下一帧数据

    153. ;==================================    ; 用以分隔程序,使程序清晰易懂

    154.                    END                                                         ; 程序结束,编译程序不理会END以后的内容



    155. 实验4-8:读写FLASH/EE数据存储器

    156. 先对FLASH/EE数据存储器中的第N页的4个字节中分别写入#0AH、#0BH、#0CH和#0DH,然后再把第2个字节改为#0EH。

    157. $mod841                                         ; 包含841的头文件

    158. ORG  0000H                                ; 实验板开始执行的第一条指令所处的地址

    159.                             LJMP  MAIN                              ; 跳转到主程序

    160.                             ORG  0100H                                ; 主程序开始的地址;避开中断入口地址

    161. MAIN:        MOV ECON, #06H                    ; 读写FLASH/EE之前,先对其进行全部檫除命令

    162.               MOV EADRL, #NL             ; 设置编程页指针的低字节

    163.               MOV EADRH, #NH             ; 设置编程页指针的高字节

    164.               MOV EDATA1, #0AH        ; 向数据寄存器写第N页的第一个字节写入新字节#0AH

    165.               MOV EDATA2, #0BH          ; 向数据寄存器写第N页的第二个字节写入新字节#0BH

    166.               MOV EDATA3, #0CH          ; 向数据寄存器写第N页的第三个字节写入新字节#0CH

    167.               MOV EDATA4, #0DH        ; 向数据寄存器写第N页的第四个字节写入新字节#0DH

    168.               MOV ECON, #02H             ; 将数据寄存器组的数写入FLASH/EE中的第N页中   

    169.               MOV ECON, #01H           ; 修改FLASH/EE之前,先读取该页数据,以免更改不需要修改的数据

    170.               MOV EDATA2, #0EH          ; 修改数据

    171.               MOV ECON, #05H             ; 写数据之前,应先檫除该页

    172.               MOV ECON, #02H             ; 将修改后的数写入FLASH/EE中的第N页中

    173. HALT:                LJMP  HALT                               ; 完成清除IDATA,在此死循环,实际程序中应为后续操作

    174. ;==================================    ; 用以分隔程序,使程序清晰易懂

    175.                    END                                                         ; 程序结束,编译程序不理会END以后的内容
    复制代码


    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-19 17:32 , Processed in 0.109941 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.