Question

I'm trying to understand some example asm that came with a development board (XL400), with a view to converting it to C.

The asm code is included below, unfortunately the documentation, such as it is, is translated very badly from Chinese, which makes it worse than useless. Also its a long time since I've used asm!

In the code there is a JB instruction in the DELAY subroutine (third last line of code). I cannot understand what it does or how it is supposed to operate. Googling JB results in explanation for a different form (JB label) so Im not sure if the asm is right even?? Help much appreciated, 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
Was it helpful?

Solution

The JB instruction in 8051 assembler jumps to the address indicated by the label in the second operand if the bit specified by the first operand is set. So in your case it will jump to MOV P0,#0FFH if P0.7 is set.

The JB label instruction you are referring to is an 8086 instruction (jump below based on the result of the CMP instruction just before) so you were looking on the wrong page.

EDIT: I don't know exactly what type of LCD they're using but I think it's the busy flag - as these displays are all rather closely related to the venerable Hitachi 44780. In the board's schematic P0.7 is connected to display pin 14, which commonly is DB7, and that's where the busy flag lives. Of course it's always best to use the documentation of the actual display, but this one is probably pretty close and could get you started. Also, that display is so popular that it's very easy to find code in all possible languages on howto program it. Might be easier to follow that route than to reverse engineer the assembly.

OTHER TIPS

Looks like busy/wait loop for the LCD controller to be ready after a command:

SETB E //enable LCD
JB P0.7,DELAY //jump if 1 

http://www.keil.com/support/man/docs/is51/is51_jb.htm

(Disclaimer: I don't know 8051 assembly language.)

From http://www.win.tue.nl/~aeb/comp/8051/set8051.html#51jb

Description: JB branches to the address indicated by reladdr if the bit indicated by bit addr is set. If the bit is not set program execution continues with the instruction following the JB instruction.

It looks like it will look at the 7th bit of P0, and then jump to DELAY if the bit is set.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top