MT-6116 + AVR

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

Сообщение 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 раз.
Причина: Сюда перенёс
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

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

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

Сообщение 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 КБ) 451 скачивание
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение 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
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Сб мар 29, 2014 18:04:50

Сообщение Artem148 »

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

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

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

Сообщение 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)
    {
        
    }
}

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

Сообщение 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
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Сб мар 29, 2014 18:04:50

Сообщение Artem148 »

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

Сообщение Flasher »

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

Сообщение Artem148 »

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

Сообщение Flasher »

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

Сообщение Artem148 »

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

Сообщение 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
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Сб мар 29, 2014 18:04:50

Сообщение 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)
    {

    }
}

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

Сообщение 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
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Сб мар 29, 2014 18:04:50

Сообщение Artem148 »

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

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

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

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

Сообщение Artem148 »

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

PORTD: 00011110
PORTC: 10000101

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

Сообщение 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
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение 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»