ORG 0000H
LJMP START
ORG 0030H
START: MOV SP. #60H
ST1: CLR A
MLOOP: MOV P1,A
CALL DELAY
INC A
JNB ACC.3 MLOOP
SJMP STI
DELAY: MOV R7,#0
DLI: MOV R6, #0
DINZ R6,$
DJNZ R7.DL1
RET
END
74ls138 是 3线8线译码器
这段代码是用枚举的方法,产生(10进制 0-7) 按二进制表示就是 000,001,010,011,100,101,110,111
这 0-7 输出到 P1 的低 3 位 P1^0,P1^1,P1^2 这3个信号接 74ls138 的输入线,再用 LED 或 电压表的方式测量 74ls138 8条输出线,对比74ls138 真值表验证 74ls138 的逻辑。
ORG 0000H ; 汇编伪指令ORG作用是定义程序或数据块的起始地址,指示此语句后面的程序或数据块以 0 为起始地址连续存放在程序存储
; 这个 0 地址也是 CPU 上电复位后执行的第一条指令的地址
LJMP START ; 跳转到 START
ORG 0030H ; 汇编伪指令ORG
START: MOV SP. #60H ; 初始化栈,为 PUSH POP 及 CALL 中断等分配栈空间
ST1: CLR A ; 将 A 清 0
MLOOP: MOV P1,A ; 将 A 送到单片机 P1 口
CALL DELAY ; 调用子程序 DELAY 这个子程序是延时用的
INC A ; A = A + 1
JNB ACC.3 MLOOP ; 判断累加器低 3 位是不是 0 ,不是 0 就跳转到 MLOOP,这实现了 A = 0-7 的循环
SJMP STI ; 无条件跳转到 ST1
DELAY: MOV R7,#0 ; 这是个延时用的子程序入口 DELAY
DLI: MOV R6, #0 ;
DINZ R6,$ ;
DJNZ R7.DL1 ;
RET ; 子程序返回
END
DELAY: MOV R7,#0 ; 这是个延时用的子程序入口 DELAY, R7 = 0
DL1: MOV R6, #0 ; R6 = 0
DJNZ R6,$ ; 这个应该是 DJNZ,不是 DINZ ,是减一不为零转移指令 就是 判断 R6-1 后是不是 0,不是 0 就跳转到 $ ,也就是跳转到本行,接着 判断 R6-1
DJNZ R7,DL1 ; 判断 R7-1 后是不是 0,不是 0 就跳转到 DL1,是 0 就执行下一条指令
RET ; 子程序返回