我正在尝试了解开发板(XL400)附带的一些示例asm,以便将其转换为C.
asm代码包含在下面,不幸的是,文档(例如它)从中文翻译得非常糟糕,这使得它比无用的更糟糕。 自从我使用asm以来已经很久了!
在代码中,DELAY子程序中有一条JB指令(第三行代码)。我无法理解它的作用或它应该如何运作。谷歌搜索JB导致不同形式(JB标签)的解释,所以我不确定asm是否正确甚至? 非常感谢,Ta
RS EQU P2.0
RW EQU P2.1
E EQU P2.2
ORG 0080H
MOV P0,#00000001B ;- Screen
ACALL ENABLE
MOV P0,#00000001B ;- Screen
ACALL ENABLE
MOV P0,#00111000B ;Display
ACALL ENABLE
MOV P0,#00001111B ;Show switch control
ACALL ENABLE
MOV P0,#00000110B ;Input mode
ACALL ENABLE
MOV P0,#0C0H ;Data memory address
ACALL ENABLE
mov p0,#01000001b ;ASCII code
SETB RS
CLR RW
CLR E
ACALL DELAY
SETB E
AJMP $
ENABLE: CLR RS ;Send orders
CLR RW
CLR E
ACALL DELAY
SETB E
RET
DELAY: MOV P0,#0FFH
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P0.7,DELAY ;Judgement busy signs
RET
END
答案 0 :(得分:4)
如果第一个操作数指定的位置1,则8051汇编器中的JB指令跳转到第二个操作数中标签指示的地址。因此,在您的情况下,如果设置了MOV P0,#0FFH
,它将跳转到P0.7
。
您所指的JB label
指令是8086指令(根据之前CMP指令的结果跳转到下面),因此您在错误的页面上查找。
答案 1 :(得分:1)
看起来忙/等待循环使LCD控制器在命令后准备就绪:
SETB E //enable LCD
JB P0.7,DELAY //jump if 1
答案 2 :(得分:1)
(免责声明:我不知道8051汇编语言。)
来自http://www.win.tue.nl/~aeb/comp/8051/set8051.html#51jb
描述:如果是,则分支到reladdr指示的地址 位addr指示的位置位。如果该位未设置程序 继续执行JB指令后面的指令。
看起来它会看到P0的第7位,然后如果该位置位则跳转到DELAY。