(Created page with "category: LPC1768 Tutorials =Objective= This is first example on LPC1768 where we start with blinking the LEDs. In this tutorials we are going to discuss how to configur...")
 
 
(88 intermediate revisions by 6 users not shown)
Line 1: Line 1:
 
[[category: LPC1768 Tutorials]]
 
[[category: LPC1768 Tutorials]]
 +
In this tutorial we are going to see how to interface a 2x16 LCD with LPC1768 in 4-bit mode.
 +
As per the name the 2x16 has 2 lines with 16 chars on each lines. It supports all the ascii chars and is basically used for displaying the alpha numeric characters. Here each character is displayed in a matrix of 5x7 pixels.
 +
Apart from alpha numeric chars it also provides the provision to display the custom characters by creating the pattern.
 +
Scope of this tutorial is to show how to display the alpha numeric chars on LCD, Generating and displaying the custom chars will be discussed in subsequent tutorials.
  
  
=Objective=
 
This is first example on LPC1768 where we start with blinking the LEDs.
 
In this tutorials we are going to discuss how to configure the LPC1768 ports for GPIO and then to use to send a low/high signal on it.
 
Lets start blinking with LEDs and then generate the different patterns using the available LEDs.
 
  
=Register Configuration=
+
=LCD UNIT=
As all the LPC1768 SFRs(Special Function Registers) are defined in lpc17xx.h, this has to be included at the beginning of our project/code.
+
Let us look at a pin diagram of a commercially available LCD like '''JHD162''' which uses a '''HD44780''' controller and then describe its operation.
  
LPC1768 has its GPIOs divided into five ports PORT0 - PORT4, although many of them are not physically 32bit wide. Refer the data sheet for more info.
+
[[FILE:Pic16f877aLcdInterface.png]]
The Below registers will be used for Configuring and using the GPIOs registers for sending and receiving the Digital signals.
+
A structure LPC_GPIOn(n= 0,1,2,3) contains all the registers for required for GPIO operation. Refer lpc17xx.h file for more info on the registers.
+
  
 
+
{| class="table table-striped table-hover table-condensed table-bordered"
<b>PINSEL:</b> GPIO Pins Select Register
+
|-class="info"
Every GPIO pin has a minimum of one function and max of four functions. The required function can be selected by configuring the PINSEL register. As there can be up to 4 functions associated with a GPIO pin, two bits for each pin are available to select the function. This concludes that we need two PINSEL registers to configure a PORT pins.
+
| Pin Number || Symbol || Pin Function
By this the first 16(P0.0-P0.16) pin functions of PORT0 and be selected by 32 bits of PINSELO register. The remaining 16 bits(P0.16-P0.32) are configured using 32bits of PINSEL1 register. 
+
As mentioned earlier every pin has max of four functions. Below table shows how to select the function for a particular pin using two bits of the PINSEL register.
+
{| class="wikitable" style="text-align:center; background-color:#ABCDEF;margin: 1em auto 1em auto"
+
!Value||   Function
+
 
|-
 
|-
|00|| Primary (default) function, typically GPIO port
+
|1 || VSS ||Ground
 
|-
 
|-
|01|| First alternate function
+
| 2|| VCC || +5v
 
|-
 
|-
|10|| Second alternate function
+
| 3 || VEE || Contrast adjustment (VO)
 
|-
 
|-
|11|| Third alternate function
+
| 4 || RS || Register Select. 0:Command, 1: Data
|}
+
 
+
 
+
 
+
<b>FIODIR:</b>Fast GPIO Direction Control Register.<br>This register individually controls the direction of each port pin.
+
{| class="wikitable" style="text-align:center; background-color:#ABCDEF;margin: 1em auto 1em auto"
+
!Values|| Direction
+
 
|-
 
|-
|0|| Input
+
| 5 || R/W || Read/Write, R/W=0: Write & R/W=1: Read
 
|-
 
|-
|1|| Output
+
| 6|| EN || Enable. Falling edge triggered
|}
+
 
+
 
+
 
+
<b>FIOSET:</b>Fast Port Output Set Register.<br>This register controls the state of output pins. Writing 1s produces highs at the corresponding port pins. Writing 0s has no effect. Reading this register returns the current contents of the port output register not the physical port value.
+
{| class="wikitable" style="text-align:center; background-color:#ABCDEF;margin: 1em auto 1em auto"
+
!Values||  FIOSET || FIOCLR
+
 
|-
 
|-
|0|| No Effect || No Effect
+
| 7 || D0 || Data Bit 0 (Not used in 4-bit operation)
 +
|-       
 +
| 8 || D1 || Data Bit 1 (Not used in 4-bit operation)
 +
|-       
 +
| 9 || D2 || Data Bit 2 (Not used in 4-bit operation)
 
|-
 
|-
|1|| Sets High on Pin || Sets Low on Pin
+
| 10 || D3 || Data Bit 3 (Not used in 4-bit operation)
|}
+
 
+
 
+
 
+
<b>FIOCLR:</b>Fast Port Output Clear Register.<br>This register controls the state of output pins. Writing 1s produces lows at the corresponding port pins. Writing 0s has no effect.
+
{| class="wikitable" style="text-align:center; background-color:#ABCDEF;margin: 1em auto 1em auto"
+
!Values||    FIOCLR
+
 
|-
 
|-
|0|| No Effect
+
| 11 || D4 || Data Bit 4
 +
|-         
 +
| 12 || D5 || Data Bit 5
 +
|-         
 +
| 13 || D6 || Data Bit 6
 +
|-         
 +
| 14 || D7 || Data Bit 7/Busy Flag
 
|-
 
|-
|1|| Sets Low on Pin
+
| 15 || A/LED+ || Back-light Anode(+)
|}
+
 
+
 
+
 
+
<b>FIOCLR:</b>Fast Port Output Clear Register.<br>This register controls the state of output pins. Writing 1s produces lows at the corresponding port pins. Writing 0s has no effect.
+
{| class="wikitable" style="text-align:center; background-color:#ABCDEF;margin: 1em auto 1em auto"
+
!Values||    FIOCLR
+
|-
+
|0|| No Effect
+
 
|-
 
|-
|1|| Sets Low on Pin
+
| 16 || K/LED- || Back-Light Cathode(-)
 
|}
 
|}
 +
