This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

LCD 20x4 (4bits) on lm3s328

Hello everyone.
I have a code for lcd alphanumeric and using a lm3s328 . I am using the driverlib of stelaris , but when I send something to print , nothing appears .
Below follows the codes
Thank you .

//LCD.H
#include "../device/lm3s_cmsis.h"
#include "../driverlib/sysctl.h"
#include "../driverlib/gpio.h"

#ifndef LCD_H_
#define LCD_H_

#define LCD_PORT_ENABLE                  SYSCTL_PERIPH_GPIOB
#define LCD_PORT                         GPIO_PORTB_BASE
#define LCD_D4                           GPIO_PIN_0
#define LCD_D5                           GPIO_PIN_1
#define LCD_D6                           GPIO_PIN_2
#define LCD_D7                           GPIO_PIN_3
#define LCD_RS                           GPIO_PIN_4
#define LCD_EN                           GPIO_PIN_5
//.......//
#endif /* LCD_H_ */
//LCD.C
#include "../device/lm3s_cmsis.h"
#include "../drivers/displays/lcdLPC/lcdLPC.h"

void LcdSendNibble(uint32_t nibble) {
        SysCtlDelay(3000);
        GPIOPinWrite(LCD_PORT, LCD_D4 | LCD_D5 | LCD_D6 | LCD_D7, (nibble & 0xF0));
        GPIOPinWrite(LCD_PORT, LCD_RS, 0x00);

        GPIOPinWrite(LCD_PORT, LCD_EN, LCD_EN);
        SysCtlDelay(1000);
        GPIOPinWrite(LCD_PORT, LCD_EN, 0x00);

        GPIOPinWrite(LCD_PORT, LCD_D4 | LCD_D5 | LCD_D6 | LCD_D7, (nibble & 0x0F) << 4);
        GPIOPinWrite(LCD_PORT, LCD_RS, 0x00);

        GPIOPinWrite(LCD_PORT, LCD_EN, LCD_EN);
        SysCtlDelay(1000);
        GPIOPinWrite(LCD_PORT, LCD_EN, 0x00);
}

void LcdSendByte(uint8_t theByte) {
        LcdSendNibble(theByte >> 4);      // Send the high nibble
        LcdSendNibble(theByte); // send low nibble
}

void LcdSendInstruction(uint8_t theInstruction) {
        GPIOPinWrite(LCD_PORT, LCD_RS, 0x00);   // RS low for characters to display
        LcdSendByte(theInstruction);    // Send the instruction
}

void lcd_gotoxy(uint8_t x, uint8_t y) {
        if (y == 0)
                LcdSendInstruction((1 << LCD_DDRAM) + LCD_ROW_1 + x);
        else if (y == 1)
                LcdSendInstruction((1 << LCD_DDRAM) + LCD_ROW_2 + x);
        else if (y == 2)
                LcdSendInstruction((1 << LCD_DDRAM) + LCD_ROW_3 + x);
        else if (y == 3)
                LcdSendInstruction((1 << LCD_DDRAM) + LCD_ROW_4 + x);
}

void lcd_send_character(uint8_t theChar) {
        GPIOPinWrite(LCD_PORT, LCD_RS, LCD_RS); // RS high for characters to display
        LcdSendByte(theChar);   // Send the command
}

void lcd_print(char *p) {
        while (*p != 0) {
                lcd_send_character(*p++);
        }
}

