MT-6116 + AVR

Обсуждаем контроллеры компании Atmel.
Ответить
Artem148
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Сб мар 29, 2014 18:04:50

MT-6116 + AVR

Сообщение Artem148 »

Доброго времени.
Пожалуйста тыкнете носом в ошибку =)

Спойлер

Код: Выделить всё

/*
 * ATMega8_GLCD.cpp
 *
 * Created: 29.03.2014 14:01:14
 *  Author: Администратор
 */

#define F_CPU 8000000UL


#include <avr/io.h>
#include <avr/delay.h>

#define GLCD_DATA_DDR  DDRD
#define GLCD_DATA_PORT PORTD

#define GLCD_CTRL_DDR  DDRC
#define GLCD_CTRL_PORT PORTC

#define GLCD_CTRL_A0   _BV(0)
#define GLCD_CTRL_RW   _BV(1)
#define GLCD_CTRL_E    _BV(2)
#define GLCD_CTRL_RES  _BV(3)

#define GLCD_SET_A0  GLCD_CTRL_PORT |= GLCD_CTRL_A0
#define GLCD_SET_RW  GLCD_CTRL_PORT |= GLCD_CTRL_RW
#define GLCD_SET_E   GLCD_CTRL_PORT |= GLCD_CTRL_E
#define GLCD_SET_RES GLCD_CTRL_PORT |= GLCD_CTRL_RES

#define GLCD_RESET_A0  GLCD_CTRL_PORT &= ~GLCD_CTRL_A0
#define GLCD_RESET_RW  GLCD_CTRL_PORT &= ~GLCD_CTRL_RW
#define GLCD_RESET_E   GLCD_CTRL_PORT &= ~GLCD_CTRL_E
#define GLCD_RESET_RES GLCD_CTRL_PORT &= ~GLCD_CTRL_RES


void WaitReady(void)     //Ждать готовности индикатора, опрашивая байт статуса
 {             
   GLCD_DATA_DDR = 0x00;           //При необходимости настроить здесь шину данных на вxод
   
   GLCD_SET_RW;
   GLCD_RESET_A0;                   //Чтение флага занятости
   _delay_us(1);                  //Это время предустановки адреса (tAW)
   GLCD_SET_E;
   _delay_us(1);                   //Минимально допустимая длительность сигнала E=1 (время доступа (tACC) попало сюда)
   while(GLCD_DATA_PORT & 1<<7);   //Ждать сброса флага занятости
   GLCD_RESET_E;
   _delay_us(2);                   //Минимально допустимый интервал между сигналами E=1
}

void WriteByte(char b, bool cd) //Процедура выдачи байта в индикатор
 {   
    WaitReady();                  //Ждать готовности индикатора
    GLCD_DATA_DDR = 0xFF;          //При необходимости настроить здесь шину данных на вывод
    GLCD_RESET_RW;     
    if (cd)                        //Выдача байта в индикатор как данных или команды
    {
       GLCD_SET_A0;
    }
    else
    {
       GLCD_RESET_A0;
    }
    GLCD_DATA_PORT = b;         //Выдать байт на шину данных индикатора
    _delay_us(1);                 //Это время предустановки адреса (tAW)
    GLCD_SET_E;
    _delay_us(1);                  //Длительность сигнала E=1 (время предустановки данных попало сюда (tDS))
    GLCD_RESET_E;
   _delay_us(2);                  //Минимально допустимый интервал между сигналами E=1
}

char ReadByte(bool cd)
 {
   char b;
   WaitReady();                 //Ждать готовности индикатора
   GLCD_SET_RW;
   if (cd)                        //Будем читать байт как команду или данные
   {
      GLCD_SET_A0;
   }
   else
   {
      GLCD_RESET_A0;
   }
   
   GLCD_DATA_DDR = 0x00;
   
   _delay_us(1);      //Это время предустановки адреса (tAW)
   GLCD_SET_E;       //Выдать строб в индикатор
   _delay_us(1);      //Минимально допустимая длительность сигнала E=1 (время доступа (tACC) попало сюда)
   b = GLCD_DATA_PORT;   //Прочитать данные с шины индикатора (они на ней уже минимум 120нс)
   GLCD_RESET_E;      //Сбросить сигнал E
   _delay_us(2);       //Минимально допустимый интервал между сигналами E=1
   return b;          //Вернуть прочитанный байт
}

