The only difference with the 8bit version is DB0, DB1, DB2 and DB3 on the displaymodule side. These lines are not connected to the processor. Leave those lines unconnected, DON'T SHORT THEM TO GROUND as seen in projects where R/W is tied to ground.
So the initial equates are:
Again, if you want to know how to handle the control lines in your programs, please read the first tutorial on LCD displays. In 4-bit mode, we have to read and write databytes and commandbytes in two separate 'nibbles' (4bit parts). To make only minor changes to the original example, we make two subroutines; one to read two nibbles from the LCD, and the other to write two nibbles to the LCD. Furthermore, the toggling of the EN-line is also taken to these subroutines, because we have to toggle for each nibble.
READ_2_NIBBLES: ORL DATA,#0F0 ;Be sure to release datalines (set outputlatches ;to '1') so we can read the LCD SETB EN MOV A,DATA ;Read first part of the return value (high nibble) CLR EN ANL A,#0F0h ;Only high nibble is usable PUSH ACC SETB EN MOV A,DATA ;Read second part of the return value (low nibble) CLR EN ANL A,#0F0h ;Only high nibble is usable SWAP A ;Last received is actually low nibble, so put it in place MOV R7,A POP ACC ORL A,R7 ;And combine it with low nibble RET WRITE_2_NIBBLES: PUSH ACC ;Save A for low nibble ORL DATA,#0F0h ;Bits 4..7 <- 1 ORL A,#0Fh ;Don't affect bits 0-3 ANL DATA,A ;High nibble to display SETB EN CLR EN POP ACC ;Prepare to send SWAP A ;...second nibble ORL DATA,#0F0h ; Bits 4...7 <- 1 ORL A,#0Fh ; Don't affect bits 0...3 ANL DATA,A ;Low nibble to display SETB EN CLR EN RET |
CHECKING THE BUSY STATUS OF THE LCD
WAIT_LCD:
CLR RS ;It's a command
SETB RW ;It's a read command
LCALL READ_2_NIBBLES ;Take two nibbles from LCD in A
JB ACC.7,WAIT_LCD ;If bit 7 high, LCD still busy
CLR RW ;Turn off RW for future commands
RET
|
Before you may really use the LCD, you must initialise and configure it. This is accomplished by sending a number of initialisation instructions to the LCD.
The first instruction we send must tell the LCD we'll be communicating with it with a 4-bit data bus. We also select a 5x8 dot character font. These two options are selected by sending the command 28h to the LCD as a command. After powering up the LCD, it is in 8-bit mode. Because only four bits are connected, the first command has to be send twice; the first time to switch to 4-bits mode, (the lower 4 bits of the command are not seen), the second time to send it as two nibbles so the lower part is received, too.
CLR RS CLR RW CLR EN SETB EN MOV DATA,#28h CLR EN LCALL WAIT_LCD MOV A,#28h LCALL WRITE_2_NIBBLES ;Write A as two separate nibbles to LCD LCALL WAIT_LCD |
We've now sent the first byte of the initialisation sequence. The second byte of the initialisation sequence is the instruction 0Eh. Thus we must repeat the initialisation code from above, but now with the instruction. Thus the next code segment is:
MOV A,#0Eh LCALL WRITE_2_NIBBLES ;Write A as two separate nibbles to LCD LCALL WAIT_LCD |
Programming Tip: The command 0Eh is really the instruction 08h plus 04h to turn the LCD on. To that an additional 02h is added in order to turn the cursor on.
The last byte we need to send is used to configure additional operational parameters of the LCD. We must send the value 06h.MOV A,#06h LCALL WRITE_2_NIBBLES ;Write A as two separate nibbles to LCD LCALL WAIT_LCD |
Programming Tip: The command 06h is really the instruction 04h plus 02h to configure the LCD such that every time we send it a character, the cursor position automatically moves to the right.
So, in all, our initialisation code is as follows:INIT_LCD: CLR RS CLR RW CLR EN SETB EN MOV DATA,#28h CLR EN LCALL WAIT_LCD MOV A,#28h LCALL WRITE_2_NIBBLES LCALL WAIT_LCD MOV A,#0Eh LCALL WRITE_2_NIBBLES LCALL WAIT_LCD MOV A,#06h LCALL WRITE_2_NIBBLES LCALL WAIT_LCD RET |
CLEAR_LCD: CLR RS MOV A,#01h LCALL WRITE_2_NIBBLES ;Write A as two separate nibbles to LCD LCALL WAIT_LCD RET |
THE "HELLO WORLD" PROGRAM
LCALL INIT_LCD LCALL CLEAR_LCD MOV A,#'H' LCALL WRITE_TEXT MOV A,#'E' LCALL WRITE_TEXT MOV A,#'L' LCALL WRITE_TEXT MOV A,#'L' LCALL WRITE_TEXT MOV A,#'O' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#'W' LCALL WRITE_TEXT MOV A,#'O' LCALL WRITE_TEXT MOV A,#'R' LCALL WRITE_TEXT MOV A,#'L' LCALL WRITE_TEXT MOV A,#'D' LCALL WRITE_TEXT |
CURSOR POSITIONING
Let's again, write the word 'world' on the second line now, from the tenth position:
LCALL INIT_LCD LCALL CLEAR_LCD MOV A,#'H' LCALL WRITE_TEXT MOV A,#'E' LCALL WRITE_TEXT MOV A,#'L' LCALL WRITE_TEXT MOV A,#'L' LCALL WRITE_TEXT MOV A,#'O' LCALL WRITE_TEXT CLR RS MOV A,#0C9h LCALL WRITE_2_NIBBLES LCALL WAIT_LCD MOV A,#'W' LCALL WRITE_TEXT MOV A,#'O' LCALL WRITE_TEXT MOV A,#'R' LCALL WRITE_TEXT MOV A,#'L' LCALL WRITE_TEXT MOV A,#'D' LCALL WRITE_TEXT |
This tutorial has presented the underlying concepts of programming an LCD display in 4bit modus. If things in this document are not clear, please be sure to read again the first tutorial on using LCD modules.
MORE BACKGROUND INFORMATION ABOUT DIFFERENT SIZED LCD MODULES
The HD44780 or compatible controller is basically designed to build LCDisplays with one or two lines with a maximum of 40 characterpositions each. A single HD44780 is able to display two lines of 8 characters each. If we want more, the HD44780 has to be expanded with one or more expansion chips, like the HD 44100 (2 x 8 characters expansion) or the HD 66100 (2 x 16 characters expansion). Seen from the HD44780, the first line starts with 00h; the second line with 40h.
LAYOUT OF DISPLAY MODULES WITHOUT EXPANSION CHIP(S):
LAYOUT OF DISPLAY MODULES WITH EXPANSION CHIP(S)
- 16 characters x 1 line
First Line: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F - 20 characters x 1 line
First Line: 00 01 02 03 04 05 06 07 08 09 40 41 42 43 44 45 46 47 48 49 - 40 characters x 1 line
First Line: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11...27 - 24 characters x 2 lines
First Line:
Second Line:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 - 40 characters x 2 lines
First Line:
Second Line:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11... 27
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51... 67 - 16 characters x 4 lines
First Line:
Second Line:
Third Line:
Fourth Line:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F - 20 characters x 4 lines
First Line:
Second Line:
Third Line:
Fourth Line:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53
14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27
54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 - 24 characters x 4 lines
First Line:
Second Line:
Third Line:
Fourth Line:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57
60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 - 40 characters x 4 lines
First Line:
Second Line:
Third Line:
Fourth Line:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12... 27
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52... 67
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12... 27
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52... 67
Not all possible module configurations are described here, but with the help of this information you must be able to work with different modules. Some (functional, not necessary pin-) compatible chips; to help you to determine your module:Controller:
HD44780 (Hitachi)
KS0066 (Samsung)
SED1278 (Epson)
Expansion 8 x 2:
HD44100 (Hitachi)
KS0061 (Samsung)
M5259 (OKI)
Expansion 12 x 2:
SED1181 (Epson)
Expansion 16 x 2:
HD66100 (Hitachi)
Note: Some modules have black blobs which are chips direct mounted on the pc-board, covered with some resin substantion, so the chips are not recognisable.
REFERENCE: www.8052.com
0 comments:
Post a Comment