ARM Cortex M3 + MT-12864A v5


• О проекте
• Обратная связь
• Полезные ссылки
• Полезные программы
• Друзья сайта


Последние комментарии

Аби: Подключение микроконтроллеров к шине RS-485
написано просто о...

Анатолий: Джойстик для денди на stm32
Автору 100500 рес...




           

Библиотека для AVR





AXLIB Генератор





Помощь сайту


				

ARM Cortex M3 + MT-12864A v5

	
	
	

Дата: 19 Сентября 2012. Автор: RoboT

	
	
Наткнулся как-то я в магазине "Чип Дип" вот на такую платку.


На борту чудненько расположился МК STM32F100RB со 128Кб флеш и 8Кб ОЗУ. Ядро ARM Cortex M3. Тактующий кварц сидит на панельке, так что можно поменять на любой другой. Также платка снабжена программатором с возможностью отладки МК прямо на плате, чем я воспользовался и был очень рад. Все выводы выведены на пины для установки в макетку. Есть два светодиода и две кнопочки, правда одна из них ресет. Запитывается платка от USB и через него же и шьется. Ну про плату вроде все. Среда разработки... Ну это как рекомендовать другу купить ту или иную машину. Все равно потом виноват будешь, что посоветовал не то. Так что тут решайте сами. Лично мне понравился "CooCox". Во первых он бесплатный. Во вторых имеет богатую библиотеку для работы с МК. В третьих может шить и отлаживать данный девайс. И вот после мигания светодиодиками захотелось сделать что-то по интересней. Попался мне на глаза графический ЖК 128х64 фирмы "МЭЛТ" MT-12864A v5. Решено было прикрутить его к МК и чтонить нарисовать. Смотрим схемку ниже.


Немного поясню. Слева сама плата с МК, наверху ЖК, а две микрухи для согласования уровней. Вся проблема встала когда ЖК не всегда выводил одно и тоже значение. Я убил два дня на вылавливание бага пока не нарвался на форум в МЭЛТе. Там и прояснилось то, что ЖК может управляться 3В но правда команда RES не всегда проходит. Там же предложили перепаять перемычку на конденсатор, но я не рискнул ковырять рабочий ЖК. Не долго думая было решено примостырить пару микрух, 8-ми битные регистры, и все пошло как по маслу. Вообще есть специальные микросхемы для согласования 3.3В в 5В и наоборот, но это надо искать, ехать покупать, а если нет то заказывать и ждать. Для пробного теста можно использовать то что есть под рукой. Теперь давайте взглянем на программу. Она состоит из трех основных файлов.

lcd12864.h - Набор функций для работы с ЖК
logo.h - Собственно то что будет выведено на экран.
main.c - Тело основной программы.

Теперь все по порядку:

Файл lcd12864.h



// Пауза

void Delay(volatile uint32_t nCount) {
    for (; nCount != 0; nCount--);
}

// Запись байта в ЖК

void LcdByte(uint32_t byte)
{
	GPIOC->ODR = byte;	   	// Вывод в порт
	Delay(0x000F);		   	// Пауза 1 мкс
	GPIOC->BSRR = GPIO_BSRR_BS9;    // Выставляем Е
	Delay(0x000F);		   	// Пауза 1 мкс
	GPIOC->BSRR = GPIO_BSRR_BR9;	// Сбрасываем Е
	Delay(0x000F);		   	// Пауза 1 мкс
}

void CodeL(uint32_t code)
{
	code |= 0x0900;    // Побитное ИЛИ кода с командой в левый кристалл
	LcdByte(code);
}

void CodeR(uint32_t code)
{
	code |= 0x1100;    // Побитное ИЛИ кода с командой в правый кристалл
	LcdByte(code);
}

void DataL(uint32_t code)
{
	code |= 0x2900;    // Побитное ИЛИ данных с командой в левый кристалл
 	LcdByte(code);
}

void DataR(uint32_t code)
{
	code |= 0x3100;    // Побитное ИЛИ данных с командой в правый кристалл
	LcdByte(code);
}

