Raspberry Pi и дисплей HD44780 20x4 - PullRequest
0 голосов
/ 20 марта 2019

Я подключил дисплей к Raspberry Pi, который использует контроллер HD44780. Проводка была проверена с помощью этого сценария Python:

https://www.raspberrypi -spy.co.uk / 2012/08 / 20x4-ЖК-модуля управления, используя-питон / # prettyPhoto

Вывод правильный. Я пытаюсь прямо сейчас преобразовать это в C ++, используя библиотеку wiringPi. Вот мой код:

#include <wiringPi.h>
#include <iostream>
#include <unistd.h>
#include <errno.h>

class display_t
{
private:
    enum mode_t
    {
        MODE_CMD,
        MODE_CHR
    };
public:
    display_t() :
        initialized_(false)
    {
        /*LCD_RS = 11;
        LCD_E = 10;
        LCD_D4 = 6;
        LCD_D5 = 5;
        LCD_D6 = 4;
        LCD_D7 = 1;*/
        LCD_RS = 7;
        LCD_E = 8;
        LCD_D4 = 25;
        LCD_D5 = 24;
        LCD_D6 = 23;
        LCD_D7 = 18;
        LCD_LINE1 = 0x80;
        LCD_LINE2 = 0xC0;
        LCD_LINE3 = 0x94;
        LCD_LINE4 = 0xD4;
        E_PULSE = 5000;
        E_DELAY = 5000;
    }

    virtual ~display_t()
    {

    }

    bool initialize()
    {
        if (wiringPiSetupGpio() == -1)
        {
            return false;
        }
        pinMode(LCD_E, OUTPUT);
        pinMode(LCD_RS, OUTPUT);
        pinMode(LCD_D4, OUTPUT);
        pinMode(LCD_D5, OUTPUT);
        pinMode(LCD_D6, OUTPUT);
        pinMode(LCD_D7, OUTPUT);

        lcd_byte(0x33, MODE_CMD);
        lcd_byte(0x32, MODE_CMD);
        lcd_byte(0x06, MODE_CMD);
        lcd_byte(0x0C, MODE_CMD);
        lcd_byte(0x28, MODE_CMD);
        lcd_byte(0x01, MODE_CMD);

        usleep(E_DELAY);
        return true;
    }

    void test()
    {
        lcd_string("Blubber", LCD_LINE1);
        lcd_string("Blibber", LCD_LINE2);
        lcd_string("Blobber", LCD_LINE3);
        lcd_string("Blabber", LCD_LINE4);
    }

private:
    int LCD_RS;
    int LCD_E;
    int LCD_D4;
    int LCD_D5;
    int LCD_D6;
    int LCD_D7;
    int LCD_WIDTH;
    char LCD_LINE1;
    char LCD_LINE2;
    char LCD_LINE3;
    char LCD_LINE4;
    int E_PULSE;
    int E_DELAY;
    bool initialized_;

    void lcd_byte(char bits, mode_t mode)
    {
        digitalWrite(LCD_RS, mode == MODE_CMD ? 0 : 1);

        digitalWrite(LCD_D4, bits & 0x10 == 0x10 ? 1 : 0);
        digitalWrite(LCD_D5, bits & 0x20 == 0x20 ? 1 : 0);
        digitalWrite(LCD_D6, bits & 0x40 == 0x40 ? 1 : 0);
        digitalWrite(LCD_D7, bits & 0x80 == 0x80 ? 1 : 0);
        toggle_enable();

        digitalWrite(LCD_D4, bits & 0x01 == 0x01 ? 1 : 0);
        digitalWrite(LCD_D5, bits & 0x02 == 0x02 ? 1 : 0);
        digitalWrite(LCD_D6, bits & 0x04 == 0x04 ? 1 : 0);
        digitalWrite(LCD_D7, bits & 0x08 == 0x08 ? 1 : 0);
        toggle_enable();
    }

    void toggle_enable()
    {
        usleep(E_DELAY);
        digitalWrite(LCD_E, 1);
        usleep(E_PULSE);
        digitalWrite(LCD_E, 0);
        usleep(E_DELAY);
    }

    void lcd_string(const std::string &message, uint8_t line)
    {
        int written = 0;
        lcd_byte(line, MODE_CMD);
        for (char c : message)
        {
            lcd_byte(c, MODE_CHR);
            if (written == 20)
            {
                return;
            }
        }
        /*for (; written < 20; ++written)
        {
            lcd_byte(' ', MODE_CHR);
        }*/
    }
};

int main()
{
    display_t display;
    if (!display.initialize())
    {
        std::cout << "Failed..." << std::endl;
        return -1;
    }
    display.test();
    return 0;
}

Сейчас это очень грубо, и я знаю, что есть много вещей, которые вы можете улучшить (например, константы), он был взломан очень быстро.

Моя проблема: она не работает. Я получаю тарабарщину на дисплее. Даже команда Очистить (0x01) не работает должным образом. Я перепробовал все, и я не могу получить дальше. Есть какие-то предложения по поводу того, что я делаю неправильно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...