Я подключил дисплей к 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
) не работает должным образом. Я перепробовал все, и я не могу получить дальше. Есть какие-то предложения по поводу того, что я делаю неправильно?