wuzhengmin 发表于 2026-1-3 12:37:06

也仿真一下:

wuzhengmin 发表于 2026-1-3 12:52:45

单步前先调整存储区窗口,改成外部扩展存储器:

把D:0 改成 X:0


wuzhengmin 发表于 2026-1-3 12:54:06

先把0x000100的内容改成45


wuzhengmin 发表于 2026-1-3 12:54:49

单步一次:

wuzhengmin 发表于 2026-1-3 12:55:49

再单步一次:

累加器A马上变成45

wuzhengmin 发表于 2026-1-3 12:59:07

仔细看看:

wuzhengmin 发表于 2026-1-3 13:00:32

仔细看看:

wuzhengmin 发表于 2026-1-3 13:05:09

程序存储器的数据输出:


想速度快,效率高,就搞个表格

放在程序存储器区间,用下列指令


MOVC A,@A+PC   ; PC<--- (PC) +1, (A) ←((A) + (PC))
MOVC A,@A+DPTR ; (A)←((A) + (DPTR) )


把程序存储器的内容送入累加器

wuzhengmin 发表于 2026-1-3 13:06:18

看看查表的例子:

wuzhengmin 发表于 2026-1-3 13:23:06

我们看看查表子程序的调用:

$NOMOD51
$include (../../COMM-AI8051U/AI8051U.INC)
       


    Fosc_KHZ    EQU 24000   ;24000KHZ
               
        ORG 0000H

        LJMP MAIN;跳转到主程序;
       
        ORG   0100H   ;定义起始存储器位置
MAIN:
        ;MOV   SP, #70H;对堆栈指针赋值
       
        ;MOV R0,#60H ;将立即数60H送到寄存器R0中
        ;MOV @R0, #56H ;将立即数56H送入到R0间接寻址的单元中,
                  ;;执行后60H单元的内容变为56H
                                  
        ;MOV A, #98H
       
        ;MOV 20H,#56H;将立即数56H送入20H单元中
        ;MOV P2,#80H   ;把立即数80H直接送入P2口中
       
        ;MOV R1, #82H
        ;MOV A, @R1
       
        MOV DPTR,#2050H ;表示把16位常数装入数据指针。执行后,DPTR=2050H,其中DPH=20H,DPL=50H。
       
        MOV DPTR, #0100H
        MOVX A, @DPTR
       
        MOV A, #7
       
        LCALL GETSQ
       
        MOV50H,A
       
       
       
LOOP:
        LJMP   LOOP
       
GETSQ: PUSH DPH ;保护DPTR内容
                PUSH DPL
                MOV DPTR,#TABLE ;赋表首址→DPTR
                MOVC A,@A+DPTR;据A中内容查表

                POP DPL
                POP DPH;恢复DPTR原内容

      RET;返回
TABLE:DB 00,01,04,09,16,25,36,49,64,81
       
       
        END
页: 31 32 33 34 35 36 37 38 39 40 [41] 42 43 44 45 46 47 48 49 50
查看完整版本: 有关DMA,山东大学陈桂友教授