Laboratory Report 4

Liquid Crystal Display Character Generation

CPE108L
3Q1920
Part I - Basic LCD Control
	Step 1
;save data you wish to display in the RAM
MOV 30H, #'M'
MOV 31H, #'A'
MOV 32H, #'P'
MOV 33H, #'U'
MOV 34H, #'A'
MOV 35H, #0 ;end of data marker

;initializing the display
CLR P1.3;clear pin RS to select register (0-instruction register for write and busy flag: address counter for read) ;indicate that instructions are being sent to the module

;function set
CLR P1.7 ; |
CLR P1.6 ; |
SETB P1.5 ; |
CLR P1.4 ; | high nibble set

SETB P1.2 ; |
CLR P1.2 ; | negative edge on E

CALL delay ; wait for BF to clear
; function set sent for first time - tells module to
; go into 4-bit mode

SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
; same function set high nibble sent a second time
SETB P1.7 ; low nibble set (only P1.7 needed to be changed)
SETB P1.2 ; |

CLR P1.2 ; | negative edge on E
; function set low nibble sent

CALL delay ; wait for BF to clear

; entry mode set
; set to increment with no shift
CLR P1.7 ; |
CLR P1.6 ; |
CLR P1.5 ; |
CLR P1.4 ; | high nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
SETB P1.6 ; |
SETB P1.5 ; |low nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
CALL delay ; wait for BF to clear

; display on/off control
; the display is turned on, the cursor is turned on and blinking is turned on
CLR P1.7 ; |
CLR P1.6 ; |
CLR P1.5 ; |
CLR P1.4 ; | high nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
SETB P1.7 ; |
SETB P1.6 ; |
SETB P1.5 ; |
SETB P1.4 ; | low nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
CALL delay ; wait for BF to clear

; send data
SETB P1.3 ; clear RS - indicates that data is being sent to
; module
MOV R1, #30H ; data to be sent to LCD is stored in 8051 RAM,
; starting at location 30H
loop:
	MOV A, @R1 ; move data pointed to by R1 to A
	JZ finish ; if A is 0, then end of data has been reached – jump
; out of loop
CALL sendCharacter ; send data in A to LCD module
INC R1 ; point to next piece of data
JMP loop ; repeat
finish:
	JMP $
sendCharacter:
	MOV C, ACC.7 ; |
	MOV P1.7, C ; |
	MOV C, ACC.6 ; |
	MOV P1.6, C ; |
	MOV C, ACC.5 ; |
	MOV P1.5, C ; |
	MOV C, ACC.4 ; |
	MOV P1.4, C ; | high nibble set
	SETB P1.2 ; |
	CLR P1.2 ; | negative edge on E
	MOV C, ACC.3 ; |
	MOV P1.7, C ; |
	MOV C, ACC.2 ; |
	MOV P1.6, C ; |
	MOV C, ACC.1 ; |
	MOV P1.5, C ; |
	MOV C, ACC.0 ; |
	MOV P1.4, C ; | low nibble set
	SETB P1.2 ; |
	CLR P1.2 ; | negative edge on E
	CALL delay ; wait for BF to clear
delay:
	MOV R0, #200
	DJNZ R0, $
	RET
END

	Step 12-A
;save data you wish to display in the RAM
MOV 30H, #'A'
MOV 31H, #'N'
MOV 32H, #'O'
MOV 33H, #'N'
MOV 34H, #'Y'
MOV 35H, #'M'
MOV 36H, #'O'
MOV 37H, #'U'
MOV 38H, #'S'
MOV 39H, #'S'
MOV 3AH, #'E'
MOV 3BH, #'C'
MOV 3CH, #'R'
MOV 3DH, #'E'
MOV 3EH, #'T'
MOV 3FH, #0 ;end of data marker

;initializing the display
CLR P1.3;clear pin RS to select register (0-instruction register for write and busy flag: address counter for read) ;indicate that instructions are being sent to the module

;function set
CLR P1.7 ; |
CLR P1.6 ; |
SETB P1.5 ; |
CLR P1.4 ; | high nibble set

SETB P1.2 ; |
CLR P1.2 ; | negative edge on E

CALL delay ; wait for BF to clear
; function set sent for first time - tells module to
; go into 4-bit mode

SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
; same function set high nibble sent a second time
SETB P1.7 ; low nibble set (only P1.7 needed to be changed)
SETB P1.2 ; |

CLR P1.2 ; | negative edge on E
; function set low nibble sent

CALL delay ; wait for BF to clear

; entry mode set
; set to increment with no shift
CLR P1.7 ; |
CLR P1.6 ; |
CLR P1.5 ; |
CLR P1.4 ; | high nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
SETB P1.6 ; |
SETB P1.5 ; |low nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
CALL delay ; wait for BF to clear

; display on/off control
; the display is turned on, the cursor is turned on and blinking is turned on
CLR P1.7 ; |
CLR P1.6 ; |
CLR P1.5 ; |
CLR P1.4 ; | high nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
SETB P1.7 ; |
SETB P1.6 ; |
SETB P1.5 ; |
SETB P1.4 ; | low nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
CALL delay ; wait for BF to clear

; send data
SETB P1.3 ; clear RS - indicates that data is being sent to
; module
MOV R1, #30H ; data to be sent to LCD is stored in 8051 RAM,
; starting at location 30H
loop:
	MOV A, @R1 ; move data pointed to by R1 to A
	JZ finish ; if A is 0, then end of data has been reached – jump
; out of loop
CALL sendCharacter ; send data in A to LCD module
INC R1 ; point to next piece of data
JMP loop ; repeat
finish:
	JMP $
sendCharacter:
	MOV C, ACC.7 ; |
	MOV P1.7, C ; |
	MOV C, ACC.6 ; |
	MOV P1.6, C ; |
	MOV C, ACC.5 ; |
	MOV P1.5, C ; |
	MOV C, ACC.4 ; |
	MOV P1.4, C ; | high nibble set
	SETB P1.2 ; |
	CLR P1.2 ; | negative edge on E
	MOV C, ACC.3 ; |
	MOV P1.7, C ; |
	MOV C, ACC.2 ; |
	MOV P1.6, C ; |
	MOV C, ACC.1 ; |
	MOV P1.5, C ; |
	MOV C, ACC.0 ; |
	MOV P1.4, C ; | low nibble set
	SETB P1.2 ; |
	CLR P1.2 ; | negative edge on E
	CALL delay ; wait for BF to clear
delay:
	MOV R0, #200
	DJNZ R0, $
	RET
END

	Step 12-B
;save data you wish to display in the RAM
MOV 30H, #'A'
MOV 31H, #'N'
MOV 32H, #'O'
MOV 33H, #'N'
MOV 34H, #'Y'
MOV 35H, #'M'
MOV 36H, #'O'
MOV 37H, #'U'
MOV 38H, #'S'
MOV 39H, #'S'
MOV 3AH, #'E'
MOV 3BH, #'C'
MOV 3CH, #'R'
MOV 3DH, #'E'
MOV 3EH, #'T'
MOV 3FH, #0 ;end of data marker

;initializing the display
CLR P1.3;clear pin RS to select register (0-instruction register for write and busy flag: address counter for read) ;indicate that instructions are being sent to the module

;function set
CLR P1.7 ; |
CLR P1.6 ; |
SETB P1.5 ; |
CLR P1.4 ; | high nibble set

SETB P1.2 ; |
CLR P1.2 ; | negative edge on E

CALL delay ; wait for BF to clear
; function set sent for first time - tells module to
; go into 4-bit mode

SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
; same function set high nibble sent a second time
SETB P1.7 ; low nibble set (only P1.7 needed to be changed)
SETB P1.2 ; |

CLR P1.2 ; | negative edge on E
; function set low nibble sent

CALL delay ; wait for BF to clear

; entry mode set
; set to increment with no shift
CLR P1.7 ; |
CLR P1.6 ; |
CLR P1.5 ; |
CLR P1.4 ; | high nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
SETB P1.6 ; |
SETB P1.5 ; |low nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
CALL delay ; wait for BF to clear

; display on/off control
; the display is turned on, the cursor is turned on and blinking is turned on
CLR P1.7 ; |
CLR P1.6 ; |
CLR P1.5 ; |
CLR P1.4 ; | high nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
SETB P1.7 ; |
SETB P1.6 ; |
SETB P1.5 ; |
SETB P1.4 ; | low nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
CALL delay ; wait for BF to clear