void WriteCode(bool b)
{
   WriteByte(b,0);
}

void WriteData(char b)
{
   WriteByte(b,1);
}

char ReadData(void)   //Прочитать байт данных из индикатора
{
   return ReadByte(1);
}

void LCDinit(void)
{
   GLCD_RESET_E;     //Начальное значение сигнала индикатору
   GLCD_RESET_RES;   //Выдать сигнал RES=0 индикатору
   _delay_us(11);    //Задержка на время больше 10 мкс
   GLCD_SET_RES;     //Снять сигнал RES
   _delay_ms(2);     //Задержка на время больше 1 мс
   
   WriteCode(0xE2);  //Reset
   WriteCode(0xEE);  //ReadModifyWrite off
   WriteCode(0xA4);  //Включить обычный режим
   WriteCode(0xA8);  //Мультиплекс 1/16
   WriteCode(0xC0);  //Верхнюю строку на 0
   WriteCode(0xA0);  //NonInvert scan RAM
   WriteCode(0xAF);  //Display on
}

void Pset(char x, char y, bool c) //Записать одну точку в индикатор (координата 0,0 в левом верхнем углу индикатора)
{
   char c8;                       //Временное хранение считанного из индикатора байта
   char m8;                       //Маска нужного бита в байте
   
   if ((x>60)||(y>15)) return;    //Выход за пределы индикатора
   
   WriteCode(0xB8|(y>>3));        //Установить нужную страницу индикатора
   WriteCode(x);                  //Установить адрес нужного байта
   
   c8 = ReadData();               //Фиктивное чтение
   c8 = ReadData();               //Чтение нужного байта из индикатора
   
   m8 = 1<<(y&0x07);              //Вычислить маску нужного бита в байте
   
   if(c==1)                       
   {
      c8 = m8;                   //Установить нужный бит в байте
   }      
   else      
   {
      c8 &= ~m8;                 //Сбросить нужный бит в байте
   }
   
   WriteCode(x);                  //Снова установить адрес нужного байта
   WriteData(c8);                 //Записать изменённый байт обратно в индикатор
}

//Данные изображения, побитые по строкам и байты будут на индикаторе вертикально.
//Это просто последовательность байт для записи в индикатор начиная с верхней страницы.
//Полностью соответствуют картинке распределения ОЗУ в документации на модуль.
const char Logo61[2][61]=//61x16 pixel, каждые 8 вертикальных точек собраны в байт
{
   {   0xF8,0xFC,0xFE,0xFB,0xEF,0x7F,0x1F,0x0F,0x0F,0x3F,
      0x1F,0x0F,0xBE,0x0C,0x18,0xE0,0x00,0x00,0x08,0x88,
      0xE8,0xE8,0xE8,0x08,0x88,0xE8,0xE8,0xE8,0x08,0x08,
      0xC8,0xE8,0xE8,0x68,0x68,0x68,0x68,0xE8,0xC8,0xC8,
      0x88,0x08,0x08,0x08,0x08,0x88,0xC8,0xE8,0xE8,0xE8,
      0x68,0x68,0x68,0x68,0xE8,0xE8,0xE8,0x68,0x68,0x68,
      0x68
   },
   {   0x0F,0x18,0x27,0x4F,0x43,0x80,0x80,0x80,0x80,0x80,
      0x80,0x40,0x40,0xE8,0xFC,0xFF,0x7C,0x1E,0x0F,0x07,
      0xFF,0xFF,0xFF,0x1F,0x0F,0xFF,0xFF,0xFF,0x00,0x20,
      0x70,0x70,0xE6,0xCE,0xCE,0xCE,0xCE,0xE4,0x71,0x3F,
      0xFF,0xF0,0xF8,0x7C,0x3F,0x0F,0x07,0xFF,0xFF,0xFF,
      0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,
      0x00
   }
};