void lcd_init(void) {
        SysCtlPeripheralEnable(LCD_PORT_ENABLE);
        GPIODirModeSet(LCD_PORT, LCD_D4, GPIO_DIR_MODE_OUT);
        GPIODirModeSet(LCD_PORT, LCD_D5, GPIO_DIR_MODE_OUT);
        GPIODirModeSet(LCD_PORT, LCD_D6, GPIO_DIR_MODE_OUT);
        GPIODirModeSet(LCD_PORT, LCD_D7, GPIO_DIR_MODE_OUT);
        GPIODirModeSet(LCD_PORT, LCD_EN, GPIO_DIR_MODE_OUT);
        GPIODirModeSet(LCD_PORT, LCD_RS, GPIO_DIR_MODE_OUT);

        GPIOPadConfigSet(LCD_PORT, LCD_D4, GPIO_STRENGTH_8MA,
        GPIO_PIN_TYPE_STD);
        GPIOPadConfigSet(LCD_PORT, LCD_D5, GPIO_STRENGTH_8MA,
        GPIO_PIN_TYPE_STD);
        GPIOPadConfigSet(LCD_PORT, LCD_D6, GPIO_STRENGTH_8MA,
        GPIO_PIN_TYPE_STD);
        GPIOPadConfigSet(LCD_PORT, LCD_D7, GPIO_STRENGTH_8MA,
        GPIO_PIN_TYPE_STD);
        GPIOPadConfigSet(LCD_PORT, LCD_EN, GPIO_STRENGTH_8MA,
        GPIO_PIN_TYPE_STD);
        GPIOPadConfigSet(LCD_PORT, LCD_RS, GPIO_STRENGTH_8MA,
        GPIO_PIN_TYPE_STD);

        SysCtlDelay(2500);
        LcdSendNibble(0x03);
        SysCtlDelay(2000);
        LcdSendNibble(0x03);
        SysCtlDelay(2000);
        LcdSendNibble(0x03);
        LcdSendNibble(0x02);
        LcdSendInstruction(0x28);
}
<\pre>


//main.c
#include <stdio.h>
#include "../device/lm3s_cmsis.h"
#include "../driverlib/gpio.h"
#include "../driverlib/sysctl.h"
#include "../inc/hw_sysctl.h"

int main(void) {
        SysTickPeriodSet(SysCtlClockGet());
        SysTickEnable();
        lcd_init();
        lcd_gotoxy(0, 0);
        lcd_print("Teste");
        while (1) {
        }
}