void LcdInit(void)
{
	GPIOC->BSRR = GPIO_BSRR_BR8;	// Сбрасываем RES
	Delay(0x001E);			// Пауза 2 МКС
	GPIOC->BSRR = GPIO_BSRR_BS8;    // Выставляем RES
	Delay(0x00FF);			// Пауза 10 МКС
}



Здесь вроде все понятно. Сначала мы создаем функцию паузы. Длительность пауз смотрим в мануале на ЖК. Далее мы создаем функцию для записи байта в ЖК. Четыре функции ниже нужны для записи команд или данных в левый и правый кристаллы. И последняя функция нужна для того чтобы разбудить ЖК при подаче питания. Если все таки непонятно, то описываю алгоритм работы с ЖК вкратце.

    1. После подачи питания прижимаем RES к земле (лог 0). И держим не менее 2МКС
    2. После того как ЖК очухался поднимаем RES (лог 1) и держим не менее 10МКС
    3. Теперь нам надо включить дисплей подав команду 0x3F (0b00111111)

Вот и все, дисплей готов работать. По умолчанию, мне так кажется, ЖК дисплей после включения зажигает все пиксели. Можно так отладить контрастность.

Поехали дальше:

Файл logo.h
Ну тут просто двумерный массив 16х64 для вывода постранично. Все что вы туда запишите, то и выведет данная программа. Сейчас там просто логотип-надпись.

Файл main.c


#include  <stm32f10x_rcc.h>
#include  <lcd12864.h>
#include  <logo.h>

int main(void)
{
	uint32_t i, j, k;

	RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; 	// Разрешить тактирование PORTC

	GPIOC->CRL = GPIO_CRL_MODE;		// Порт С ноги с 0 по 7
настраиваем на вывод с частотой 50МГц
	GPIOC->CRH = GPIO_CRH_MODE;		// Порт С ноги с 8 по 15
настраиваем на вывод с частотой 50МГц
	LcdInit();	// Инициализируем дисплей
	CodeL(0x3F);	// Включаем левый кристалл
	CodeR(0x3F);	// Включаем правый кристалл
	CodeL(0xB8);	// Выбираем 0-ю страницу (отсчет идет с 0 до 7 сверху
вниз) левого кристалла
	CodeL(0x40);	// Выбираем 0-й столбец (отсчет идет с 0 до 63 слева
направо) левого кристалла
	CodeR(0xB8);	// Выбираем 0-ю страницу (отсчет идет с 0 до 7 сверху
вниз) правого кристалла
	CodeR(0x40);	// Выбираем 0-й столбец (отсчет идет с 0 до 63 слева
направо) правого кристалла

	i = 0x00;
	j = 0x00;
	while(i<0x08)	// бегаем по страницам
	{
			k = 0x00;
			CodeL(0x40);	// При переходе на новую страницу левого
кристалла бежим к началу страницы
			while(k<0x40)	// сидим в цикле пока не забъем данными
всю страницу
			{
				DataL(logo[j][k]);	// Вводим данные в ОЗУ
ЖК левого кристалла
				k++;
			}
			k = 0x00;
			j++;
			CodeR(0x40);	// При переходе на новую страницу
правого кристалла бежим к началу страницы
			while(k<0x40)	// сидим в цикле пока не забъем данными
всю страницу
			{
				DataR(logo[j][k]);	// Вводим данные в ОЗУ
ЖК правого кристалла
				k++;
			}
		i++;
		j++;
		CodeL(0xB8 + i);   // на следующую страницу левого кристалла
		CodeR(0xB8 + i);   // на следующую страницу правого кристалла
	}

	return 0;
}


Здесь вначале мы инициализируем порт ввода/вывода С. Собственно почти как в AVR с небольшим нюансом. Если в AVR нужно просто выставить DDRx либо в 1, либо в 0 для вывода/ввода, то тут немного по сложнее. Сначала нужно включить тактирование шины.

RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;

Этой строчкой мы говорим МК чтобы он начал тактировать порт С частотой 50МГц. Далее нам нужно сказать МК что мы хотим через порт выводить данные. Для этих целей пишем эти две строчки.

