16×2 LCD With LPC1768 ARM Microcontroller | In Depth

16x2 LCDLCD is an output display device abbreviation for Liquid Crystal Display. Many varieties and types of LCD comes into the market and out of them, 16×2 LCD is the simplest one and is easy to be interfaced. As the name suggests it is a 2 line display and each line supports up-to 16 characters. The 16×2 LCD is a  16 pin device having a PCB mounted controller and a display. The controller listens to the data ports and generates the pattern to be displayed according to the i/p data. Out of 16 Pins, 8 pins are data pins,2 pins for power supply,1 for contrast setting of the display,1 is Register Select,1 is Read/Write select,1 Enable and 2 for the background lightning LED.

 

 

Pin and Memory Details

16x2 LCD LPC1768

Data Pins: The device has 8 data pins which receive data to be displayed from the interfaced device. All the 8 pins carry data in 8-bit mode but in case of 4 bit (Explained later) only  MSB(D5 to D7) pins are used and rest 4 pins are grounded. One more job is done by the data lines, that is these transfers the control signals also from the interfaced circuit to the LCD.

Power Supply: The device needs an external power supply to work. About required voltage can be found from the LCD datasheet.

Contrast Setting: This pin takes input from outside interfaced circuit or voltage source in the range ‘Gnd’ to ‘Vcc’.And according to the voltage level, the contrast of the LCD is set. This is simply done by using one Potentiometer(Variable Resistance) between ‘Vcc’ and ‘Gnd’ and putting the third pin to the LCD  ‘Vee’ pin’.

Register Select: Two types of data come to the LCD Controller one is the ‘Control’ data and the second type of data are the data to be displayed on the screen. But their arrives the confusion which data is what, as all are sent to the same data lines. To get rid of the confusion and complexity of differentiation the LCD is provided with a Register Select(R/S) pin which tells the LCD controller the available data is actually what? If ‘0’is set on R/S pin the controller treats the available data as DATA. If it is set to ‘1’ it treats it as Control Signal.

Enable: This pin enables the LCD to communicate with other devices. Only when there is a pulse at this pin the values given to the LCD data pins received by the LCD.So to establish any type of communication with the LCD you need to supply a pulse at the Enable pin.

R/W: The R/W pin is responsible for all read and write operations. When the pin is LOW it performs the WRITE operations and when the pin is HIGH it performs the READ operations. During Write the data available at the data pins are written to the respective registers depending upon the RS value. And when Read operation is carried out the only reading operation is carried out that is reading the Busy Flag. The red data is available on pin D7.

Different types of memory are present inside the LCD controller namely,

  • DDRAM  ( 80 Bytes ):
  • CGROM :
  • CGRAM: Used for Special character generation.
  • BF – Busy Flag: This shows that a process is currently going on or not inside the controller. The BF is set to ‘1’ if a process is going on or else to ‘0’ if nothing is going on. the BF can be red through the D7 pin of the LCD module.
  • Instruction Register (IR): Instruction register temporarily holds the instructions coming to the module from the data bus (D0-D7).
  • Data Register (DR): Data register temporarily holds the data coming to the module from the data bus (D0-D7).

Operating Modes: The module is operated in 2 modes. First one is 4-bit mode and the second one is 8-bit modes. Both modes are different in the sense that in the case of 4-bit mode only 4 data pins are used whereas in 8-bit mode 8 data pins are used. The 4-bit mode saves 4 pins of the interfacing circuits which becomes important when LCD is to be interfaced to a circuit whose output pins are less. But the 4-bit mode is slower as compared to the 4-bit mode as data has to be transmitted in 4-bit blocks and are transmitted separately as MSB and LSB.

4 bit Mode: In 4-bit mode, the MSB(D5-D7) data pins are only connected and other connections are same as the 8-bit mode or usual configuration. The remaining data pins are grounded.

8 bit Mode: In 8-bit mode, all data pins are connected and other connections are like the enable pin, Register Select Pin, R/W pin are connected.

Programming

Sending Command :

  1. Move Command to port or D0 to D7 pins.
  2. Select the Command register by setting R/S pin 0.
  3. Select Write Operation by selecting R/W pin to 0.
  4. Send a pulse to the enable pin.

Sending Data :

  1. Move Data to port or D0 to D7 pins.
  2. Select the Data register by setting R/S pin 1.
  3. Select Write Operation by selecting R/W pin to 0.
  4. Send a pulse to the enable pin.

