4-bit Initialization

Initialization of LCD is completed only after the reset sequence and basic initialization commands. We have already discussed about the reset sequence of the lcd in the previous section. So lets look at the programming now...

Assembly Program
;In this whole 4-bit tutorial LCD is connected to
;my controller in following way...
;D4 - P3.0
;D5 - P3.1
;D6 - P3.2
;D7 - P3.3
;EN - P3.7
;RS - P3.5

	lcd_port equ P3         ;LCD connected to Port3
	en equ P3.7             ;Enable connected to P3.7
	rs equ P3.5             ;Register select to P3.5
	
lcd_reset:                  ;LCD reset sequence
	mov lcd_port, #0FFH
	mov delay,#20           ;20mS delay
	acall delayms
	mov lcd_port, #83H      ;Data = 30H, EN = 1, First Init
	mov lcd_port, #03H      ;Data = 30H, EN = 0
	mov delay,#15           ;Delay 15mS
	acall delayms
	mov lcd_port, #83H      ;Second Init, Data = 30H, EN = 1

	mov lcd_port, #03H      ;Data = 30H, EN = 0
	mov delay,#5            ;Delay 5mS
	acall delayms
	mov lcd_port, #83H      ;Third Init

	mov lcd_port, #03H
	mov delay,#5            ;Delay 5mS
	acall delayms
	mov lcd_port, #82H      ;Select Data width (20H for 4bit)

	mov lcd_port, #02H      ;Data = 20H, EN = 0
	mov delay,#5            ;Delay 5mS
	acall delayms
	ret


lcd_init:
	acall lcd_reset         ;Call LCD Reset sequence
	mov a,#28H              ;4-bit, 2 line, 5x7 dots

	acall lcd_cmd           ;Call LCD command
	mov a,#0CH              ;Display ON cursor OFF
	acall lcd_cmd           ;Call LCD command
	mov a,#06H              ;Set entry mode (Auto increment)

	acall lcd_cmd           ;Call LCD command
	mov a,#80H              ;Bring cursor to line 1
	acall lcd_cmd           ;Call LCD command
	ret

C Program
//The pins used are same as explained earlier
#define lcd_port    P3

//LCD Registers addresses
#define LCD_EN      0x80
#define LCD_RS      0x20

void lcd_reset()
{
	lcd_port = 0xFF;
	delayms(20);
	lcd_port = 0x03+LCD_EN;
	lcd_port = 0x03;
	delayms(10);
	lcd_port = 0x03+LCD_EN;
	lcd_port = 0x03;
	delayms(1);
	lcd_port = 0x03+LCD_EN;
	lcd_port = 0x03;
	delayms(1);
	lcd_port = 0x02+LCD_EN;
	lcd_port = 0x02;
	delayms(1);
}

void lcd_init ()
{
	lcd_reset();         // Call LCD reset
	lcd_cmd(0x28);       // 4-bit mode - 2 line - 5x7 font. 
	lcd_cmd(0x0C);       // Display no cursor - no blink.
	lcd_cmd(0x06);       // Automatic Increment - No Display shift.
	lcd_cmd(0x80);       // Address DDRAM with 0 offset 80h.
 }

Sending Dommand/Data to LCD in 4-bit mode

Assembly Program
lcd_cmd:                  ;LCD command Routine
	mov temp,a            ;Save a copy of command to temp
	swap a                ;Swap to use higher nibble
	anl a,#0FH            ;Mask the first four bits
	add a,#80H            ;Enable = 1, RS = 0
	mov lcd_port,a        ;Move it to lcd port
	anl a,#0FH            ;Enable = 0, RS = 0
	mov lcd_port,a        ;Move to lcd port

	mov a,temp            ;Reload the command from temp
	anl a,#0FH            ;Mask first four bits
	add a,#80H            ;Enable = 1
	mov lcd_port,a        ;Move to port
	anl a,#0FH            ;Enable = 0
	mov lcd_port,a        ;Move to lcd port

	mov delay,#1          ;delay 1 ms
	acall delayms
	ret

lcd_dat:                  ;LCD data Routine
	mov temp,a            ;Keep copy of data in temp
	swap a                ;We need higher nibble
	anl a,#0FH            ;Mask first four bits
	add a,#0A0H           ;Enable = 1, RS = 1
	mov lcd_port,a        ;Move to lcd port
	nop
	clr en                ;Enable = 0

	mov a,temp            ;Reload the data from temp
	anl a,#0FH            ;we need lower nibble now
	add a,#0A0H           ;Enable = 1, RS = 1
	mov lcd_port,a        ;Move to lcd port
	nop
	clr en                ;Enable = 0

	mov delay,#1          ;Delay 1mS
	acall delayms
	ret