; send data
SETB P1.3 ; clear RS - indicates that data is being sent to
; module
MOV R1, #30H ; data to be sent to LCD is stored in 8051 RAM,
; starting at location 30H
loop:
	MOV A, @R1 ; move data pointed to by R1 to A
	JZ finish ; if A is 0, then end of data has been reached – jump
; out of loop
CALL sendCharacter ; send data in A to LCD module
INC R1 ; point to next piece of data
JMP loop ; repeat
finish:
	JMP $
sendCharacter:
	MOV C, ACC.7 ; |
	MOV P1.7, C ; |
	MOV C, ACC.6 ; |
	MOV P1.6, C ; |
	MOV C, ACC.5 ; |
	MOV P1.5, C ; |
	MOV C, ACC.4 ; |
	MOV P1.4, C ; | high nibble set
	SETB P1.2 ; |
	CLR P1.2 ; | negative edge on E
	MOV C, ACC.3 ; |
	MOV P1.7, C ; |
	MOV C, ACC.2 ; |
	MOV P1.6, C ; |
	MOV C, ACC.1 ; |
	MOV P1.5, C ; |
	MOV C, ACC.0 ; |
	MOV P1.4, C ; | low nibble set
	SETB P1.2 ; |
	CLR P1.2 ; | negative edge on E
	CALL delay ; wait for BF to clear
delay:
	MOV R0, #0FFFFH
	DJNZ R0, $
	RET
END

Part II - LCD Character Display
	Step 1
;save data you wish to display in the RAM
MOV 30H, #'A'
MOV 31H, #'N'
MOV 32H, #'O'
MOV 33H, #'N'
MOV 34H, #'Y'
MOV 35H, #'M'
MOV 36H, #'O'
MOV 37H, #'U'
MOV 38H, #'S'
MOV 39H, #'S'
MOV 3AH, #'E'
MOV 3BH, #'C'
MOV 3CH, #'R'
MOV 3DH, #'E'
MOV 3EH, #'T'
MOV 2FH, #0 ;end of data marker

;initializing the display
CLR P1.3;clear pin RS to select register (0-instruction register for write and busy flag: address counter for read) ;indicate that instructions are being sent to the module

;function set
CLR P1.7 ; |
CLR P1.6 ; |
SETB P1.5 ; |
CLR P1.4 ; | high nibble set

SETB P1.2 ; |
CLR P1.2 ; | negative edge on E

CALL delay ; wait for BF to clear
; function set sent for first time - tells module to
; go into 4-bit mode

SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
; same function set high nibble sent a second time
SETB P1.7 ; low nibble set (only P1.7 needed to be changed)
SETB P1.2 ; |

CLR P1.2 ; | negative edge on E
; function set low nibble sent

CALL delay ; wait for BF to clear

; entry mode set
; set to increment with no shift
CLR P1.7 ; |
CLR P1.6 ; |
CLR P1.5 ; |
CLR P1.4 ; | high nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
SETB P1.6 ; |
SETB P1.5 ; |low nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
CALL delay ; wait for BF to clear

; display on/off control
; the display is turned on, the cursor is turned on and blinking is turned on
CLR P1.7 ; |
CLR P1.6 ; |
CLR P1.5 ; |
CLR P1.4 ; | high nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
SETB P1.7 ; |
SETB P1.6 ; |
SETB P1.5 ; |
SETB P1.4 ; | low nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
CALL delay ; wait for BF to clear

; send data
SETB P1.3 ; clear RS - indicates that data is being sent to
; module
MOV R1, #3EH ; data to be sent to LCD is stored in 8051 RAM,
; starting at location 30H
loop:
	MOV A, @R1 ; move data pointed to by R1 to A
	JZ finish ; if A is 0, then end of data has been reached – jump
; out of loop
CALL sendCharacter ; send data in A to LCD module
DEC R1 ; point to next piece of data
JMP loop ; repeat
finish:
	JMP $
