ORG 0H
MOV A,#38H ;INIT. LCD 2 LINES, 5X7 MATRIX
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#0EH ;display on, cursor on
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#01 ;clear LCD
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#06H ;shift cursor right
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#84H ;cursor at line 1, pos. 4
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#’J’ ;display letter J
ACALL DATAWRT ;call display subroutine
ACALL DELAY ;give LCD some time
MOV A,#’D’ ;display letter D
ACALL DATAWRT ;call display subroutine
AGAIN: SJMP AGAIN ;stay here
COMNWRT: ;send command to LCD
MOV P1,A ;copy reg A to port 1
CLR P2.0 ;RS=0 for command
CLR P2.1 ;R/W=0 for write
SETB P2.2 ;E=1 for high pulse
ACALL DELAY ;give LCD some time
CLR P2.2 ;E=0 for H-to-L pulse
RET
DATAWRT: ;write data to LCD
MOV P1,A ;copy reg A to port 1
SETB P2.0 ;RS=1 for data
CLR P2.1 ;R/W=0 for write
SETB P2.2 ;E=1 for high pulse
ACALL DELAY ;give LCD some time
CLR P2.2 ;E=0 for H-to-L pulse
RET
DELAY: MOV R3,#50 ;50 or higher for fast CPUs
HERE2: MOV R4,#255 ;R4 = 255
HERE: DJNZ R4,HERE ;stay until R4 becomes 0
DJNZ R3,HERE2
RET
END
ORG 0H
MOV A,#38H ;INIT. LCD 2 LINES, 5X7 MATRIX
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#0EH ;display on, cursor on
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#01 ;clear LCD
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#06H ;shift cursor right
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#84H ;cursor at line 1, pos. 4
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#'J' ;display letter J
ACALL DATAWRT ;call display subroutine
ACALL DELAY ;give LCD some time
MOV A,#'D' ;display letter D
ACALL DATAWRT ;call display subroutine
AGAIN: SJMP AGAIN ;stay here
COMNWRT: ;send command to LCD
MOV P1,A ;copy reg A to port 1
CLR P2.0 ;RS=0 for command
CLR P2.1 ;R/W=0 for write
SETB P2.2 ;E=1 for high pulse
ACALL DELAY ;give LCD some time
CLR P2.2 ;E=0 for H-to-L pulse
RET
DATAWRT: ;write data to LCD
MOV P1,A ;copy reg A to port 1
SETB P2.0 ;RS=1 for data
CLR P2.1 ;R/W=0 for write
SETB P2.2 ;E=1 for high pulse
ACALL DELAY ;give LCD some time
CLR P2.2 ;E=0 for H-to-L pulse
RET
DELAY: MOV R3,#50 ;50 or higher for fast CPUs
HERE2: MOV R4,#255 ;R4 = 255
HERE: DJNZ R4,HERE ;stay until R4 becomes 0
DJNZ R3,HERE2
RET
END
I have compiled there is no error but I want to scrolling letter on lcd which command may be use ?Looks like the assembler doesn't like the MOV A,'J' Statement!
Very strange because ASEM51 does support it..
I have thrown this into ASEM51 and it compiles
Code:ORG 0H MOV A,#38H ;INIT. LCD 2 LINES, 5X7 MATRIX ACALL COMNWRT ;call command subroutine ACALL DELAY ;give LCD some time MOV A,#0EH ;display on, cursor on ACALL COMNWRT ;call command subroutine ACALL DELAY ;give LCD some time MOV A,#01 ;clear LCD ACALL COMNWRT ;call command subroutine ACALL DELAY ;give LCD some time MOV A,#06H ;shift cursor right ACALL COMNWRT ;call command subroutine ACALL DELAY ;give LCD some time MOV A,#84H ;cursor at line 1, pos. 4 ACALL COMNWRT ;call command subroutine ACALL DELAY ;give LCD some time MOV A,#'J' ;display letter J ACALL DATAWRT ;call display subroutine ACALL DELAY ;give LCD some time MOV A,#'D' ;display letter D ACALL DATAWRT ;call display subroutine AGAIN: SJMP AGAIN ;stay here COMNWRT: ;send command to LCD MOV P1,A ;copy reg A to port 1 CLR P2.0 ;RS=0 for command CLR P2.1 ;R/W=0 for write SETB P2.2 ;E=1 for high pulse ACALL DELAY ;give LCD some time CLR P2.2 ;E=0 for H-to-L pulse RET DATAWRT: ;write data to LCD MOV P1,A ;copy reg A to port 1 SETB P2.0 ;RS=1 for data CLR P2.1 ;R/W=0 for write SETB P2.2 ;E=1 for high pulse ACALL DELAY ;give LCD some time CLR P2.2 ;E=0 for H-to-L pulse RET DELAY: MOV R3,#50 ;50 or higher for fast CPUs HERE2: MOV R4,#255 ;R4 = 255 HERE: DJNZ R4,HERE ;stay until R4 becomes 0 DJNZ R3,HERE2 RET END
Notice my 'D' and your ’D’ !! The inverted commas are different...
I tried using this command MOV A,#06H ;shift cursor right but letters are not scrolling continuouslyThere are two ways to scroll on an LCD...
One way is to print onto your screen and shift the screen left or right.
The second is to print a buffer to the screen and scroll the buffer..
The first is the easiest, but you can only scroll n many times.
The second is harder, but gives more flexibility..
ORG 0H
MOV A,#38H ;INIT. LCD 2 LINES, 5X7 MATRIX
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#0EH ;display on, cursor on
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#01 ;clear LCD
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#06H ;shift cursor right
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#84H ;cursor at line 1, pos. 4
ACALL COMNWRT ;call command subroutine
ACALL DELAY
MOV A,#18H
ACALL COMNWRT
ACALL DELAY ;give LCD some time
MOV A,#'J' ;display letter J
ACALL DATAWRT ;call display subroutine
ACALL DELAY ;give LCD some time
MOV A,#'D' ;display letter D
ACALL DATAWRT ;call display subroutine
AGAIN: SJMP AGAIN ;stay here
COMNWRT: ;send command to LCD
MOV P1,A ;copy reg A to port 1
CLR P2.0 ;RS=0 for command
CLR P2.1 ;R/W=0 for write
SETB P2.2 ;E=1 for high pulse
ACALL DELAY ;give LCD some time
CLR P2.2 ;E=0 for H-to-L pulse
RET
DATAWRT: ;write data to LCD
MOV P1,A ;copy reg A to port 1
SETB P2.0 ;RS=1 for data
CLR P2.1 ;R/W=0 for write
SETB P2.2 ;E=1 for high pulse
ACALL DELAY ;give LCD some time
CLR P2.2 ;E=0 for H-to-L pulse
RET
DELAY: MOV R3,#50 ;50 or higher for fast CPUs
HERE2: MOV R4,#255 ;R4 = 255
HERE: DJNZ R4,HERE ;stay until R4 becomes 0
DJNZ R3,HERE2
RET
END
ORG 0H
MOV A,#38H ;INIT. LCD 2 LINES, 5X7 MATRIX
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#0EH ;display on, cursor on
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#01 ;clear LCD
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#06H ;shift cursor right
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#84H ;cursor at line 1, pos. 4
ACALL COMNWRT ;call command subroutine
ACALL DELAY
MOV A,#'J' ;display letter J
ACALL DATAWRT ;call display subroutine
ACALL DELAY ;give LCD some time
MOV A,#'D' ;display letter D
ACALL DATAWRT ;call display subroutine
scroll:
ACALL DELAY ;give LCD some time
MOV A,#18H
ACALL COMNWRT ; Scroll left once
ACALL DELAY ;give LCD some time
MOV A,#18H
ACALL COMNWRT ; twice
ACALL DELAY ;give LCD some time
MOV A,#18H
ACALL COMNWRT ; three times
ACALL DELAY ;give LCD some time
MOV A,#18H
ACALL COMNWRT ; last
ACALL DELAY ;give LCD some time
AGAIN: SJMP AGAIN ;stay here
I have paste this but I am getting this error lcd.asm - 22 Error(s), 1 Warning(s).Code:ORG 0H MOV A,#38H ;INIT. LCD 2 LINES, 5X7 MATRIX ACALL COMNWRT ;call command subroutine ACALL DELAY ;give LCD some time MOV A,#0EH ;display on, cursor on ACALL COMNWRT ;call command subroutine ACALL DELAY ;give LCD some time MOV A,#01 ;clear LCD ACALL COMNWRT ;call command subroutine ACALL DELAY ;give LCD some time MOV A,#06H ;shift cursor right ACALL COMNWRT ;call command subroutine ACALL DELAY ;give LCD some time MOV A,#84H ;cursor at line 1, pos. 4 ACALL COMNWRT ;call command subroutine ACALL DELAY MOV A,#'J' ;display letter J ACALL DATAWRT ;call display subroutine ACALL DELAY ;give LCD some time MOV A,#'D' ;display letter D ACALL DATAWRT ;call display subroutine scroll: ACALL DELAY ;give LCD some time MOV A,#18H ACALL COMNWRT ; Scroll left once ACALL DELAY ;give LCD some time MOV A,#18H ACALL COMNWRT ; twice ACALL DELAY ;give LCD some time MOV A,#18H ACALL COMNWRT ; three times ACALL DELAY ;give LCD some time MOV A,#18H ACALL COMNWRT ; last ACALL DELAY ;give LCD some time AGAIN: SJMP AGAIN ;stay here
Paste this in and it will explan
COMNWRT: ;send command to LCD
MOV P1,A ;copy reg A to port 1
CLR P2.0 ;RS=0 for command
CLR P2.1 ;R/W=0 for write
SETB P2.2 ;E=1 for high pulse
ACALL DELAY ;give LCD some time
CLR P2.2 ;E=0 for H-to-L pulse
RET
DATAWRT: ;write data to LCD
MOV P1,A ;copy reg A to port 1
SETB P2.0 ;RS=1 for data
CLR P2.1 ;R/W=0 for write
SETB P2.2 ;E=1 for high pulse
ACALL DELAY ;give LCD some time
CLR P2.2 ;E=0 for H-to-L pulse
RET
DELAY:
MOV R3,#50 ;50 or higher for fast CPUs
HERE2:
MOV R4,#255 ;R4 = 255
HERE:
DJNZ R4,HERE ;stay until R4 becomes 0
DJNZ R3,HERE2
RET
EN
ORG 0H
MOV A,#38H ;INIT. LCD 2 LINES, 5X7 MATRIX
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#0EH ;display on, cursor on
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#01 ;clear LCD
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#06H ;shift cursor right
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#84H ;cursor at line 1, pos. 4
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#'J' ;display letter J
ACALL DATAWRT ;call display subroutine
ACALL DELAY ;give LCD some time
MOV A,#'D' ;display letter D
ACALL DATAWRT ;call display subroutine
COMNWRT: ;send command to LCD
MOV P1,A ;copy reg A to port 1
CLR P2.0 ;RS=0 for command
CLR P2.1 ;R/W=0 for write
SETB P2.2 ;E=1 for high pulse
ACALL DELAY ;give LCD some time
CLR P2.2 ;E=0 for H-to-L pulse
RET
DATAWRT: ;write data to LCD
MOV P1,A ;copy reg A to port 1
SETB P2.0 ;RS=1 for data
CLR P2.1 ;R/W=0 for write
SETB P2.2 ;E=1 for high pulse
ACALL DELAY ;give LCD some time
CLR P2.2 ;E=0 for H-to-L pulse
RET
DELAY: MOV R3,#50 ;50 or higher for fast CPUs
HERE2: MOV R4,#255 ;R4 = 255
HERE: DJNZ R4,HERE ;stay until R4 becomes 0
DJNZ R3,HERE2
RET
scroll:
ACALL DELAY ;give LCD some time
MOV A,#18H
ACALL COMNWRT ; Scroll left once
ACALL DELAY ;give LCD some time
MOV A,#18H
ACALL COMNWRT ; twice
ACALL DELAY ;give LCD some time
MOV A,#18H
ACALL COMNWRT ; three times
ACALL DELAY ;give LCD some time
MOV A,#18H
ACALL COMNWRT ; last
ACALL DELAY ;give LCD some time
AGAIN: SJMP AGAIN ;stay here
END
ORG 0H
MOV A,#38H ;INIT. LCD 2 LINES, 5X7 MATRIX
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#0EH ;display on, cursor on
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#01 ;clear LCD
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#06H ;shift cursor right
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#84H ;cursor at line 1, pos. 4
ACALL COMNWRT ;call command subroutine
ACALL DELAY ;give LCD some time
MOV A,#'J' ;display letter J
ACALL DATAWRT ;call display subroutine
ACALL DELAY ;give LCD some time
MOV A,#'D' ;display letter D
ACALL DATAWRT ;call display subroutine
COMNWRT: ;send command to LCD
MOV P1,A ;copy reg A to port 1
CLR P2.0 ;RS=0 for command
CLR P2.1 ;R/W=0 for write
SETB P2.2 ;E=1 for high pulse
ACALL DELAY ;give LCD some time
CLR P2.2 ;E=0 for H-to-L pulse
RET
DATAWRT: ;write data to LCD
MOV P1,A ;copy reg A to port 1
SETB P2.0 ;RS=1 for data
CLR P2.1 ;R/W=0 for write
SETB P2.2 ;E=1 for high pulse
ACALL DELAY ;give LCD some time
CLR P2.2 ;E=0 for H-to-L pulse
RET
DELAY: MOV R3,#50 ;50 or higher for fast CPUs
HERE2: MOV R4,#255 ;R4 = 255
HERE: DJNZ R4,HERE ;stay until R4 becomes 0
DJNZ R3,HERE2
RET
scroll:
ACALL DELAY ;give LCD some time
MOV A,#18H
ACALL COMNWRT ; Scroll left once
ACALL DELAY ;give LCD some time
MOV A,#18H
ACALL COMNWRT ; twice
ACALL DELAY ;give LCD some time
MOV A,#18H
ACALL COMNWRT ; three times
ACALL DELAY ;give LCD some time
MOV A,#18H
ACALL COMNWRT ; last
ACALL DELAY ;give LCD some time
AGAIN: SJMP AGAIN ;stay here
END
I want same message scrolling all the time but don't know how to create forever loop?If you want the same message scrolling all the time you need to place the string onto the screen in the forever loop.
AGAIN:
MOV R1,#32 ;String lasts 32 characters
MOV A,#0h ;Keep count
SCROLL:
ACALL DATAHOME
ACALL PRINT ;Print Buffer
INC A
DJNZ R1,SCROLL
SJMP AGAIN ;Forever loop
PRINT:
PUSH Acc ;Save A as its used in previous loop
MOV DPTR,#STRING ;Point DPTR to string
MOV R2,#16 ;16 characters
LOOP: POP Acc
PUSH Acc
MOVC A,@A+DPTR ;Add offset
ACALL DATAWRT ;send to screen
INC DPTR
DJNZ R2,LOOP ;Done?
POP Acc ;restore A
RET
STRING:
db " HELLO BIG WORLD! "
DATAHOME:
PUSH Acc
MOV A, #080H ;Home
ACALL COMNWRT
POP Acc
RET
I tried but my message is not scrolling all time its scrolling only two time I don't know what is problem in code?A bit choppy but you'll get the idea
You can see the use of POP and PUSH to save values from being destroyed..
Code:AGAIN: MOV R1,#32 ;String lasts 32 characters MOV A,#0h ;Keep count SCROLL: ACALL DATAHOME ACALL PRINT ;Print Buffer INC A DJNZ R1,SCROLL SJMP AGAIN ;Forever loop PRINT: PUSH Acc ;Save A as its used in previous loop MOV DPTR,#STRING ;Point DPTR to string MOV R2,#16 ;16 characters LOOP: POP Acc PUSH Acc MOVC A,@A+DPTR ;Add offset ACALL DATAWRT ;send to screen INC DPTR DJNZ R2,LOOP ;Done? POP Acc ;restore A RET STRING: db " HELLO BIG WORLD! " DATAHOME: PUSH Acc MOV A, #080H ;Home ACALL COMNWRT POP Acc RET
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?