Thứ Sáu, 14 tháng 12, 2018

How to interface LCD in 4 bit mode with AVR microcontroller

Developed By: 

Akshay Daga
This article explains interfacing of LCD with ATmega16 using 4-bit mode. In this mode only four pins are used for sending data and command instructions. This mode has the advantage over the 8-bit mode as it uses less number of pins. The remaining pins of the controller are available for normal use.

Interfacing LCD with ATmega16 using 4-bit mode Prototype


The Data or command is sent in nibble form (1 nibble= 4 bit) in the 4-bit mode. The higher nibble is sent first followed by the lower nibble. The function of RS, RW and EN pins remains similar to 8-bit mode.
 
Circuit description:
Connections of LCD with ATmega16 are shown in circuit diagram. In 4-bit mode, the Data lines must be connected with D4, D5, D6 and D7 pins of LCD module.
 
Initialization:
The LCD can be configured in 4-bit mode by sending appropriate instruction which is called “Function set” to it. The Function set is hexadecimal instruction for LCD MPU unit, which selects working modes of LCD. The “Function Set” is mentioned in following table: 
Function Set to configure LCD with AVR
Fig. 2: Function Set to configure LCD with AVR
Description: 
DL - Data Length (DL = 1 8bit, DL = 0 4bit)
N - No. of Lines (N = 1 2Lines, N = 0 1Lines)
F - Fonts (F = 1 5x10 dots, F = 0 5x7 dots)
 
According to table, the value of Function Set for 4 –bit mode will be 0010 0000(0x20) because DL=0. The value “Function Set” for the LCD configuration 2 line (N=1), 5X7 dots (F=0) and 4-bit (DL=0) mode will be 0010 1000(0x28).
 
When the power supply is given to LCD, it remains in 8-bit mode. Now, if 0x20 is sent, lower nibble will not be received by LCD because four data lines (D4-D7) are connected, so 0x02 is sent instead of 0x20.
 
Programming Steps: 
Step1: Initialization of 4-bit mode.
 

void lcd_init() // fuction for intialize 
{
dis_cmd(0x02); // to initialize LCD in 4-bit mode.
dis_cmd(0x28); //to initialize LCD in 2 lines, 5X7 dots and 4bit mode.
dis_cmd(0x0C);
dis_cmd(0x06);
dis_cmd(0x83);
}
 
Other instructions like clear LCD, cursor on etc. are same as mentioned in previous article. Readers can refer datasheet of HD44780 LCD datasheet.
 
Step2: Nibble arrangement.
 
Higher pins of PORTA (PA4-PA7) are connected to data line. So, the higher nibble of a byte can be sent to LCD data lines by masking lower nibble. To send lower nibble, data byte is shifted left for four places. Lower nibble replaces higher nibble by this shifting. Data is sent after masking the byte.
 
Example:         if data is 0011 0010     0x32;
 
                                   0010 0000       0x20
(Masking)                    1111 0000        0xF0
                                   00010000        0x20    (Send to LCD)
Data Transfer from AVR to LCD through Nibble Arrangement
Fig. 3: Data Transfer from AVR to LCD through Nibble Arrangement
 
 
 
 

void dis_cmd(char cmd_value)
{
char cmd_value1;
 
cmd_value1 = cmd_value & 0xF0; //mask lower nibble because PA4-PA7 pins are used. 
lcdcmd(cmd_value1); // send to LCD
 
cmd_value1 = ((cmd_value<<4) & 0xF0); //shift 4-bit and mask
lcdcmd(cmd_value1); // send to LCD
}
 
Step 3: The RS, RW and EN pins are used similar to 8-bit mode.  

Circuit:

Circuit Diagram of How to interface LCD in 4 bit mode with AVR microcontroller
Code:
// Program to interface LCD in 4 bit mode with AVR microcontroller
//#define F_CPU 12000000UL
#include<avr/io.h>
#include<util/delay.h>
#include<inttypes.h>
 
#define rs PA0
#define rw PA1
#define en PA2
 
void lcd_init();
void dis_cmd(char);
void dis_data(char);
void lcdcmd(char);
void lcddata(char);
 
int main(void)
{
unsigned char data0[11]="ENGINEERS";
unsigned char data1[10]="GARAGE";
 
int i=0;
DDRA=0xFF;
lcd_init(); 
 
while(data0[i]!='\0')
{
dis_data(data0[i]);
_delay_ms(200);
i++;
}
 
dis_cmd(0xC5);
 
i=0;
while(data1[i]!='\0')
{
dis_data(data1[i]);
_delay_ms(200);
i++;
}
 
while(1);
}
 
 
 
void lcd_init() // fuction for intialize 
{
dis_cmd(0x02); // to initialize LCD in 4-bit mode.
dis_cmd(0x28); //to initialize LCD in 2 lines, 5X7 dots and 4bit mode.
dis_cmd(0x0C);
dis_cmd(0x06);
dis_cmd(0x83);
}
 
void dis_cmd(char cmd_value)
{
char cmd_value1;
 
cmd_value1 = cmd_value & 0xF0; //mask lower nibble because PA4-PA7 pins are used. 
lcdcmd(cmd_value1); // send to LCD
 
cmd_value1 = ((cmd_value<<4) & 0xF0); //shift 4-bit and mask
lcdcmd(cmd_value1); // send to LCD
}
 
 
void dis_data(char data_value)
{
char data_value1;
 
data_value1=data_value&0xF0;
lcddata(data_value1);
 
data_value1=((data_value<<4)&0xF0);
lcddata(data_value1);
}
 
void lcdcmd(char cmdout)
{
PORTA=cmdout;
PORTA&=~(1<<rs);
PORTA&=~(1<<rw);
PORTA|=(1<<en);
_delay_ms(1);
PORTA&=~(1<<en);
}
 
void lcddata(char dataout)
{
PORTA=dataout;
PORTA|=(1<<rs);
PORTA&=~(1<<rw);
PORTA|=(1<<en);
_delay_ms(1);
PORTA&=~(1<<en);
}
 

Không có nhận xét nào:

Đăng nhận xét

Bài đăng mới nhất

Hướng dẫn sử dụng Cân điện tử Fujihatsu FTC-01

Hướng dẫn sử dụng Cân điện tử Fujihatsu FTC-01 # candientu ,  # fujihatsu ,  # candientufujihatsu  #candientu,  # candientufujhatsu , #fuji...

Bài đăng phổ biến