Need help in interfacing PIC16F877A with LCD+keypad

Discussion in 'Embedded Systems and Microcontrollers' started by BlissEva, Jun 28, 2015.

  1. BlissEva

    Thread Starter New Member

    Jun 28, 2015
    20
    1
    im using MPLab IDE with HiTech C Compiler

    //lcd.h file------------------------------------------------------------

    #ifndef __LCD

    #define RS RC2
    #define EN RC3
    #define D4 RC4
    #define D5 RC5
    #define D6 RC6
    #define D7 RC7

    #endif

    void lcd_port(char d) //function to
    {
    if(d & 1) //if w equal 1 (0001)
    D4 = 1; //set D4 data bit to 1
    else //else
    D4 = 0; //set D4 data bit to 0

    if(d & 2) //if w equal 2 (0010)
    D5 = 1; //set D5 data bit to 1
    else //else
    D5 = 0; //set D5 data bit to 0

    if(d & 4) //if w equal 4 (0100)
    D6 = 1; //set D6 data pin to 1
    else //else
    D6 = 0; //set D6 data bit to 0

    if(d & 8) //if w equal 8 (1000)
    D7 = 1; //set D7 data pin to 1
    else //else
    D7 = 0; //set D7 data bit to 0
    }

    void lcd_cmd(char k) //able the LCD sending command
    {
    RS = 0; //able sending commond
    lcd_port(k); //get data from lcd_port(a)
    EN = 0; //enable it
    __delay_ms(4); //delay
    EN = 1; //disable
    }


    lcd_clear() //clear LCD display
    {
    lcd_cmd(0);
    lcd_cmd(1); //Clears all display
    //and returns the cursor
    //to the home position
    }

    void SetCursor(char row, char col) //set cursor of the LCD
    {
    char temp,z,y; //declare temp, z, y
    if(row == 1) //if row equal 1
    {
    temp = 0x80 + col; //0x80 add col and store to temp
    z = temp>>4; //shift temp right 4 bit and store in z
    y = (0x80+col) & 0x0F; // Start Cursor From First Line
    lcd_cmd(z); //call command function
    lcd_cmd(y); //call command function
    }
    else if(row == 2) //if row equal 2
    {
    temp = 0xC0 + col; //0x80 add col and store to temp
    z = temp>>4; //shift temp right 4 bit and store in z
    y = (0xC0+col) & 0x0F; // Start Cursor From Second Line
    lcd_cmd(z); //call command function
    lcd_cmd(y); //call command function
    }
    }

    /* Power initialization to prepare LCD
    * to read/write 8 bits as 2 4-bit nibbles */
    void lcd_init() //Intilize LCD in 4-Bit Mode
    {
    lcd_port(0x00); //clear display
    __delay_ms(20); //delay
    lcd_cmd(0x03); //Special Sequence:Write Function Set.
    __delay_ms(20); //delay
    lcd_cmd(0x03); //Special Sequence:Write Function Set.
    __delay_ms(20); //delay
    lcd_cmd(0x03); //Special Sequence:Write Function Set.
    //write 3 time 0x03 for the LCD change interface to 4 bit

    lcd_cmd(0x02); //set to 4 bit operation
    lcd_cmd(0x02); //set the function set for 4 bit
    lcd_cmd(0x08); //set the function set for 4 bit

    lcd_cmd(0x00); //Display On
    lcd_cmd(0x0C); //Display On
    lcd_cmd(0x00); //Set entry mode
    lcd_cmd(0x06); //Set entry mode
    }




    void WriteChar(char c) //write character data to LCD
    {
    char temp1,y1; //declare temp and y
    temp1 = c&0x0F; //Mask higher 4 bits
    y1 = c&0xF0; //Mask Lower 4 Bits
    RS = 1; //wan data input
    lcd_port(y1>>4); //Data transfer, shift 4 bit right
    EN = 0;
    __delay_ms(5); //Send Enable Signal to LCD
    EN = 1;
    lcd_port(temp1); //data transfer to function port
    EN = 0;
    __delay_ms(5); //Send Enable Signal to LCD
    EN = 1;
    }


    void WriteString(char *str) //convert string to character
    {
    for(int i=0; str!='\0'; i++) //loop the string last character
    WriteChar(str); //call write char function
    }

    //keypad.h file-------------------------------------------------------------------------
    #define R1 RC0
    #define R2 RC1
    #define R3 RC2
    #define R4 RC3

    #define C1 RC4
    #define C2 RC5
    #define C3 RC6
    #define C4 RC7

    #define Keypad_PORT PORTC
    #define Keypad_PORT_Dir TRISC

    //char KeypadEntry(void);

    delay(){
    for (int i=0; i<250; i++){
    NOP();
    }
    }

    void InitKeypad(void){
    Keypad_PORT = 0x00; // Set Keypad port pin values zero
    Keypad_PORT_Dir = 0xF0; // Last 4 pins input, First 4 pins output

    // Enable weak internal pull up on input pins

    }


    char READ_SWITCHES(void)
    {
    R1 = 0; R2 = 1; R3 = 1; R4 = 1; //Test Row A

    if (C1 == 0)
    { delay();
    while (C1==0);
    return '1';
    }
    if (C2 == 0) { delay(); while (C2==0); return '2'; }
    if (C3 == 0) { delay(); while (C3==0); return '3'; }
    if (C4 == 0) { delay(); while (C4==0); return 'A'; }

    R1 = 1; R2 = 0; R3 = 1; R4 = 1; //Test Row B

    if (C1 == 0) { delay(); while (C1==0); return '4'; }
    if (C2 == 0) { delay(); while (C2==0); return '5'; }
    if (C3 == 0) { delay(); while (C3==0); return '6'; }
    if (C4 == 0) { delay(); while (C4==0); return 'B'; }

    R1 = 1; R2 = 1; R3 = 0; R4 = 1; //Test Row C

    if (C1 == 0) { delay(); while (C1==0); return '7'; }
    if (C2 == 0) { delay(); while (C2==0); return '8'; }
    if (C3 == 0) { delay(); while (C3==0); return '9'; }
    if (C4 == 0) { delay(); while (C4==0); return 'C'; }

    R1 = 1; R2 = 1; R3 = 1; R4 = 0; //Test Row D

    if (C1 == 0) { delay(); while (C1==0); return '*'; }
    if (C2 == 0) { delay(); while (C2==0); return '0'; }
    if (C3 == 0) { delay(); while (C3==0); return '#'; }
    if (C4 == 0) { delay(); while (C4==0); return 'D'; }

    return 'n'; // Means no key has been pressed
    }

    char GetKey(void){
    {
    char key = 'n'; // Assume no key pressed

    while(key=='n') // Wait untill a key is pressed
    key = READ_SWITCHES(); // Scan the keys again and again

    return key; //when key pressed then return its value
    }
    }


    //main.c file---------------------------------------------------------------------------------------------------------------

    #include <htc.h>
    #include <pic.h>
    #include "keypad.h"
    __CONFIG (0x3F3A);

    //just follow the datasheet of PIC16F877A and 1602 LCD to define the pin number
    #define RS RC2
    #define EN RC3
    #define D4 RC4
    #define D5 RC5
    #define D6 RC6
    #define D7 RC7

    #define _XTAL_FREQ 8000000 //set the crystal oscillator frquency
    #include "lcd.h"

    void main(){

    char Key = 'n'; // Variable to store pressed key value
    // Initialize Keypad pins
    TRISC = 0xF0; //set Port C as output
    //TRISD = 0xFF;
    //TRISB=0xF0;
    PORTC=0;
    EN = 1;
    ADCON1 = 0XFF;
    OPTION_REG &= 0x7F;
    lcd_init(); //Intilize LCD in 4-Bit Mode
    lcd_clear(); //clear LCD display
    InitKeypad();

    while(1)
    {
    Key = GetKey();
    SetCursor(1,0); //set the LCD to display at first row first column
    WriteString("Hello"); //display name in first line
    SetCursor(2,0);
    WriteString(key); ERROR!
    }

    }
     
  2. ScottWang

    Moderator

    Aug 23, 2012
    4,850
    767
    If you attach the circuit then it will help the members more easy to help you .
     
  3. ErnieM

    AAC Fanatic!

    Apr 24, 2011
    7,386
    1,605
    Sorry you get an "error." I wonder what error that is.

    I do note that "key" is a char type and WriteString() is expecting a pointer to a char and that char is the beginning of a zero terminated array.

    DO use code tags when posting your code.

    DO try to whittle down your code to the smallest section that will still produce the problem.

    And welcome to the forums!
     
  4. shteii01

    AAC Fanatic!

    Feb 19, 2010
    3,377
    494
Loading...