Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

PIC16f883 and 16x2 LCD Display

Status
Not open for further replies.

kirankumar8951

New Member
Hi,



I am trying to run a sample code of 16x2 lcd with pic18f887 by making some changes with respect to my own circuit like interfacing 8x2 lcd with pic18f883 using 4bit mode.



Things completed: changed pin config, XTAL_FREQ, with respect to my micro controller and also successfully compiled



Problem faced : blank (no) output.



please help me .

*******************MAIN.C*****************************

C:
#include<htc.h>

__CONFIG(LVP_OFF & FCMEN_OFF & IESO_OFF & BOREN_OFF & PWRTE_ON & WDTE_OFF & FOSC_HS);
#define RS RA5
#define EN RA4
#define D4 RC0
#define D5 RC1
#define D6 RC2
#define D7 RC3


#define _XTAL_FREQ 4000000
#include "lcd.h"



void main()
{
int i;
  TRISA = 0X00;
  TRISC = 0x00;
  Lcd4_Init();
  while(1)
  {
    Lcd4_Set_Cursor(1,1);
    Lcd4_Write_String("electroSome LCD Hello World");
    for(i=0;i<15;i++)
    {
      __delay_ms(1000);
      Lcd4_Shift_Left();
    }
    for(i=0;i<15;i++)
    {
      __delay_ms(1000);
      Lcd4_Shift_Right();
    }
    Lcd4_Clear();
    Lcd4_Set_Cursor(2,1);
//Lcd4_Write_String("electroSome LCD Hello World");
    Lcd4_Write_Char('e');
    Lcd4_Write_Char('S');
    __delay_ms(2000);
  }
}

*********************************LCD.H*******************************************

C:
//LCD Functions Developed by electroSome



#ifndef D0
#define D0 RB0
#define D1 RB1
#define D2 RB2
#define D3 RB3
#endif


//LCD 8 Bit Interfacing Functions
void Lcd8_Port(char a)
{
if(a & 1)
D0 = 1;
else
D0 = 0;

if(a & 2)
D1 = 1;
else
D1 = 0;

if(a & 4)
D2 = 1;
else
D2 = 0;

if(a & 8)
D3 = 1;
else
D3 = 0;

if(a & 16)
D4 = 1;
else
D4 = 0;

if(a & 32)
D5 = 1;
else
D5 = 0;

if(a & 64)
D6 = 1;
else
D6 = 0;

if(a & 128)
D7 = 1;
else
D7 = 0;
}
void Lcd8_Cmd(char a)
{
  RS = 0;             // => RS = 0
  Lcd8_Port(a);             //Data transfer
  EN  = 1;             // => E = 1
  __delay_ms(5);
  EN  = 0;             // => E = 0
}

Lcd8_Clear()
{
Lcd8_Cmd(1);
}

void Lcd8_Set_Cursor(char a, char b)
{
if(a == 1)
Lcd8_Cmd(0x80 + b);
else if(a == 2)
Lcd8_Cmd(0xC0 + b);
}

void Lcd8_Init()
{
Lcd8_Port(0x00);
RS = 0;
__delay_ms(25);
///////////// Reset process from datasheet /////////
  Lcd8_Cmd(0x30);
__delay_ms(5);
  Lcd8_Cmd(0x30);
__delay_ms(15);
  Lcd8_Cmd(0x30);
  /////////////////////////////////////////////////////
  Lcd8_Cmd(0x38);    //function set
  Lcd8_Cmd(0x0C);    //display on,cursor off,blink off
  Lcd8_Cmd(0x01);    //clear display
  Lcd8_Cmd(0x06);    //entry mode, set increment
}

void Lcd8_Write_Char(char a)
{
   RS = 1;             // => RS = 1
   Lcd8_Port(a);             //Data transfer
   EN  = 1;             // => E = 1
  __delay_ms(4);
   EN  = 0;             // => E = 04
}

void Lcd8_Write_String(char *a)
{
int i;
for(i=0;a[I]!='\0';i++)
Lcd8_Write_Char(a[I]);
}

void Lcd8_Shift_Right()
{
Lcd8_Cmd(0x1C);
}

void Lcd8_Shift_Left()
{
Lcd8_Cmd(0x18);
}
//End LCD 8 Bit Interfacing Functions

//LCD 4 Bit Interfacing Functions