Initialization of LCD  in 8-bit mode:

Delay for 20 milliseconds.
Send command 0x03
Delay for 10 milliseconds.
Send command 0x03.
Delay for 10 milliseconds.
Send command 0x03.
Delay for 10 milliseconds.
Send command   0x02     //Cursor Home
Send command   0x38 //8 Bit 2 Line Interface
Send command   0x08   //Display Blank
Send command   0x0c  // Display on Cursor off
Send command   0x01 // Clear Screen
Send command   0x06   // Entry Mode

Initialization of LCD in 4-bit mode:Connection Diagram

Delay for 20 milliseconds.
Send command 0x03
Delay for 10 milliseconds.
Send command 0x03.
Delay for 10 milliseconds.
Send command 0x03.
Delay for 10 milliseconds.
Send command   0x02     //Cursor Home
Send command   0x28 //4 Bit 2 Line Interface
Send command   0x08   //Display Blank
Send command   0x0c  // Display on Cursor off
Send command   0x01 // Clear Screen
Send command   0x06   // Entry Mode

In 4 bit mode, the data and commands are sent in two parts each having 4 bits so, the Command and Data send functions are different for 4 bit and 8-bit modes.

4-Bit mode:

Mask lower 4-bits(MSB is exposed)
Send to the LCD port
Send enable signal
Mask higher 4-bits(LSB is exposed)
Send to LCD port
Send enable signal.

Code for LPC1768
#include < LPC214X.H > #include "Serial.h"#include "Utility.h"
void cw() {
  IOCLR0 = 0x00001000;  //  Clear RS  pin
  // Write Grounded
  IOSET0 = 0x00004000; //    Set Enable
  DelayProc(CCLOCK * 0.05);
  IOCLR0 = 0x00004000;  // Clear Enable
  DelayProc(CCLOCK * 0.05);
}
void dw() {
  IOSET0 = 0x00001000;   //  Set RS  pin
  // Write Grounded
  IOSET0 = 0x00004000;
  DelayProc(CCLOCK * 0.05);
  IOCLR0 = 0x00004000;
  DelayProc(CCLOCK * 0.05);
}
SendComm(unsigned int Comm) {
  Comm = Comm << 16;
  IO0SET = Comm;
  cw();
  IO0CLR = Comm;
  Comm = Comm << 4;    
  IO0SET = Comm;
  cw();
  IO0CLR = Comm;
}
SendData(unsigned int Data) {
  Data = Data << 16;
  IO0SET = Data;
  dw();
  IO0CLR = Data;
  Data = Data << 4;
  IO0SET = Data;
  dw();
  IO0CLR = Data;
}
char writestring(char * s) {
  int i = 0;
  char c;
  c = * s;
  while (c != '') {
    SendData(c);
    i = i + 1;
    c = * (s + i);
  }
}
void initialization() {
  DelayProc(CCLOCK * 0.15);
  SendComm(0x03);
  DelayProc(CCLOCK * 0.05);
  SendComm(0x03);
  DelayProc(CCLOCK * 0.05);
  SendComm(0x03);
  DelayProc(CCLOCK * 0.05);

  SendComm(0x02); //Cursor Home

  //SendComm(0x28); //4 bit 2 rows 5x7 font

  //SendComm(0x2c); //4 Bit 2 Rows 5x10 font
  SendComm(0x2c);

  //SendComm(0x08);//display off cursor off blink off

  //SendComm(0x0c);//display on cursor off blink off
  SendComm(0x0E); //display on cursor on blink off
  //SendComm(0x0F);//display on cursor off blink  on
  //SendComm(0x0E);

  SendComm(0x01); //Clear screen

  //SendComm(0x06);//increment shift 0
  SendComm(0x07); //increment shift 1
  //SendComm(0x04);//Decrement shift 0
  //SendComm(0x05);//Decrement shift 1
  //SendComm(0x06);
}
int main() {
  PINSEL0 = 0x00000000;
  PINSEL1 = 0x00000000;
  IODIR0 = 0xffffffff;
  initialization();

  while (1)

  {
    // SendComm(0x00000001);
    SendComm(0xc4);
    //SendData('A');
    //DelayProc(CCLOCK * 5);
    writestring("Hello World!!");

    //DelayProc(CCLOCK * 0.05);

    //SendComm(0x01);//Clear screen
    //SendComm(0x07);//increment shift 1
  }
}

 

Related posts

Leave a Comment