Экран WG12864B

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Sergey78, 7 ноя 2014.

  1. Sergey78

    Sergey78 Нуб

    Добрый день.
    Пытаюсь разобраться с подключением экрана WG12864B. Начну немного из далека: поскольку экран для подключения требует очень много пинов, стал подключать его через расширитель портов MCP23S17. Получилось выводить изображение на экран, но почему-то не получается его оттуда читать. Ради эксперимента, подключил его к ардуино напрямую. Примеры из библиотеки GLCD работают. Но использовать эту библиотеку не хочу, слишком большой размер. Для своих целей решил сделать свою "tiny" библиотеку - не такую универсальную, но зато поменьше.
    Описание команд дисплея http://easyelectronics.ru/rabota-s-graficheskim-displeem-wg12864-na-baze-kontrollera-ks0107.html и http://www.embed.com.ua/mikrokontrollernyiy-konstruktor/displey-wg12864-chast-1

    Вроде все ясно и понятно. Итак, примеры из библиотеки GLCD работают, т.е. с подключением все правильно.
    Сделал вот простой скетч: включение, установка координат, вывод "столбца". Но на экране пусто. Что я не так делаю?
    Код:
    Код (Text):

    //Номера пинов.
    #define CS1 10
    #define CS2 11
    #define DI 14
    #define RW 12
    #define E 13
    #define DB0 2
    #define DB1 3
    #define DB2 4
    #define DB3 5
    #define DB4 6
    #define DB5 7
    #define DB6 8
    #define DB7 9

    uint8_t cmd_data =0;

    /* Чтобы не захламлять код кучей digitalWrite,
    простая функция которая выставляет пины. В
    параметрах зачение пина DI, RW и 8 бит данных.
    */
    void command (uint8_t DI_data, uint8_t RW_data, uint8_t data){
        digitalWrite(DI, DI_data);
        digitalWrite(RW, RW_data);

        digitalWrite(DB0, (data & 1));
        digitalWrite(DB1, ((data >>1)) & 1);
        digitalWrite(DB2, ((data >>2)) & 1);
        digitalWrite(DB3, ((data >>3)) & 1);
        digitalWrite(DB4, ((data >>4)) & 1);
        digitalWrite(DB5, ((data >>5)) & 1);
        digitalWrite(DB6, ((data >>6)) & 1);
        digitalWrite(DB7, ((data >>7)) & 1);
    }

    /*
    Функция "дерганья" линии Е
    */
    void strobe(){
        digitalWrite(E, HIGH);
        //delay(500);
        digitalWrite(E, LOW);
    }

    void setup() {
    //Изначально все используемые пины установлены как OUT и LOW
    for(int i=0; i == 15; i++){
        pinMode(i, OUTPUT);
        digitalWrite(i, LOW);
    }

    //Для примера выбрал для записи CS1
    digitalWrite(CS1, HIGH);

    //LCD_ON -
    cmd_data = 0B00111111;
    command(0,0,cmd_data);
    strobe();

    //LCD_GOTO_Y
    cmd_data = 0B01000011;
    command(0,0,cmd_data);
    strobe();

    //LCD_GOTO_X
    cmd_data = 0B10111011;
    command(0,0,cmd_data);
    strobe();
    }

    void loop() {

    //LCD_WRITE
    cmd_data = 0B11100111;
    command(1,0,cmd_data);
    strobe();

    delay(500);
    }
     
    Почему не работает? Я ожидаю, что экран включится (LCD_ON), установит координаты в 3 столбец и 3 строку и выведет вертикальную линию из 8 точек. При этом Y автоматически увеличится и через 0.5 секунды будет вывод в соседний столбец. Вообщем что-то должно происходить :) Но на экране пусто.
    Пробовал менять задержку в функции strobe - 2, 10, 100, 500, но реакции нет.
     
    Последнее редактирование: 7 ноя 2014