GPIOC->CRL = GPIO_CRL_MODE;
GPIOC->CRH = GPIO_CRH_MODE;

Остальной код программы достаточно информативно прокомментирован, а дальнейшее объяснение работы с МК не входит в эту статью. Немного позже если мне не будет лень я напишу как я вникал в ARMы. Ну собственно и все. Вот фотки того что получилось.



Архив с файлами кода, схемой.
Архив с проектом под "CooCox"



Сергей    28.01.14

Если использовать вместо 74hc373 микруху txb0108 чем будет лучше ? Или в принципе все равно что ставить ?

Сергей    28.01.14

Спасибо Алексей ! Попробую, у меня в наличии очень много микрух 74hc245d но хотел поставить txb0108 так как она вроде специально сделана для согласования логически уровней. Дисплей такой же как у Вас MT12864A :) пробовал его напрямую подключать к STM32F4Discovery не работает. В поисках нашел ваш замечательный ресурс. В общем спасибо ! Посмотрите в сторону хорошего компилятора для ARM с поддержкой STM процессоров от Микроэлектроники mikroe.com в нем есть очень много интересных библиотек.

Алексей    28.01.14

Спасибо за совет. Надо будет пощупать. Я к стати о нем где-то слышал, но не видел. А на счет ЖК-дисплея то можно прикрутить на прямую вот этот: MT-12864A-2FLA-3V0-T Он уже на 3.3в сделан.

Сергей    28.01.14

Спасибо за совет ! Но у меня в шаговом доступе только Митинский радио рынок, а там продаются только пяти вольтовые версии ЖКИ. Проще сделать согласование чем искать дефицитный индикатор :) Вот и мудрю.

Сергей    28.01.14

Тут можно качнуть демо версию, www.mikroe.com/mikroc/arm/ ограничение в 8кб компилируемой прошивки. Я лицензию купил и очень доволен, не зря деньги потратил :)

Алексей    28.01.14

Зы. А у меня под боком МЭЛТ :-) К стати 5-и вольтовый можно переделать в 3.3. Там какая-то деталюха перепаивается и все. Я читал на каком-то форуме но так руки и не дошли.

Алексей    28.01.14

$299. Колется для домашнего применения.

Сергей    28.01.14

Конечно не совсем дешево но и не совсем дорого :)

Алексей    28.01.14

Не, я еще осциллограф не дождался. За него $350 отдал, на пока хватит.

Василий    01.07.14

Здравствуйте, в чём Вы формировали массив? не в ручную же...

Алексей    01.07.14

Нет конечно ))) Программкой под названием LCD Vision

Сергей    19.08.14

Попробовал подключить MT12864A V5 к STM32F103RBT6. Напрямую работает но не выводит некоторые полосы.. остаются пустыми без пикселей. Попробовал подключить через микросхемы 74HC245. Отображает во все строки только не корректно. Вы случаем на 74HC373 подтягивающие резисторы не ставили ?

RoboT    19.08.14

Не, напрямую как на схеме.

Леонид    07.06.18 10:51

С другим дисплеем подключал напрямую. Выходы конфигурировал как открытый коллектор и подтягивающие резисторы на 5 вольт. И всё работает. Так и со многими микросхемами делал. В большинстве случаев это позволяет сократить число компонентов, и как следствие уменьшить конечный размер и энергопотребление готового устройства.

Дмитрий    03.07.18 04:13

Здравствуйте, спасибо большое за библиотеку, все работает. Как Вы получили именно такой массив данных картинки логотипа, которая на дисплее? Не могу найти программу для получения такого массива данных программу. Библиотека для вывода текста планируется?

Алексей    03.07.18 07:51

В CodevisualAVR. Свою писать пока не надумал.




Чтобы вставить ссылку используйте форму вида[url]http://www.адрес.ru[/url][text]текст ссылки[/text]
Чтобы вставить код используйте форму вида[code]код[/code]

Имя:   





  







Рейтинг@Mail.ru Яндекс.Метрика