sendCharacter:
	MOV C, ACC.7 ; |
	MOV P1.7, C ; |
	MOV C, ACC.6 ; |
	MOV P1.6, C ; |
	MOV C, ACC.5 ; |
	MOV P1.5, C ; |
	MOV C, ACC.4 ; |
	MOV P1.4, C ; | high nibble set
	SETB P1.2 ; |
	CLR P1.2 ; | negative edge on E
	MOV C, ACC.3 ; |
	MOV P1.7, C ; |
	MOV C, ACC.2 ; |
	MOV P1.6, C ; |
	MOV C, ACC.1 ; |
	MOV P1.5, C ; |
	MOV C, ACC.0 ; |
	MOV P1.4, C ; | low nibble set
	SETB P1.2 ; |
	CLR P1.2 ; | negative edge on E
	CALL delay ; wait for BF to clear
delay:
	MOV R0, #0FFFFH
	DJNZ R0, $
	RET
END

	Step 1
;save data you wish to display in the RAM
MOV 30H, #'A'
MOV 31H, #'N'
MOV 32H, #'O'
MOV 33H, #'N'
MOV 34H, #'Y'
MOV 35H, #'M'
MOV 36H, #'O'
MOV 37H, #'U'
MOV 38H, #'S'
MOV 39H, #'S'
MOV 3AH, #'E'
MOV 3BH, #'C'
MOV 3CH, #'R'
MOV 3DH, #'E'
MOV 3EH, #'T'
MOV 2FH, #0 ;end of data marker

;initializing the display
CLR P1.3;clear pin RS to select register (0-instruction register for write and busy flag: address counter for read) ;indicate that instructions are being sent to the module

;function set
CLR P1.7 ; |
CLR P1.6 ; |
SETB P1.5 ; |
CLR P1.4 ; | high nibble set

SETB P1.2 ; |
CLR P1.2 ; | negative edge on E

CALL delay ; wait for BF to clear
; function set sent for first time - tells module to
; go into 4-bit mode

SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
; same function set high nibble sent a second time
SETB P1.7 ; low nibble set (only P1.7 needed to be changed)
SETB P1.2 ; |

CLR P1.2 ; | negative edge on E
; function set low nibble sent

CALL delay ; wait for BF to clear

; entry mode set
; set to increment with no shift
CLR P1.7 ; |
CLR P1.6 ; |
CLR P1.5 ; |
CLR P1.4 ; | high nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
SETB P1.6 ; |
SETB P1.5 ; |low nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
CALL delay ; wait for BF to clear

; display on/off control
; the display is turned on, the cursor is turned on and blinking is turned on
CLR P1.7 ; |
CLR P1.6 ; |
CLR P1.5 ; |
CLR P1.4 ; | high nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
SETB P1.7 ; |
SETB P1.6 ; |
SETB P1.5 ; |
SETB P1.4 ; | low nibble set
SETB P1.2 ; |
CLR P1.2 ; | negative edge on E
CALL delay ; wait for BF to clear

; send data
SETB P1.3 ; clear RS - indicates that data is being sent to
; module
MOV R1, #3EH ; data to be sent to LCD is stored in 8051 RAM,
; starting at location 30H
loop:
	MOV A, @R1 ; move data pointed to by R1 to A
	JZ finish ; if A is 0, then end of data has been reached – jump
; out of loop
	CALL sendCharacter ; send data in A to LCD module
	DEC R1 ; point to next piece of data
JMP loop ; repeat
finish:
	JMP $
sendCharacter:
	MOV C, ACC.7 ; |
	MOV P1.7, C ; |
	MOV C, ACC.6 ; |
	MOV P1.6, C ; |
	MOV C, ACC.5 ; |
	MOV P1.5, C ; |
	MOV C, ACC.4 ; |
	MOV P1.4, C ; | high nibble set
	SETB P1.2 ; |
	CLR P1.2 ; | negative edge on E
	MOV C, ACC.3 ; |
	MOV P1.7, C ; |
	MOV C, ACC.2 ; |
	MOV P1.6, C ; |
	MOV C, ACC.1 ; |
	MOV P1.5, C ; |
	MOV C, ACC.0 ; |
	MOV P1.4, C ; | low nibble set
	SETB P1.2 ; |
	CLR P1.2 ; | negative edge on E
	CALL delay ; wait for BF to clear
delay:
	MOV R0, #50
	DJNZ R0, $
	RET
END


Laboratory Report: Click here to download the file