Anda di halaman 1dari 4

To send commands we simply need to select the command register.

Everything is same as we have done in the initialization


routine. But we will summarize the common steps and put them in a single subroutine. Following are the steps:

Move data to LCD port


select command register
select write operation
send enable signal
wait for LCD to process the command

Keeping these steps in mind we can write LCD command routine as.

CODE:

;Ports used are same as the previous example


;Routine to send command to LCD
LCD_command:
mov
clr
clr
setb
clr
acall
ret
;
;
;
;
;
;

LCD_data,A
LCD_rs
LCD_rw
LCD_en
LCD_en
LCD_busy

;Move the command to LCD port


;Selected command register
;We are writing in instruction register
;Enable H->L
;Wait for LCD to process the command
;Return from busy routine

Usage of the above routine


A will carry the command for LCD
e.g. we want to send clear LCD command
mov
a,#01H
acall LCD_command

;01H is command for clearing LCD


;Send the command

The equivalent C code Keil C compiler. Similar code can be written for SDCC.

CODE:

void LCD_command(unsigned char var)


{
LCD_data = var;
//Function set: 2 Line, 8-bit, 5x7 dots
LCD_rs
= 0;
//Selected command register
LCD_rw
= 0;
//We are writing in instruction register
LCD_en
= 1;
//Enable H->L
LCD_en
= 0;
LCD_busy();
//Wait for LCD to process the command
}
// Using the above function is really simple
// var will carry the command for LCD
// e.g.
//
// LCD_command(0x01);

Setting cursor position on LCD


To set the cursor position on LCD, we need to send the DDRAM address...
CODE:
Bit7 6
5
4
3
2
1
0
1
AD6 AD5 AD4 AD3 AD2 AD1 AD0

The seventh bit is always 1, and bit 0 to 7 are DDRAM address (See
theintroduction section of LCD). so if you want to put the cursor on first
position the address will be '0000000B' in binary and 7th bit is 1. so address
will be 0x80, so for DDRAM all address starts from 0x80.
For 2 line and 16 character LCD. The adress from 0x80 to 0x8F are visible on
first line and 0xC0 to 0xCF is visible on second line, rest of the DDRAM area is
still available but is not visible on the LCD, if you want to check this thing,
then simply put a long sting greater than 16 character and shift the entire
display, you will see all the missing character coming from the back.. this way
you can make scrolling line on LCD (see more on shifting display in commands
section).
Below is an example for setting cursor position on LCD.
CODE:

;We are placing the cursor on the 4th position


;so the DDRAM address will be 0x03
;and the command will be 0x80+0x03 = 0x83
mov a,#83H
;load the command
acall LCD_command
;send command to LCD

CODE:
// to do the same thing is C
// as we done before
LCD_command(0x83);

Sending Data to LCD


To send data we simply need to select the data register. Everything is same as
the command routine. Following are the steps:
Move data to LCD port
select data register

select write operation


send enable signal
wait for LCD to process the data

Keeping these steps in mind we can write LCD command routine as.
CODE:

;Ports used are same as the previous example


;Routine to send data (single character) to LCD
LCD_senddata:
mov
setb
clr
setb
clr
acall
ret
;
;
;
;
;
;

LCD_data,A
LCD_rs
LCD_rw
LCD_en
LCD_en
LCD_busy

;Move the command to LCD port


;Selected data register
;We are writing
;Enable H->L
;Wait for LCD to process the data
;Return from busy routine

Usage of the above routine


A will carry the character to display on LCD
e.g. we want to print A on LCD
mov
a,#'A'
acall LCD_senddata

;Ascii value of 'A' will be loaded in accumulator


;Send data

The equivalent C code Keil C compiler. Similar code can be written for SDCC.
CODE:

void LCD_senddata(unsigned char var)


{
LCD_data = var;
//Function set: 2 Line, 8-bit, 5x7 dots
LCD_rs
= 1;
//Selected data register
LCD_rw
= 0;
//We are writing
LCD_en
= 1;
//Enable H->L
LCD_en
= 0;
LCD_busy();
//Wait for LCD to process the command
}
// Using the above function is really simple
// we will pass the character to display as argument to function
// e.g.
//
// LCD_senddata('A');

Now you have seen that its really easy to send command and data to LCD.
Now what if we have a string to send to LCD? how we are going to do that?

Is simple, we will store the LCD string in the ROM of controller and call the
string character by character. A simple exmple is shown below.
CODE:

;Sending string to LCD Example


LCD_sendstring:
clr
a
movc a,@a+dptr
jz
exit
acall lcd_senddata
inc
dptr
sjmp LCD_sendstring
exit:
ret
;
;
;
;
;
;
;
;
;
;
;
;

;clear Accumulator for any previous data


;load the first character in accumulator
;go to exit if zero
;send first char
;increment data pointer
;jump back to send the next character
;End of routine

Usage of the above routine


DPTR(data pointer) will carry the address
of string to send to LCD.
e.g. we want to print "LCD Tutorial" on LCD then
mov
dptr,#my_string
acall LCD_sendstring

;my_string is the label where the string is stored


;Send string

To store a string..
my_string:
DB
"LCD Tutorial", 00H
00H indicate that string is finished.

The equivalent C code Keil C compiler. Similar code can be written for SDCC.
CODE:

void LCD_sendstring(unsigned char *var)


{
while(*var)
//till string ends
LCD_senddata(*var++); //send characters one by one
}
// Using the above function is really simple
// we will pass the string directly to the function
// e.g.
//
// LCD_sendstring("LCD Tutorial");

Anda mungkin juga menyukai