Continue to Site

Welcome to

Welcome to our site! is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

[SOLVED] LCD Shift Left and Shift Right Text Problem

Not open for further replies.


Full Member level 4
Nov 29, 2010
Reaction score
Trophy points
Activity points
Hi guys I am usig MikroC Compiler with PIC16F887 microcontroller. I have written a program to move text left and right. The text is moving left and right but the problem is when text moves left the moved part of the text comes from right.
See the picture below,

I want the text moves towards left completely so that LCD become blank then text moves in.But as you can see in the picture when text moves left it comes in from right. Note that it happens for both left and right but I am only giving left move example.

The program is,
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections

char txt1[] = "mikroElektronika";
char txt2[] = "EasyPIC6";
char txt3[] = "Lcd4bit";
char txt4[] = "example";

char i; // Loop variable

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

void main(){
ANSEL = 0; // Configure AN pins as digital I/O
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;

Lcd_Init(); // Initialize LCD

Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1,6,txt3); // Write text in first row

Lcd_Out(2,6,txt4); // Write text in second row
Lcd_Cmd(_LCD_CLEAR); // Clear display

Lcd_Out(1,1,txt1); // Write text in first row
Lcd_Out(2,5,txt2); // Write text in second row


// Moving text

while(1) { // Endless loop
for(i=0; i<13; i++) { // Move text to the left 7 times

for(i=0; i<13; i++) { // Move text to the right 7 times
Any idea

My guess would be that the Lcd_Cmd(_LCD_SHIFT_LEFT) function is changing the viewing window into the LCD's RAM (it isn't really shifting the characters). Perhaps this is just a bug in the simulator? Does the real LCD behave this way?

It may be by shifting this window too far, you start seeing the end of the RAM buffer and thus your characters become visible again.

You may need to implement your own function to do what you want.
Last edited:

Check the RAM map of the LCD module, it's quite common for the top line memory to be longer than the physical display line and it may be wrapping around to the third line. Same with the second and last lines.
As @grieblm states, the shift commands just slide the viewable part of the RAM along the memory map.

It isn't easy to fix, the simplest way is to treat each line as a RAM buffer in your program then transfer it to the LCD each time you update it, in other words do the shift in your own software then update the whole display in one go.


You guys are right the MikroC manual says about these commands, that

"_LCD_SHIFT_LEFT Shift display left without changing display data RAM
_LCD_SHIFT_RIGHT Shift display right without changing display data RAM

Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to