void Lcd4_Port(char a)
{
if(a & 1)
D4 = 1;
else 
D4 = 0;

if(a & 2)
D5 = 1;
else
D5 = 0;

if(a & 4)
D6 = 1;
else
D6 = 0;

if(a & 8)
D7 = 1;
else
D7 = 0;
}
void Lcd4_Cmd(char a)
{ 
RS = 0;             // => RS = 0
Lcd4_Port(a);
EN  = 1;             // => E = 1
  __delay_ms(4);
  EN  = 0;             // => E = 0
}

Lcd4_Clear()
{
Lcd4_Cmd(0);
Lcd4_Cmd(1);
}

void Lcd4_Set_Cursor(char a, char b)
{
char temp,z,y;
if(a == 1)
{
temp = 0x80 + b;
z = temp>>4;
y = (0x80+b) & 0x0F;
Lcd4_Cmd(z);
Lcd4_Cmd(y);
}
else if(a == 2)
{
temp = 0xC0 + b;
z = temp>>4;
y = (0xC0+b) & 0x0F;
Lcd4_Cmd(z);
Lcd4_Cmd(y);
}
}

void Lcd4_Init()
{
Lcd4_Port(0x00);
   __delay_ms(20);
  Lcd4_Cmd(0x03);
__delay_ms(5);
  Lcd4_Cmd(0x03);
__delay_ms(11);
  Lcd4_Cmd(0x03);
  /////////////////////////////////////////////////////
  Lcd4_Cmd(0x02);    
Lcd4_Cmd(0x02);
  Lcd4_Cmd(0x08);
Lcd4_Cmd(0x00); 
Lcd4_Cmd(0x0C);    
  Lcd4_Cmd(0x00);    
  Lcd4_Cmd(0x06);  
}

void Lcd4_Write_Char(char a)
{
   char temp,y;
   temp = a&0x0F; 
   y = a&0xF0;
RS = 1;             // => RS = 1
   Lcd4_Port(y>>4);             //Data transfer
EN = 1;
__delay_ms(5);
EN = 0;
Lcd4_Port(temp);
EN = 1;
__delay_ms(5);
EN = 0;
}

void Lcd4_Write_String(char *a)
{
int i;
for(i=0;a[I]!='\0';i++)
Lcd4_Write_Char(a[I]);
}

void Lcd4_Shift_Right()
{
Lcd4_Cmd(0x01);
Lcd4_Cmd(0x0C);
}

void Lcd4_Shift_Left()
{
Lcd4_Cmd(0x01);
Lcd4_Cmd(0x08);
}
//End LCD 4 Bit Interfacing Functions[/I][/I][/I][/I]


PLEASE GIVE ME ANY SOLUTION
 
Last edited by a moderator:
Started a new thread for you....

Your LCD init is a bit messy.

Try this... a bit simpler
C:
void Lcd4_Init()
    {
    Lcd4_Port(0x00);
    Lcd4_Cmd(0x03);
   __delay_ms(20);
   Lcd4_Cmd(0x03);
   __delay_ms(5);
     /////////////////////////////////////////////////////
   Lcd4_Cmd(0x28);
   Lcd4_Cmd(0x0C);   
   Lcd4_Cmd(0x06);   
   Lcd4_Cmd(0x00); 
  }
 
Just one thing where you find a 18F883 at

Anyways you may need a

ANSEL=0; in there to set i/o to digital
yep im sure you do he was using port B so he didn't need to worry about ADC stuff
 
Last edited:
Make sure you have a pot connected to the Ve input (wiper to Ve, legs to +5 and ground), and adjust until you can just see the rectangles slightly. If you don't have this, you may not see anything on the display even if the code works perfectly.
 
Jon it could be that after the OP fixes the ADC stuff the code he used is using portB so ADC would not matter But the OP changed to use PORTC and A so they need to clear the ANSEL to use the pins as digital I/O
 
No comment about that Burt. I was just pointing out that if Ve isn't connected to a pot and adjusted, he might not see anything even if it was working perfectly. Some displays are visible with no connect but others appear totally blank if the pot's not adjusted over a very small range.

I'll leave the C coding to you smart guys :)
 
I wasn't saying any thing about the wiring Jon I was just pointing out the ADC stuff needed looked at. And the wiring like you said too needs to be looked at cause the op didn't say he seen anything on the LCD it's would make boxes or something
 
Status
Not open for further replies.

Latest threads

New Articles From Microcontroller Tips

Back
Top