<br><br>
  
 +
Apart from the voltage supply connections the important pins from the programming perspective are the data lines(8-bit Data bus), Register select, Read/Write and Enable pin.<br><br> 
 +
<b>Data Bus:</b> As shown in the above figure and table, an alpha numeric lcd has a 8-bit data bus referenced as D0-D7.
 +
As it is a 8-bit data bus, we can send the data/cmd to LCD in bytes. It also provides the provision to send the the data/cmd in chunks of 4-bit, which is used when there are limited number of GPIO lines on the microcontroller.<br><br> 
 +
<b>Register Select(RS):</b> The LCD has two register namely a Data register and Command register. Any data that needs to be displayed on the LCD has to be written to the data register of LCD. Command can be issued to LCD by writing it to Command register of LCD.
 +
This signal is used to differentiate the data/cmd received by the LCD.<br>
 +
If the RS signal is <b>LOW</b> then the LCD interprets the 8-bit info as <b>Command</b> and writes it <b>Command register</b> and performs the action as per the command.<br> 
 +
If the RS signal is <b>HIGH</b> then the LCD interprets the 8-bit info as <b>data</b> and copies it to <b>data register</b>. After that the LCD decodes the data for generating the 5x7 pattern and finally displays on the LCD.<br><br> 
 +
<b>Read/Write(RW):</b> This signal is used to write the data/cmd to LCD and reads the  busy flag of LCD.
 +
For write operation the RW should be <b>LOW</b> and for read operation the R/W should be <b>HIGH</b>.<br><br> 
 +
<b>Enable(EN):</b> This pin is used to send the enable trigger to LCD.
 +
After sending the data/cmd, Selecting the data/cmd register, Selecting the Write operation. A HIGH-to-LOW pulse has to be send on this enable pin which will latch the info into the LCD register and triggers the LCD to act accordingly.
 +
<br/>
 +