Parents
  • Hello everyone I'm almost getting use this lib . However it seems that I have a masking problem because when I send the command 0x01 ( clear screen) he gets another (left cursor) for example. I'm trying to somehow solve this, but it's complicated. Any suggestions will be very welcome. Below is the code with some corrections , but with the problem described above.

    
    //LCD.C
    #include "../device/lm3s_cmsis.h"
    #include "../drivers/displays/lcdLPC/lcdLPC.h"
    
    void LcdSendNibble(uint32_t nibble) {
            SysCtlDelay(1800);
            GPIOPinWrite(LCD_PORT, LCD_D4 | LCD_D5 | LCD_D6 | LCD_D7, (nibble & 0xF0));
            GPIOPinWrite(LCD_PORT, LCD_EN, LCD_EN);
            SysCtlDelay(1000);
            GPIOPinWrite(LCD_PORT, LCD_EN, 0x00);
    
            SysCtlDelay(1800);
    GPIOPinWrite(LCD_PORT, LCD_D4 | LCD_D5 | LCD_D6 | LCD_D7, ((nibble & 0xF0) << 4)); //point error
            GPIOPinWrite(LCD_PORT, LCD_EN, LCD_EN);
            SysCtlDelay(1000);
            GPIOPinWrite(LCD_PORT, LCD_EN, 0x00);
    }
    
    void LcdSendByte(uint8_t theByte) {
            LcdSendNibble(theByte >> 4);      // Send the high nibble //point error
            LcdSendNibble(theByte);         // send low nibble
    }
    
    /* LcdSendInstruction
     *
     * Sends an instruction to the display.
     *
     * Parameters:
     *      uint8_t command This byte is sent to the display as
     *                                      an instruction (RS low).
     * Returns:
     *      nothing
     */
    void LcdSendInstruction(uint8_t theInstruction) {
            GPIOPinWrite(LCD_PORT, LCD_RS, 0x00);   // RS low for instructions
            LcdSendByte(theInstruction);    // Send the instruction
    }
    
    void lcd_gotoxy(uint8_t x, uint8_t y) {
            if (y == 0)
                    LcdSendInstruction((1 << LCD_DDRAM) + LCD_ROW_1 + x);
            else if (y == 1)
                    LcdSendInstruction((1 << LCD_DDRAM) + LCD_ROW_2 + x);
            else if (y == 2)
                    LcdSendInstruction((1 << LCD_DDRAM) + LCD_ROW_3 + x);
            else if (y == 3)
                    LcdSendInstruction((1 << LCD_DDRAM) + LCD_ROW_4 + x);
    }
    
    void lcd_send_character(uint8_t theChar) {
            GPIOPinWrite(LCD_PORT, LCD_RS, LCD_RS); // RS high for characters to display
            LcdSendByte(theChar);   // Send the command
    }
    
    void lcd_print(char *p) {
            while (*p != 0) {
                    lcd_send_character(*p++);
            }
    }
    
    void lcd_init(void) {
    
            SysCtlPeripheralEnable(LCD_PORT_ENABLE);
    
            GPIODirModeSet(LCD_PORT, LCD_D4, GPIO_DIR_MODE_OUT);
            GPIOPadConfigSet(LCD_PORT, LCD_D4, GPIO_STRENGTH_8MA,
            GPIO_PIN_TYPE_STD);
    
            GPIODirModeSet(LCD_PORT, LCD_D5, GPIO_DIR_MODE_OUT);
            GPIOPadConfigSet(LCD_PORT, LCD_D5, GPIO_STRENGTH_8MA,
            GPIO_PIN_TYPE_STD);
    
            GPIODirModeSet(LCD_PORT, LCD_D6, GPIO_DIR_MODE_OUT);
            GPIOPadConfigSet(LCD_PORT, LCD_D6, GPIO_STRENGTH_8MA,
            GPIO_PIN_TYPE_STD);
    
            GPIODirModeSet(LCD_PORT, LCD_D7, GPIO_DIR_MODE_OUT);
            GPIOPadConfigSet(LCD_PORT, LCD_D7, GPIO_STRENGTH_8MA,
            GPIO_PIN_TYPE_STD);
    
            GPIODirModeSet(LCD_PORT, LCD_RS, GPIO_DIR_MODE_OUT);
            GPIOPadConfigSet(LCD_PORT, LCD_RS, GPIO_STRENGTH_8MA,
            GPIO_PIN_TYPE_STD);
    
            GPIODirModeSet(LCD_PORT, LCD_EN, GPIO_DIR_MODE_OUT);
            GPIOPadConfigSet(LCD_PORT, LCD_EN, GPIO_STRENGTH_8MA,
            GPIO_PIN_TYPE_STD);
    
            GPIOPinWrite(LCD_PORT, LCD_RS, 0x00);   // RS low
            GPIOPinWrite(LCD_PORT, LCD_EN, 0x00);   // EN low
    
            SysCtlDelay(1800);
            LcdSendNibble(0x30);
            SysCtlDelay(1000);
            LcdSendNibble(0x30);
            SysCtlDelay(1000);
            LcdSendNibble(0x30);
            LcdSendNibble(0x20);
    
            LcdSendInstruction(0x01);  // Clear Display (also clear DDRAM content)
    
    

Reply
  • Hello everyone I'm almost getting use this lib . However it seems that I have a masking problem because when I send the command 0x01 ( clear screen) he gets another (left cursor) for example. I'm trying to somehow solve this, but it's complicated. Any suggestions will be very welcome. Below is the code with some corrections , but with the problem described above.

    
    //LCD.C
    #include "../device/lm3s_cmsis.h"
    #include "../drivers/displays/lcdLPC/lcdLPC.h"
    
    void LcdSendNibble(uint32_t nibble) {
            SysCtlDelay(1800);
            GPIOPinWrite(LCD_PORT, LCD_D4 | LCD_D5 | LCD_D6 | LCD_D7, (nibble & 0xF0));
            GPIOPinWrite(LCD_PORT, LCD_EN, LCD_EN);
            SysCtlDelay(1000);
            GPIOPinWrite(LCD_PORT, LCD_EN, 0x00);
    
            SysCtlDelay(1800);
    GPIOPinWrite(LCD_PORT, LCD_D4 | LCD_D5 | LCD_D6 | LCD_D7, ((nibble & 0xF0) << 4)); //point error
            GPIOPinWrite(LCD_PORT, LCD_EN, LCD_EN);
            SysCtlDelay(1000);
            GPIOPinWrite(LCD_PORT, LCD_EN, 0x00);
    }
    
    void LcdSendByte(uint8_t theByte) {
            LcdSendNibble(theByte >> 4);      // Send the high nibble //point error
            LcdSendNibble(theByte);         // send low nibble
    }
    
    /* LcdSendInstruction
     *
     * Sends an instruction to the display.
     *
     * Parameters:
     *      uint8_t command This byte is sent to the display as
     *                                      an instruction (RS low).
     * Returns:
     *      nothing
     */
    void LcdSendInstruction(uint8_t theInstruction) {
            GPIOPinWrite(LCD_PORT, LCD_RS, 0x00);   // RS low for instructions
            LcdSendByte(theInstruction);    // Send the instruction
    }
    
    void lcd_gotoxy(uint8_t x, uint8_t y) {
            if (y == 0)
                    LcdSendInstruction((1 << LCD_DDRAM) + LCD_ROW_1 + x);
            else if (y == 1)
                    LcdSendInstruction((1 << LCD_DDRAM) + LCD_ROW_2 + x);
            else if (y == 2)
                    LcdSendInstruction((1 << LCD_DDRAM) + LCD_ROW_3 + x);
            else if (y == 3)
                    LcdSendInstruction((1 << LCD_DDRAM) + LCD_ROW_4 + x);
    }
    
    void lcd_send_character(uint8_t theChar) {
            GPIOPinWrite(LCD_PORT, LCD_RS, LCD_RS); // RS high for characters to display
            LcdSendByte(theChar);   // Send the command
    }
    
    void lcd_print(char *p) {
            while (*p != 0) {
                    lcd_send_character(*p++);
            }
    }
    
    void lcd_init(void) {
    
            SysCtlPeripheralEnable(LCD_PORT_ENABLE);
    
            GPIODirModeSet(LCD_PORT, LCD_D4, GPIO_DIR_MODE_OUT);
            GPIOPadConfigSet(LCD_PORT, LCD_D4, GPIO_STRENGTH_8MA,
            GPIO_PIN_TYPE_STD);
    
            GPIODirModeSet(LCD_PORT, LCD_D5, GPIO_DIR_MODE_OUT);
            GPIOPadConfigSet(LCD_PORT, LCD_D5, GPIO_STRENGTH_8MA,
            GPIO_PIN_TYPE_STD);
    
            GPIODirModeSet(LCD_PORT, LCD_D6, GPIO_DIR_MODE_OUT);
            GPIOPadConfigSet(LCD_PORT, LCD_D6, GPIO_STRENGTH_8MA,
            GPIO_PIN_TYPE_STD);
    
            GPIODirModeSet(LCD_PORT, LCD_D7, GPIO_DIR_MODE_OUT);
            GPIOPadConfigSet(LCD_PORT, LCD_D7, GPIO_STRENGTH_8MA,
            GPIO_PIN_TYPE_STD);
    
            GPIODirModeSet(LCD_PORT, LCD_RS, GPIO_DIR_MODE_OUT);
            GPIOPadConfigSet(LCD_PORT, LCD_RS, GPIO_STRENGTH_8MA,
            GPIO_PIN_TYPE_STD);
    
            GPIODirModeSet(LCD_PORT, LCD_EN, GPIO_DIR_MODE_OUT);
            GPIOPadConfigSet(LCD_PORT, LCD_EN, GPIO_STRENGTH_8MA,
            GPIO_PIN_TYPE_STD);
    
            GPIOPinWrite(LCD_PORT, LCD_RS, 0x00);   // RS low
            GPIOPinWrite(LCD_PORT, LCD_EN, 0x00);   // EN low
    
            SysCtlDelay(1800);
            LcdSendNibble(0x30);
            SysCtlDelay(1000);
            LcdSendNibble(0x30);
            SysCtlDelay(1000);
            LcdSendNibble(0x30);
            LcdSendNibble(0x20);
    
            LcdSendInstruction(0x01);  // Clear Display (also clear DDRAM content)
    
    

Children
No data