C Program
void lcd_cmd (char cmd)
{ 
	lcd_port = ((cmd >
>
 4) & 0x0F)|LCD_EN;
	lcd_port = ((cmd >
>
 4) & 0x0F);

	lcd_port = (cmd & 0x0F)|LCD_EN;
	lcd_port = (cmd & 0x0F);

	delayus(200);
	delayus(200);
}

void lcd_data (unsigned char dat)
{ 
	lcd_port = (((dat >
>
 4) & 0x0F)|LCD_EN|LCD_RS);
	lcd_port = (((dat >
>
 4) & 0x0F)|LCD_RS);
	
	lcd_port = ((dat & 0x0F)|LCD_EN|LCD_RS);
	lcd_port = ((dat & 0x0F)|LCD_RS);

	delayus(200);
	delayus(200);
}

Share it! Like it!

Conversation

ExperimenterUK
Mon May 25 2015, 06:21 PM
@Subrat Sahu not a simple answer.Create a thread in "General help Guidance and Discussion" forum
Sun May 24 2015, 06:51 AM
Subrat Sahu
I have a confusion about 10 bit adc formula as describe bellow that resolution = Vref/1023 or Vref / 1024
ExperimenterUK
Sat May 23 2015, 08:54 PM
@utpal.. Create a thread in the Pic forum
Thu May 21 2015, 01:04 AM
utpal
i am a hobbist. i work on 8051. just i have started with pic 16f877. but a bitter experiance is going on. as i am programming any code to my pic877 and putting it in my board and it is working, but the 2nd time it is not taking any program,I have experimented just 7 new one pic mcus. result is the same. please tell me the reason. my programmer is TOP3000(universal programmer).
ajay_bhargav
Wed May 20 2015, 04:48 AM
@lak you can use the same code provided you are not using any s52 specific ports and registers.
Mon May 18 2015, 05:58 AM
lak
i used to develop a code for at89s52 shall i use the same code for at89c4051
Sun May 17 2015, 07:57 AM
Ayoosh
what if i have to rotate motor continuously at a step angle of 1.8 degree
ExperimenterUK
Fri May 15 2015, 06:02 PM
@oracle1946.. Post your question in the PIC forum
Fri May 15 2015, 03:48 AM
nadeem232
if some has solution kindly share solution Principles of Electric Circuits,by Thomas L. Floyd
oracle1946
Thu May 14 2015, 03:39 PM
I want to build a PIC16F684 sun logger using either a solar cell (0.5v solar cell or photoresistor). Any help out there?

Downloads

Comments

vipinpathakg
Wed May 27 2015, 05:57 AM
MuhammadTanvir
Sun May 24 2015, 11:02 AM
as_rog
Sun May 17 2015, 08:00 AM
oracle1946
Thu May 14 2015, 03:34 PM
kakaru32
Tue May 12 2015, 04:29 PM
Yateesh
Sat May 09 2015, 02:46 AM
scmg
Fri May 08 2015, 06:40 PM
OMERO
Fri May 08 2015, 11:53 AM

Online

Guests: 55, Members: 0 ...

most ever online: 182184
(Members: , Guests: 182184) on 06 Aug 2010: 05:37 AM

Members: 37662
Newest member: vipinpathakg
Forum Activity
vipinpathakg Avatar
Posted By vipinpathakg
Wed May 27 2015, 04:25 PM
UDN2981 IC is not available in local market. pleas...
ajay_bhargav Avatar
Posted By ajay_bhargav
Wed May 27 2015, 02:17 PM
UDN2981 is required to drive the LED matrix, are y...
vipinpathakg Avatar
Posted By vipinpathakg
Wed May 27 2015, 06:28 AM
I have created all the hardware of 5x7 LED Dotmatr...
ExperimenterUK Avatar
Posted By ExperimenterUK
Mon May 25 2015, 06:16 PM
We need to do some simple tests.Get the speaker to...
mayank058 Avatar
Posted By mayank058
Mon May 25 2015, 04:57 AM
Dear sir, I am taking output from PI...
MuhammadTanvir Avatar
Posted By MuhammadTanvir
Sun May 24 2015, 11:11 AM
Hey guys !! Can somebody please share the proteus ...
ExperimenterUK Avatar
Posted By ExperimenterUK
Sat May 23 2015, 09:52 PM
Does the speaker work?.'Exactly' where on the boa...
ExperimenterUK Avatar
Posted By ExperimenterUK
Sat May 23 2015, 09:44 PM
For all your questions there is a proper, very tec...
mayank058 Avatar
Posted By mayank058
Thu May 21 2015, 04:46 AM
dear sir there is nothing to zip.I just...
ajay_bhargav Avatar
Posted By ajay_bhargav
Wed May 20 2015, 04:57 AM
can you zip your complete project and attach it he...