<br/>
  
 
+
=Hardware Connections=
<b>FIOPIN:</b>Fast Port Pin Value Register.<br>This register is used for both reading and writing data from/to the PORT.<br>
+
[[File:LCD 4Bit.jpg|680px]]
<b>Output:</b> Writing to this register places corresponding values in all bits of the particular PORT pins.<br>
+
<b>Input:</b>  The current state of digital port pins can be read from this register, regardless of pin direction or alternate function selection (as long as pins are not configured as an input to ADC).<br>
+
<b>Note:</b>Although it is recommended to configure the PORT direction and pin function before using it.
+
{| class="wikitable" style="text-align:center; background-color:#ABCDEF;margin: 1em auto 1em auto"
+
!Values||    FIOPIN
+
|-
+
|0|| Sets Low on Pin
+
|-
+
|1|| Sets High on Pin
+
|}
+
 
+
 
=Schematic=
 
=Schematic=
 +
Below schematic shows the minimum connection required for interfacing the LCD with the microcontroller.<br>
 +
As we are interfacing the LCD in 4-bit mode, only the higher 4 data lines are used as data bus.
  
=Example1=
+
<html>
In this program we are going to do both INPUT and OUTPUT operation.
+
<img src=https://www.exploreembedded.com/wiki/images/b/b8/LPC1768_4bit_LCD.PNG class="img-responsive">
The port pin to which switch is connected is configured as Input and the pin to which LED is connected is configured as OUTPUT.  
+
</html>
Here the switch status is read and accordingly the LED will be turned ON/OFF.
+
  
<syntaxhighlight>  
+
<br/>
#include <lpc17xx.h>  
+
<br/>
  
#define SwitchPinNumber 11
+
=Port Connection=
#define LedPinNumber    0
+
This section shows how to configure the GPIO for interfacing the LCD.<br>
 +
The below configuration is as per the above schematic. You can connect the LCD to any of the PORT pins available on your boards and update this section accordingly
 +
<html>
 +
<script src="https://gist.github.com/Amritach/dfd031e49d0335167eb8.js"></script>
 +
</html>
 +
<br/>
 +
<br/>
  
/* start the main program */
+
=LCD Operation=
void main()  
+
In this section we are going to see how to send the data/cmd to the LCD along with the timing diagrams.
{
+
First lets see the timing diagram for sending the data and the command signals(RS,RW,EN), accordingly we write the algorithm and finally the code.
    uint32_t switchStatus;
+
SystemInit();                 //Clock and PLL configuration
+
    LPC_GPIO2->FIODIR = ((1<<LedPinNumber) | (0<<SwitchPinNumber)); //Configure the PORT pins as OUTPUT;
+
  
  while(1)
+
===Timing Diagram===
    {
+
The below image shows the timing diagram for sending the data to the LCD.<br>
 +
As shown in the timing diagram  the data is written after sending the RS and RW signals. It is still ok to send the data before these signals.<br>
 +
The only important thing is the data should be available on the databus before generating the High-to-Low pulse on EN pin.
 +
[[File:LCD CmdWrite.jpg|figure: command write]]
 +
<br><br>
  
/* Turn On all the leds and wait for one second */
 
      switchStatus = (LPC_GPIO2->FIOPIN>>SwitchPinNumber) & 0x01 ; // Make all the Port pins as high
 
 
 
  if(switchStatus == 1)
 
  { 
 
    LPC_GPIO2->FIOPIN = (1<<LedPinNumber);
 
  }
 
  else
 
  {
 
  LPC_GPIO2->FIOPIN = (0<<LedPinNumber);
 
  }  
 
}
 
}
 
  
</syntaxhighlight>
+
===Steps for Sending Command:===
 +
# Send the I/P command to LCD.
 +
# Select the Control Register by making RS low.
 +
#Select Write operation making RW low.
 +
#Send a High-to-Low pulse on Enable PIN with some delay_us.
 +
<html>
 +
<script src="https://gist.github.com/Amritach/6e4b08f06568b82fcd64.js"></script>
 +
</html>
 +
<br><br>
  
 +
===Steps for Sending Data:===
 +
# Send the character to LCD.
 +