int main(void)
{
   LCDinit();
   
   for(char p=0; p<2; p++)
   {                                //Цикл по всем 2-м страницам индикатора
      WriteCode(p|0xB8);           //Установка текущей страницы для обоих кристаллов индикатора
      WriteCode(0x00);             //Установка текущего адреса для записи данных в 0
      
      for(char c=0; c<61; c++)     //Цикл вывода
      {           
         WriteData(Logo61[p][c]); //Вывод очередного байта в индикатор
      }
   }
   
    while(1)
    {
       
    }
}



Спасибо!
Последний раз редактировалось Gudd-Head Пн мар 31, 2014 16:30:22, всего редактировалось 1 раз.
Причина: Сюда перенёс
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: MT-6116 + AVR

Сообщение da-nie »

Вы б для начала бы рассказали, что именно не работает и что вы вообще делаете по действиям. И схему бы показали. Тогда может кто и скажет, что вы делаете не так. Я вот с таким дисплеем не связывался, так что конкретно по работе с дисплеем ничего сказать не могу.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Artem148
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Сб мар 29, 2014 18:04:50

Re: MT-6116 + AVR

Сообщение Artem148 »

Не выходить инициализировать

PC0 --> Выбор регистра данных / команд
PC1 --> Чтение / запись
PC2 --> строб
PC3 --> "Res"

Порт "D" - Шина данных (PB0 - D0; PB1 - D1; PB2 - D2; ...; PB7 - D7)

P.S. За пример взял исходник с сайта производителя дисплея (МЭЛТ)

P.P.S. Дисплей под управлением КБ145ВГ4 (аналог SID1520DOA)
Вложения
MT-6116.c
Пример с сайта призводителя
(4.59 КБ) 449 скачиваний
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: MT-6116 + AVR

Сообщение da-nie »

Прежде чем LCDInit делать надо бы регистры направления вывода данных для портов задать. ;) А именно, DDRC и DDRD. :) А так у вас работать не будет - вы контроллер-то не привели в нужное состояние для работы с дисплеем.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Artem148
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Сб мар 29, 2014 18:04:50

Re: MT-6116 + AVR

Сообщение Artem148 »

Разрешити с Вами не согласиться - порты переводится в "WaitReady", "WriteByte" и "WriteByte", в свою очередь остальные процедуры и сползают эти 3 и на прямую с портом (данных) не работают)

P.S. Хотя порт "C" я действительно прошляпил)

Спасибо!
Artem148
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Сб мар 29, 2014 18:04:50

Re: MT-6116 + AVR

Сообщение Artem148 »

Код исправил, дисплей по прежнему "мёртв".

Спойлер

Код: Выделить всё


int main(void)
{
   LCD_CTRL_DDR = 0xFF;

   LCDinit();
   
   for(char p=0; p<2; p++)
   {                               
      WriteCode(p|0xB8);         
      WriteCode(0x00);           
     
      for(char c=0; c<61; c++)     
      {           
         WriteData(Logo61[p][c]);
      }
   }
   
    while(1)
    {
       
    }
}

Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: MT-6116 + AVR

Сообщение da-nie »

Попробуйте в WaitReady (GLCD_DATA_PORT & 1<<7) заменить на GLCD_DATA_PORT & (1<<7). Операция << имеет низкий приоритет, если я не ошибаюсь.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Artem148
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Сб мар 29, 2014 18:04:50

Re: MT-6116 + AVR

Сообщение Artem148 »

Так же глухо
Аватара пользователя
Flasher
Мудрый кот
Сообщения: 1802
Зарегистрирован: Ср сен 07, 2011 21:40:30

Re: MT-6116 + AVR

Сообщение Flasher »

джитаг на меге отключили фьюзами?
Artem148
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Сб мар 29, 2014 18:04:50

Re: MT-6116 + AVR

Сообщение Artem148 »

у меня 8-мая мега - возможно глупый вопрос - а на 8 меге он разве есть? Он начиная с 16 по-моему)
Аватара пользователя
Flasher
Мудрый кот
Сообщения: 1802
Зарегистрирован: Ср сен 07, 2011 21:40:30

Re: MT-6116 + AVR

Сообщение Flasher »

