картинки на экране 16х2

Тема в разделе "Arduino & Shields", создана пользователем Nikita, 6 май 2013.

  1. Nikita

    Nikita Гик

    проблема дисплей не хочет рисовать. Вот код
    #include <LiquidCrystal.h>

    /* Описываем наш символ в виде массива битовых масок.
    * Каждый символ - это восемь масок по пять бит.
    * тут 8 - высота клетки экрана
    */
    byte man_with_hat[8] =
    {
    B01110,
    B11111,
    B10001,
    B10001,
    B10001,
    B10001,
    B10001,
    B11111,
    };

    /* Объявляем объект нашего дисплея */
    LiquidCrystal lcd(12, 10, 5, 4, 3, 2);

    void setup()
    {
    /* Регистрируем собственный символы с кодом 1 */
    lcd.createChar(1, man_with_hat);

    /* Начинаем работу с дисплееем */
    lcd.begin(16, 2);
    lcd.print("\1");
    }

    void loop()
    {

    }
     
  2. pasha08

    pasha08 Нерд

    А вы каким экраном пользовались?
     
  3. Nikita

    Nikita Гик

    Winstar WEH001602AGPP5N00001, 16x2
     
  4. HighDigital

    HighDigital Гик

    Проверьте подключение, не на "соплях" ли держатся контакты?
    по коду: порекомендовал бы я вам
    Код (Text):
    /* Объявляем объект нашего дисплея */
    LiquidCrystal lcd(12, 10, 5, 4, 3, 2);
     
    Сразу под #include поставить - лучше в самом начале инициализировать дисплей, вдруг он просто не успевает или ещё что нибудь... ИМХО

    Так же посоветую использовать код из этой статьи, он внизу...
    Удачи!
     
  5. HighDigital

    HighDigital Гик

    + если вы подключаете из темы wiki amperka, то у вас ошибка в :
    Код (Text):
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13); //Тема из вики амперка
    А у вас так:
    Код (Text):
    /* Объявляем объект нашего дисплея */
    LiquidCrystal lcd(12, 10, 5, 4, 3, 2);
    Проверьте... У всех скетчей в инете (почти) по разному подключение, это зависит от удобности, кому то так удобнее, кому то сяк)
     
  6. Megakoteyka

    Megakoteyka Оракул Модератор

    Последовательность компиляции и исполнения программы никоим образом не зависит от того, в каком месте исходника воткнута та или иная строка. Глобальные переменные в любом случае будут проинициализированы в самом начале и лишь затем начнет выполняться код main().
     
    Mitrandir нравится это.
  7. HighDigital

    HighDigital Гик

    Ну а как на счет этого?
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    Вот эта строка наводит на подозрение:
    Код (Text):
    lcd.print("\1");
    Что, если ее переписать так:
    Код (Text):
    lcd.print("\x01");
    В статье на Вики пишут:
     
    HighDigital нравится это.
  9. Nikita

    Nikita Гик

    я пробовал вот этот код, контакты я менял и всё работало, а тут нифига


    #include <LiquidCrystal.h>

    /* Константа: высота символа в точках */
    enum { SYMBOL_HEIGHT = 8 };

    /* Описываем наши собственные символы в виде массивов битовых масок.
    * Каждый символ - это восемь масок по пять бит.
    */
    byte arnie[SYMBOL_HEIGHT] =
    {
    B10101,
    B11111,
    B10111,
    B11111,
    B11111,
    B00111,
    B11110,
    B00000,
    };

    byte skull_and_bones[SYMBOL_HEIGHT] =
    {
    B01110,
    B10101,
    B11011,
    B01110,
    B00000,
    B10001,
    B01110,
    B10001,
    };

    byte lightning[SYMBOL_HEIGHT] =
    {
    B00010,
    B00100,
    B01000,
    B11111,
    B00010,
    B00100,
    B01000,
    B00000,
    };

    /* Константы размеров экрана. Нужны для того, чтобы размер экрана
    * менять только в одном месте, а не по всему коду. Везде, где
    * результат вывода на дисплей должен зависеть от размера экрана,
    * следует использовать эти константы.
    */
    enum { LCD_WIDTH = 16, LCD_HEIGHT = 2 };

    /* Объявляем объект нашего дисплея */
    LiquidCrystal lcd(2, 4, 8, 9, 10, 11);


    void setup()
    {
    /* Регистрируем собственные символы с кодами 0, 1 и 2 */
    lcd.createChar(0, arnie);
    lcd.createChar(1, skull_and_bones);
    lcd.createChar(2, lightning);
    /* Начинаем работу с дисплееем */
    lcd.begin(LCD_WIDTH, LCD_HEIGHT);
    }


    typedef void (*LCD_demo)();

    /* Это список демо-функций. Добавляйте свои или меняйте их порядок,
    * если хотите разнообразить этот скетч :)
    */
    LCD_demo const demos[] =
    {
    showArnie,
    showWarning,
    showScrolling,
    showAutoscroll,
    showRTL
    };

    /* Этот макрос - обычный "синтаксический сахар". Мне просто влом писать
    * по 10 почти одинаковых циклов for. Конечно, в серьёзном коде такое лучше не писать.
    */
    #define dotimes(n, code) for (int i = 0; i < (n); ++i) code;


    void loop()
    {
    dotimes(sizeof(demos) / sizeof(demos[0]),
    {
    demos(); // запускаем очередную демонстрацию

    /* Даём насладиться её последними "кадрами", после чего очищаем экран */
    delay(2000);
    lcd.clear();
    delay(1000);
    });
    }


    void showArnie()
    {
    lcd.cursor(); // показываем курсор
    lcd.blink(); // заставляем его мигать
    delay(1000);

    lcd.write(1); // выводим наш собственный символ с кодом 0 (ноль)
    lcd.write(' ');
    delay(1000);

    lcd.print("I'll be back"); // угадай, кто на экране :)
    delay(1000);

    lcd.noBlink(); // больше мигать не нужно
    lcd.noCursor(); // прячем курсор
    }


    void showWarning()
    {
    /* Так как коды наших собственных символов - от 0 до 7,
    * можно смело использовать запись символов в строке при помощи
    * восьмеричных кодов: \1, \2 и т.д.
    * НО: код 0 (ноль) в C и C++ используется в качестве маркера конца строки,
    * так что используйте lcd.write(0) для вывода нулевого символа.
    */
    lcd.print("Smoke kills \1"); // в конце строки будет черепок с костями
    delay(2000);

    lcd.setCursor(0, 1); // переходим на следующую строку
    /* Можно вывести молнию как в начале, так и в середине */
    lcd.print("\2 AC/DC \2 rocks");
    }


    void showScrolling()
    {
    lcd.print("I'm scrolling");
    delay(1000);

    /* Прокручиваем текст вправо за экран */
    dotimes(16,
    {
    lcd.scrollDisplayRight();
    delay(150);
    });

    /* И возвращаем на место, прокручивая влево */
    dotimes(16,
    {
    lcd.scrollDisplayLeft();
    delay(150);
    });
    }

    void showAutoscroll()
    {
    lcd.setCursor(LCD_WIDTH - 2, 0);
    lcd.autoscroll(); // включаем автопрокрутку

    const char *text = "autoscroll";

    /* Печатаем строку буква за буквой. Текст будет "выползать" справа. */
    dotimes(strlen(text),
    {
    lcd.write(text);
    delay(200);
    });

    lcd.noAutoscroll(); // выключаем автопрокрутку
    }


    void showRTL()
    {
    lcd.setCursor(LCD_WIDTH - 1, 0);
    lcd.rightToLeft(); // теперь пишем справа налево

    const char *text = "tfel-ot-thgir"; // похоже на заклинание

    /* Печатаем строку буква за буквой. Текст будет выводиться задом наперёд. */
    dotimes(strlen(text),
    {
    lcd.write(text);
    delay(200);
    });

    lcd.leftToRight(); // пишем слева направо
    }
     
  10. Megakoteyka

    Megakoteyka Оракул Модератор

    Попробуйте вычистить работающий код до состояния Вашего скетча (насколько это возможно) - будет проще найти, в чем разница.
     
  11. HighDigital

    HighDigital Гик

    В этом коде в основном только графическая часть, красатульки, здесь можно обойтись в 10 строк, удалите все "прибамбасы" в коде.