# Select the Data Register by making RS high.
 +
# Select Write operation making RW low.
 +
# Send a High-to-Low pulse on Enable PIN with some delay_us.
 +
The timings are similar as above only change is that '''RS''' is made high for selecting Data register.
  
=Example2=
+
<html>
This is the alternate method using the stdutils macros.
+
<script src="https://gist.github.com/Amritach/6a137d1bf6a27cefb8de.js"></script>
<syntaxhighlight>
+
</html>
#include <lpc17xx.h> 
+
<br><br>
#include "delay.h"    //User defined library which contains the delay routines
+
#include "stdutils.h"
+
  
#define SwitchPinNumber 11
+
= Code Examples =
#define LedPinNumber    0
+
===Example 1===
 +
Here is the complete code for displaying the data on 2x16 LCD in 4-bit mode.
 +
<html>
 +
<script src="https://gist.github.com/SaheblalBagwan/96e2caabd9824981c464e68d3a11aa8b.js"></script>
 +
</html>
  
/* start the main program */
+
===Using Explore Embedded Libraries :===
void main()  
+
In the above tutorial we just discussed how to interface 2x16Lcd in 4-bit mode.<br>
{
+
Once you know the working of lcd, you can directly use the ExploreEmbedded libraries to play around with your LCD.<br>
    uint32_t switchStatus;
+
For that you need to include the lcd.c/lcd.h and the associated files(delay/stdutils).<br>
SystemInit();                 //Clock and PLL configuration
+
After including these files, the only thing you got to do is to configure the PORTs in lcd.h as per your hardware connection.<br>
    LPC_GPIO2->FIODIR = ((1<<LedPinNumber) | (0<<SwitchPinNumber)); //Configure the PORT pins as OUTPUT;
+
The below sample code shows how to use the already available LCD functions.<br>
 +
Refer this link for more info on LCD libraries.
 +
<html>
 +
<script src="https://gist.github.com/Amritach/d5b38e3fc891c74a1032.js"></script>
 +
</html>
 +
<br><br>
  
  while(1)
+
= Downloads=
    {
+
Download the complete project folder from the below link:
 +
https://codeload.github.com/ExploreEmbedded/Explore-Cortex-M3-LPC1768-Stick-DVB-14001/zip/master<br>
  
/* Turn On all the leds and wait for one second */
 
      switchStatus = util_GetBitStatus(LPC_GPIO2->FIOPIN,SwitchPinNumber); // Make all the Port pins as high
 
 
 
  if(switchStatus == 1)
 
  { 
 
    util_BitSet(LPC_GPIO2->FIOPIN,LedPinNumber);
 
  }
 
  else
 
  {
 
  util_BitClear(LPC_GPIO2->FIOPIN,LedPinNumber);
 
  }  
 
}
 
}
 
  
</syntaxhighlight>
+
Have a opinion, suggestion , question or feedback about the article let it out here!
 +
{{DISQUS}}

Latest revision as of 14:05, 5 May 2016

In this tutorial we are going to see how to interface a 2x16 LCD with LPC1768 in 4-bit mode. As per the name the 2x16 has 2 lines with 16 chars on each lines. It supports all the ascii chars and is basically used for displaying the alpha numeric characters. Here each character is displayed in a matrix of 5x7 pixels. Apart from alpha numeric chars it also provides the provision to display the custom characters by creating the pattern. Scope of this tutorial is to show how to display the alpha numeric chars on LCD, Generating and displaying the custom chars will be discussed in subsequent tutorials.


LCD UNIT

Let us look at a pin diagram of a commercially available LCD like JHD162 which uses a HD44780 controller and then describe its operation.

Pic16f877aLcdInterface.png

Pin Number Symbol Pin Function
1 VSS Ground
2 VCC +5v
3 VEE Contrast adjustment (VO)
4 RS Register Select. 0:Command, 1: Data
5 R/W Read/Write, R/W=0: Write & R/W=1: Read
6 EN Enable. Falling edge triggered
7 D0 Data Bit 0 (Not used in 4-bit operation)
8 D1 Data Bit 1 (Not used in 4-bit operation)
9 D2 Data Bit 2 (Not used in 4-bit operation)
10 D3 Data Bit 3 (Not used in 4-bit operation)
11 D4 Data Bit 4
12 D5 Data Bit 5
13 D6 Data Bit 6
14 D7 Data Bit 7/Busy Flag
15 A/LED+ Back-light Anode(+)
16 K/LED- Back-Light Cathode(-)