я не смотрел какая у вас мега
Artem148
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Сб мар 29, 2014 18:04:50

Re: MT-6116 + AVR

Сообщение Artem148 »

А я и не писал нигде) :)
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: MT-6116 + AVR

Сообщение da-nie »

Тогда увеличивайте задержки. Вместо _delay_us пишите _delay_ms. Может, в этом дело. Ну и посмотрите осциллографом, идут ли импульсы вообще. И попутно проверьте монтаж.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Artem148
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Сб мар 29, 2014 18:04:50

Re: MT-6116 + AVR

Сообщение Artem148 »

1) Идея с осциллографом помогла найти ошибку в "WriteCode" (вместо "char" было "bool")
2) Есть различие в даташите и в примере производителя
3) Идея с увеличением задержек ничего не дала (тем более в некоторых местах они не должны превышать 10 мкс)

P.S. после изменения задержек как в даташите несколько раз при заливке прошивки в мк на экране появлялась чёрная полоса (где то 61х4)

P.P.S. нынешней код

Спойлер

Код: Выделить всё


/*
 * ATMega8_GLCD.cpp
 *
 * Created: 29.03.2014 14:01:14
 *  Author: Администратор
 */

#define F_CPU 8000000UL


#include <avr/io.h>
#include <avr/delay.h>

#define GLCD_DATA_DDR  DDRD
#define GLCD_DATA_PORT PORTD

#define GLCD_CTRL_DDR  DDRC
#define GLCD_CTRL_PORT PORTC

#define GLCD_CTRL_A0   _BV(0)
#define GLCD_CTRL_RW   _BV(1)
#define GLCD_CTRL_E    _BV(2)
#define GLCD_CTRL_RES  _BV(3)

#define GLCD_SET_A0  GLCD_CTRL_PORT |= GLCD_CTRL_A0
#define GLCD_SET_RW  GLCD_CTRL_PORT |= GLCD_CTRL_RW
#define GLCD_SET_E   GLCD_CTRL_PORT |= GLCD_CTRL_E
#define GLCD_SET_RES GLCD_CTRL_PORT |= GLCD_CTRL_RES

#define GLCD_RESET_A0  GLCD_CTRL_PORT &= ~GLCD_CTRL_A0
#define GLCD_RESET_RW  GLCD_CTRL_PORT &= ~GLCD_CTRL_RW
#define GLCD_RESET_E   GLCD_CTRL_PORT &= ~GLCD_CTRL_E
#define GLCD_RESET_RES GLCD_CTRL_PORT &= ~GLCD_CTRL_RES

void Strub_E(void)
{
   _delay_us(1);
   
   GLCD_SET_E;
   _delay_ms(2);   
                  
   GLCD_RESET_E;
   _delay_ms(2);                  
}

void WaitReady(void) 
{             
   _delay_us(2);
}

void WriteByte(char b, bool cd)
{   
    WaitReady();                 
   
    GLCD_DATA_DDR = 0xFF;         
   
    GLCD_RESET_RW;     
   
    if (cd)                       
    {
       GLCD_SET_A0;
    }
    else
    {
       GLCD_RESET_A0;
    }
   
    GLCD_DATA_PORT = b;         
   
    Strub_E();
}


void WriteCode(char b)
{
   WriteByte(b,0);
}

void WriteData(char b)
{
   WriteByte(b,1);
}


void LCDinit(void)
{
   GLCD_RESET_E;     
   GLCD_RESET_RES;   
   _delay_us(11);   
   GLCD_SET_RES;     
   _delay_us(5);     
   GLCD_RESET_RES;
   _delay_ms(3);
   
   //WriteCode(0xE2);  //Reset
   WriteCode(0xEE);    //ReadModifyWrite off
   WriteCode(0xA4);    //Включить обычный режим
   WriteCode(0xA8);    //Мультиплекс 1/16
   //WriteCode(0xC0);  //Верхнюю строку на 0
   //WriteCode(0xA0);  //NonInvert scan RAM
   WriteCode(0xAF);    //Display on
}


