SPI Lcd Library

The mikroC PRO for ARM provides a library for communication with Lcd (with HD44780 compliant controllers) in 4-bit mode via SPI interface.

For creating a custom set of Lcd characters use Lcd Custom Character Tool.

  Important :

Library Dependency Tree

SPI Lcd Library Dependency Tree

External dependencies of SPI Lcd Library

The implementation of SPI Lcd Library routines is based on Port Expander Library routines.

External dependencies are the same as Port Expander Library external dependencies.

Library Routines

SPI_Lcd_Config

Prototype

void SPI_Lcd_Config(char DeviceAddress);

Description

Initializes the Lcd module via SPI interface.

Parameters
  • DeviceAddress: SPI expander hardware address, see schematic at the bottom of this page
Returns

Nothing.

Requires

External dependencies are the same as Port Expander Library external dependencies.
The SPI module needs to be initialized. See SPIx_Init and SPIx_Init_Advanced routines.

Example

Stellaris

// Port Expander module connections
sbit  SPExpanderRST           at GPIO_PORTA_DATA0_bit;
sbit  SPExpanderCS            at GPIO_PORTA_DATA1_bit;
sbit  SPExpanderRST_Direction at GPIO_PORTA_DIR0_bit;
sbit  SPExpanderCS_Direction  at GPIO_PORTA_DIR1_bit;
// End Port Expander module connections

...

SPI0_Init();                           // Initialize SPI module used with PortExpander
SPI_Lcd_Config(0);

STM32

// Port Expander module connections
sbit  SPExpanderRST           at GPIOB_ODR.B0;
sbit  SPExpanderCS            at GPIOB_ODR.B1;
// End Port Expander module connections

...

// Initialize SPI module used with PortExpander
SPI1_Init_Advanced(_SPI_FPCLK_DIV4, _SPI_MASTER | _SPI_8_BIT |
                   _SPI_CLK_IDLE_LOW | _SPI_FIRST_CLK_EDGE_TRANSITION |
                   _SPI_MSB_FIRST | _SPI_SS_DISABLE | _SPI_SSM_ENABLE | _SPI_SSI_1,
                   &_GPIO_MODULE_SPI1_PB345);

SPI0_Init();  // Initialize SPI module used with PortExpander
SPI_Lcd_Config(0);
Notes

None.

SPI_Lcd_Out

Prototype

void SPI_Lcd_Out(char row, char column, char *text);

Description

Prints text on the Lcd starting from specified position. Both string variables and literals can be passed as a text.

Parameters
  • row: starting position row number
  • column: starting position column number
  • text: text to be written
Returns

Nothing.

Requires

Lcd needs to be initialized for SPI communication, see SPI_Lcd_Config routine.

Example
// Write text "Hello!" on Lcd starting from row 1, column 3:
SPI_Lcd_Out(1, 3, "Hello!");
Notes

None.

SPI_Lcd_Out_Cp

Prototype

void SPI_Lcd_Out_CP(char *text);

Description

Prints text on the Lcd at current cursor position. Both string variables and literals can be passed as a text.

Parameters
  • text: text to be written
Returns

Nothing.

Requires

Lcd needs to be initialized for SPI communication, see SPI_Lcd_Config routine.

Example
// Write text "Here!" at current cursor position:
SPI_Lcd_Out_CP("Here!");
Notes

None.

SPI_Lcd_Chr

Prototype

void SPI_Lcd_Chr(char Row, char Column, char Out_Char);

Description

Prints character on Lcd at specified position. Both variables and literals can be passed as character.

Parameters
  • Row: writing position row number
  • Column: writing position column number
  • Out_Char: character to be written
Returns

Nothing.

Requires

Lcd needs to be initialized for SPI communication, see SPI_Lcd_Config routine.

Example
// Write character "i" at row 2, column 3:
SPI_Lcd_Chr(2, 3, 'i');
Notes

None.

SPI_Lcd_Chr_Cp

Prototype

void SPI_Lcd_Chr_CP(char Out_Char);

Description

Prints character on Lcd at current cursor position. Both variables and literals can be passed as character.

Parameters
  • Out_Char: character to be written
Returns

Nothing.

Requires

Lcd needs to be initialized for SPI communication, see SPI_Lcd_Config routine.

Example
// Write character "e" at current cursor position:
SPI_Lcd_Chr_Cp('e');
Notes

None.

SPI_Lcd_Cmd

Prototype

void SPI_Lcd_Cmd(char out_char);

Description

Sends command to Lcd.

Parameters
  • out_char: command to be sent
Returns

Nothing.

Requires

Lcd needs to be initialized for SPI communication, see SPI_Lcd_Config routine.

Example
// Clear Lcd display:
SPI_Lcd_Cmd(_LCD_CLEAR);
Notes

Predefined constants can be passed to the routine, see Available SPI Lcd Commands.

Available SPI Lcd Commands