Apart from the voltage supply connections the important pins from the programming perspective are the data lines(8-bit Data bus), Register select, Read/Write and Enable pin.

Data Bus: As shown in the above figure and table, an alpha numeric lcd has a 8-bit data bus referenced as D0-D7. As it is a 8-bit data bus, we can send the data/cmd to LCD in bytes. It also provides the provision to send the the data/cmd in chunks of 4-bit, which is used when there are limited number of GPIO lines on the microcontroller.

Register Select(RS): The LCD has two register namely a Data register and Command register. Any data that needs to be displayed on the LCD has to be written to the data register of LCD. Command can be issued to LCD by writing it to Command register of LCD. This signal is used to differentiate the data/cmd received by the LCD.
If the RS signal is LOW then the LCD interprets the 8-bit info as Command and writes it Command register and performs the action as per the command.
If the RS signal is HIGH then the LCD interprets the 8-bit info as data and copies it to data register. After that the LCD decodes the data for generating the 5x7 pattern and finally displays on the LCD.

Read/Write(RW): This signal is used to write the data/cmd to LCD and reads the busy flag of LCD. For write operation the RW should be LOW and for read operation the R/W should be HIGH.

Enable(EN): This pin is used to send the enable trigger to LCD. After sending the data/cmd, Selecting the data/cmd register, Selecting the Write operation. A HIGH-to-LOW pulse has to be send on this enable pin which will latch the info into the LCD register and triggers the LCD to act accordingly.

Hardware Connections

LCD 4Bit.jpg

Schematic

Below schematic shows the minimum connection required for interfacing the LCD with the microcontroller.
As we are interfacing the LCD in 4-bit mode, only the higher 4 data lines are used as data bus.




Port Connection

This section shows how to configure the GPIO for interfacing the LCD.
The below configuration is as per the above schematic. You can connect the LCD to any of the PORT pins available on your boards and update this section accordingly

LCD Operation

In this section we are going to see how to send the data/cmd to the LCD along with the timing diagrams. First lets see the timing diagram for sending the data and the command signals(RS,RW,EN), accordingly we write the algorithm and finally the code.

Timing Diagram

The below image shows the timing diagram for sending the data to the LCD.
As shown in the timing diagram the data is written after sending the RS and RW signals. It is still ok to send the data before these signals.
The only important thing is the data should be available on the databus before generating the High-to-Low pulse on EN pin. figure: command write


Steps for Sending Command:

  1. Send the I/P command to LCD.
  2. Select the Control Register by making RS low.
  3. Select Write operation making RW low.
  4. Send a High-to-Low pulse on Enable PIN with some delay_us.



Steps for Sending Data:

  1. Send the character to LCD.
  2. Select the Data Register by making RS high.
  3. Select Write operation making RW low.
  4. Send a High-to-Low pulse on Enable PIN with some delay_us.

The timings are similar as above only change is that RS is made high for selecting Data register.



Code Examples

Example 1

Here is the complete code for displaying the data on 2x16 LCD in 4-bit mode.

Using Explore Embedded Libraries :

In the above tutorial we just discussed how to interface 2x16Lcd in 4-bit mode.
Once you know the working of lcd, you can directly use the ExploreEmbedded libraries to play around with your LCD.
For that you need to include the lcd.c/lcd.h and the associated files(delay/stdutils).
After including these files, the only thing you got to do is to configure the PORTs in lcd.h as per your hardware connection.
The below sample code shows how to use the already available LCD functions.
Refer this link for more info on LCD libraries.

Downloads

Download the complete project folder from the below link: https://codeload.github.com/ExploreEmbedded/Explore-Cortex-M3-LPC1768-Stick-DVB-14001/zip/master


Have a opinion, suggestion , question or feedback about the article let it out here!