//Данные изображения, побитые по строкам и байты будут на индикаторе вертикально.
//Это просто последовательность байт для записи в индикатор начиная с верхней страницы.
//Полностью соответствуют картинке распределения ОЗУ в документации на модуль.
const char Logo61[2][61]= //61x16 pixel, каждые 8 вертикальных точек собраны в байт
{
   {   0xF8,0xFC,0xFE,0xFB,0xEF,0x7F,0x1F,0x0F,0x0F,0x3F,
      0x1F,0x0F,0xBE,0x0C,0x18,0xE0,0x00,0x00,0x08,0x88,
      0xE8,0xE8,0xE8,0x08,0x88,0xE8,0xE8,0xE8,0x08,0x08,
      0xC8,0xE8,0xE8,0x68,0x68,0x68,0x68,0xE8,0xC8,0xC8,
      0x88,0x08,0x08,0x08,0x08,0x88,0xC8,0xE8,0xE8,0xE8,
      0x68,0x68,0x68,0x68,0xE8,0xE8,0xE8,0x68,0x68,0x68,
      0x68
   },
   {   0x0F,0x18,0x27,0x4F,0x43,0x80,0x80,0x80,0x80,0x80,
      0x80,0x40,0x40,0xE8,0xFC,0xFF,0x7C,0x1E,0x0F,0x07,
      0xFF,0xFF,0xFF,0x1F,0x0F,0xFF,0xFF,0xFF,0x00,0x20,
      0x70,0x70,0xE6,0xCE,0xCE,0xCE,0xCE,0xE4,0x71,0x3F,
      0xFF,0xF0,0xF8,0x7C,0x3F,0x0F,0x07,0xFF,0xFF,0xFF,
      0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,
      0x00
   }
};


int main(void)
{
   GLCD_CTRL_DDR = 0xFF;
   GLCD_DATA_DDR = 0xFF;
   
   GLCD_CTRL_PORT = 0x00;
   GLCD_DATA_PORT = 0x00;
   
   LCDinit();
   
   for(char p=0; p<2; p++)
   {
      WriteCode(p|0xB8);
      WriteCode(0x00);
       
      for(char c=0; c<61; c++)
      {
         WriteData(Logo61[p][c]);
      }
   }
   
    while(1)
    {

    }
}

Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: MT-6116 + AVR

Сообщение da-nie »

Ну, раз полоса появлялась, значит, инициализация прошла. Впрочем, может и нет. 8)

тем более в некоторых местах они не должны превышать 10 мкс


Очень странно. Не встречал ещё дисплеев, которые нормируют задержки по "не более". :)

Код: Выделить всё

void Strub_E(void)
{
   _delay_us(1);
   
   GLCD_SET_E;
   _delay_ms(2);   
                 
   GLCD_RESET_E;
   _delay_ms(2);                 
}


А точно сначала высокий уровень, а затем низкий на E? Обычно низкий уровень активный.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Artem148
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Сб мар 29, 2014 18:04:50

Re: MT-6116 + AVR

Сообщение Artem148 »

Я тоже раньше не встречал, но всё когда-то бывает)

На 3 странице в разделе "Начальная установка" посмотрите 2 пункт :)
Вложения
MT-6116.pdf
Datasheet MT-6116
(99.81 КБ) 238 скачиваний
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: MT-6116 + AVR

Сообщение da-nie »

Так это длительность фронта, а не импульса. :)
Попробуйте повторить все действия, как в даташите.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Artem148
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Сб мар 29, 2014 18:04:50

Re: MT-6116 + AVR

Сообщение Artem148 »

da-nie писал(а):Ну, раз полоса появлялась, значит, инициализация прошла. Впрочем, может и нет.


Я думаю в какой-то миллионной вариации получилось инициализировать - осциллограф показал при заливке:

PORTD: 00011110
PORTC: 10000101

Это соответствует команде "WriteData(0x0E)" - как раз те 4 полосы :)
Artem148
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Сб мар 29, 2014 18:04:50

Re: MT-6116 + AVR

Сообщение Artem148 »

Сделал вроде всё по даташиту - экран "мёртвый" (оживает только строчка при заливке)

Спойлер

Код: Выделить всё