SPI Lcd Command Purpose
_LCD_FIRST_ROW Move cursor to the 1st row
_LCD_SECOND_ROW Move cursor to the 2nd row
_LCD_THIRD_ROW Move cursor to the 3rd row
_LCD_FOURTH_ROW Move cursor to the 4th row
_LCD_CLEAR Clear display
_LCD_RETURN_HOME Return cursor to home position, returns a shifted display to its original position. Display data RAM is unaffected.
_LCD_CURSOR_OFF Turn off cursor
_LCD_UNDERLINE_ON Underline cursor on
_LCD_BLINK_CURSOR_ON Blink cursor on
_LCD_MOVE_CURSOR_LEFT Move cursor left without changing display data RAM
_LCD_MOVE_CURSOR_RIGHT Move cursor right without changing display data RAM
_LCD_TURN_ON Turn Lcd display on
_LCD_TURN_OFF Turn Lcd display off
_LCD_SHIFT_LEFT Shift display left without changing display data RAM
_LCD_SHIFT_RIGHT Shift display right without changing display data RAM

Library Example

Default Pin Configuration

Use SPI_Lcd_Init for default pin settings (see the first figure below).

Stellaris

char *text = "mikroElektronika";

// Port Expander module connections
sbit  SPExpanderRST           at GPIO_PORTA_DATA0_bit;
sbit  SPExpanderCS            at GPIO_PORTA_DATA1_bit;
sbit  SPExpanderRST_Direction at GPIO_PORTA_DIR0_bit;
sbit  SPExpanderCS_Direction  at GPIO_PORTA_DIR1_bit;
// End Port Expander module connections

char i;                              // Loop variable

void Move_Delay() {                  // Function used for text moving
  Delay_ms(500);                     // You can change the moving speed here
}

void main() {
  // Initialize SPI module used with PortExpander
  SPI0_Init();

  SPI_Lcd_Config(0);                     // Initialize Lcd over SPI interface
  SPI_Lcd_Cmd(_LCD_CLEAR);               // Clear display
  SPI_Lcd_Cmd(_LCD_CURSOR_OFF);          // Turn cursor off
  SPI_Lcd_Out(1,6, "mikroE");            // Print text to Lcd, 1st row, 6th column
  SPI_Lcd_Chr_CP('!');                   // Append '!'
  SPI_Lcd_Out(2,1, text);                // Print text to Lcd, 2nd row, 1st column

  // SPI_Lcd_Out(3,1,"mikroE");          // For Lcd with more than two rows
  // SPI_Lcd_Out(4,15,"mikroE");         // For Lcd with more than two rows

  Delay_ms(2000);

  // Moving text
  for(i=0; i<4; i++) {                   // Move text to the right 4 times
    SPI_Lcd_Cmd(_LCD_SHIFT_RIGHT);
    Move_Delay();
  }

  while(1) {                             // Endless loop
    for(i=0; i<8; i++) {                 // Move text to the left 7 times
      SPI_Lcd_Cmd(_LCD_SHIFT_LEFT);
      Move_Delay();
    }

    for(i=0; i<8; i++) {                 // Move text to the right 7 times
      SPI_Lcd_Cmd(_LCD_SHIFT_RIGHT);
      Move_Delay();
    }
  }

}

STM32

char *text = "mikroElektronika";

// Port Expander module connections
sbit  SPExpanderRST           at GPIOB_ODR.B0;
sbit  SPExpanderCS            at GPIOB_ODR.B1;
// End Port Expander module connections

char i;                              // Loop variable

void Move_Delay() {                  // Function used for text moving
  Delay_ms(500);                     // You can change the moving speed here
}

void main() {
  // Initialize SPI module used with PortExpander
  SPI1_Init_Advanced(_SPI_FPCLK_DIV4, _SPI_MASTER  | _SPI_8_BIT |
                     _SPI_CLK_IDLE_LOW | _SPI_FIRST_CLK_EDGE_TRANSITION |
                     _SPI_MSB_FIRST | _SPI_SS_DISABLE | _SPI_SSM_ENABLE | _SPI_SSI_1,
                     &_GPIO_MODULE_SPI1_PB345);

  GPIO_Alternate_Function_Enable(&_GPIO_MODULE_SWJ_JTAGDISABLE);

  SPI_Lcd_Config(0);                     // Initialize Lcd over SPI interface
  SPI_Lcd_Cmd(_LCD_CLEAR);               // Clear display
  SPI_Lcd_Cmd(_LCD_CURSOR_OFF);          // Turn cursor off
  SPI_Lcd_Out(1,6, "mikroE");            // Print text to Lcd, 1st row, 6th column
  SPI_Lcd_Chr_CP('!');                   // Append '!'
  SPI_Lcd_Out(2,1, text);                // Print text to Lcd, 2nd row, 1st column

  // SPI_Lcd_Out(3,1,"mikroE");          // For Lcd with more than two rows
  // SPI_Lcd_Out(4,15,"mikroE");         // For Lcd with more than two rows

  Delay_ms(2000);

  // Moving text
  for(i=0; i<4; i++) {                   // Move text to the right 4 times
    SPI_Lcd_Cmd(_LCD_SHIFT_RIGHT);
    Move_Delay();
  }

  while(1) {                             // Endless loop
    for(i=0; i<8; i++) {                 // Move text to the left 7 times
      SPI_Lcd_Cmd(_LCD_SHIFT_LEFT);
      Move_Delay();
    }

    for(i=0; i<8; i++) {                 // Move text to the right 7 times
      SPI_Lcd_Cmd(_LCD_SHIFT_RIGHT);
      Move_Delay();
    }
  }

}
Copyright (c) 2002-2012 mikroElektronika. All rights reserved.
What do you think about this topic ? Send us feedback!
Want more examples and libraries? 
Find them on LibStock - A place for the code