void Strub_E(void)
{
   _delay_us(1);
   
   GLCD_RESET_E;
   _delay_ms(2);   
                  
   GLCD_SET_E;
   _delay_ms(2);                  
}

void WaitReady(void) 
{             
   _delay_us(2);
}

void WriteByte(char b, bool cd)
{   
    WaitReady();                 
   
    GLCD_DATA_DDR = 0xFF;
    GLCD_CTRL_PORT = 0x00;         
   
    GLCD_RESET_RW;     
   
    if (cd)                       
    {
       GLCD_SET_A0;
    }
    else
    {
       GLCD_RESET_A0;
    }
   
    GLCD_DATA_PORT = b;         
   
    Strub_E();
}


void WriteCode(char b)
{
   WriteByte(b,0);
}

void WriteData(char b)
{
   WriteByte(b,1);
}


void LCDinit(void)
{
   GLCD_RESET_E;     
   GLCD_RESET_RES;   
   _delay_ms(100);   
   GLCD_SET_RES;     
   _delay_ms(10);     
   //GLCD_RESET_RES;
   _delay_ms(3);
   
   WriteCode(0xE2);    //Reset
   WriteCode(0xEE);    //ReadModifyWrite off
   WriteCode(0xA4);    //Включить обычный режим
   WriteCode(0xA8);    //Мультиплекс 1/16
   WriteCode(0xC0);    //Верхнюю строку на 0
   WriteCode(0xA0);    //NonInvert scan RAM
   WriteCode(0xAF);    //Display on
}


//Данные изображения, побитые по строкам и байты будут на индикаторе вертикально.
//Это просто последовательность байт для записи в индикатор начиная с верхней страницы.
//Полностью соответствуют картинке распределения ОЗУ в документации на модуль.
const char Logo61[2][61]= //61x16 pixel, каждые 8 вертикальных точек собраны в байт
{
   {   0xF8,0xFC,0xFE,0xFB,0xEF,0x7F,0x1F,0x0F,0x0F,0x3F,
      0x1F,0x0F,0xBE,0x0C,0x18,0xE0,0x00,0x00,0x08,0x88,
      0xE8,0xE8,0xE8,0x08,0x88,0xE8,0xE8,0xE8,0x08,0x08,
      0xC8,0xE8,0xE8,0x68,0x68,0x68,0x68,0xE8,0xC8,0xC8,
      0x88,0x08,0x08,0x08,0x08,0x88,0xC8,0xE8,0xE8,0xE8,
      0x68,0x68,0x68,0x68,0xE8,0xE8,0xE8,0x68,0x68,0x68,
      0x68
   },
   {   0x0F,0x18,0x27,0x4F,0x43,0x80,0x80,0x80,0x80,0x80,
      0x80,0x40,0x40,0xE8,0xFC,0xFF,0x7C,0x1E,0x0F,0x07,
      0xFF,0xFF,0xFF,0x1F,0x0F,0xFF,0xFF,0xFF,0x00,0x20,
      0x70,0x70,0xE6,0xCE,0xCE,0xCE,0xCE,0xE4,0x71,0x3F,
      0xFF,0xF0,0xF8,0x7C,0x3F,0x0F,0x07,0xFF,0xFF,0xFF,
      0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,
      0x00
   }
};


int main(void)
{
   GLCD_CTRL_DDR = 0xFF;
   GLCD_DATA_DDR = 0xFF;
   
   GLCD_CTRL_PORT = 0x00;
   GLCD_DATA_PORT = 0x00;
   
   LCDinit();
   
   
   
    while(1)
    {
        for(char p=0; p<2; p++)
        {
           WriteCode(p|0xB8);
           WriteCode(0x00);
          
           for(char c=0; c<61; c++)
           {
              WriteData(Logo61[p][c]);
           }
          
           _delay_ms(1000);
        }
    }
}



P.S. Здесь же нашёл инициализацию дисплея с тем же чипом (код аналогичен)

http://radiokot.ru/forum/viewtopic.php?f=20&t=75976
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: MT-6116 + AVR

Сообщение da-nie »

И всё равно не работает? Хм...
Лучше бы вы WG12864 бы взяли - для него у меня своя библиотека есть.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Ответить

Вернуться в «AVR»