перемещение графобъекта между полуэкранами на ЖКИ BG12864E

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

Вопрос по разделу "Лаборатория/Цифровые устройства/Использование графического LCD WG12864A."
Доброго всем!"
Видел использование похожего ЖКИ в вышеуказанном разделе. Но вывод информации на дисплей там осуществляется не в динамике.
Использую BG12864E на ATMEGA2561 для вывода катящегося мячика. Прокатить плавно мячик с одной стороны полуэкрана в другой не составило труда - с задержкой выводим массив байтов на экран и сдвигаем по горизонтали. Но вот прокатить этот шарик между полуэкранами - задача, т.к. как только он заезжает за правый край полуэкрана, он тут же появляется в его начале. Переключая полуэкраны нельзя добиться плавного заезда, т.к. объект во всю свою длину перескакивает на второй полуэкран и получается резкий рывок. До сих пор не могу понять как это можно сделать. Конечная цель - чтоб бильярдный мячик бегал по экрану, отталкиваясь от его краев.
Поделитесь идеей как это можно сделать?
Заранее, спасибо!!!
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

я, к сожалению, не помню, в каких ЖКИ установлен такой контроллер, как вы описали, но когда я ковырялся с МЭЛТовским ЖКИ 32х122 точки МТ-12232, я тоже рвал и метал из-за этой, мягко говоря, неудобной особенности... но я ее решил! :)
в общем, все достаточно просто: необходимо делать преобразование координат, прежде чем выводить байт в индикатор... если координата от 0 до середины дисплея - выводим в первый контроллер сразу, а если координата больше - выводим во второй, но при этом координату корректируем...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

ARV писал(а):я, к сожалению, не помню, в каких ЖКИ установлен такой контроллер,
...
если координата от 0 до середины дисплея - выводим в первый контроллер сразу, а если координата больше - выводим во второй, но при этом координату корректируем...
Использую микроконтроллер ATMega2561. На нем пишу.
А как корректировать координату? Указывать больше чем необходимо, чтоб мяч начал заезжать за край? Тогда он начинает выплывать с другой стороны текущего экрана((
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

у вас обязательно есть преобразование "координата --> адрес в ОЗУ". вот когда вы вычисляете адрес, и надо производить коррекцию, т.е. не самой координаты, а вычисляемого адреса. ну и естественно, выводить в нужный контроллер.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

ARV писал(а):у вас обязательно есть преобразование "координата --> адрес в ОЗУ". вот когда вы вычисляете адрес, и надо производить коррекцию, т.е. не самой координаты, а вычисляемого адреса. ну и естественно, выводить в нужный контроллер.
Пардон, если не понял.
В моем случае переменная komand насколько я понимаю находится в ОЗУ. так?
Я же вывожу нач адрес по горизонтали (удивительно, но в этом ЖКИ в даташите координаты по горизонтали именуются как Y!). И потом его просто инкрементирую и сравниваю с опред значением, как только равен - то вывод на второй экран.
...
ldi r23, 0x40
sts komand, r23
rcall PokazKom1 ; начало горизонтали

inc r23 ; след адрес вправо
cpi r23, 0x80
Контактная информация:
Реклама
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

детальный инфошит
Вложения
BG12864EGPLH1.pdf
(210.48 КБ) 149 скачиваний
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

не знаю, как в вашем случае, а в у-помянутом-не-добрым-словом МЭЛТе адреса "столбиков байтов" в ОЗУ в контроллерах идут навстречу друг другу, т.е. у первого от края к середине, и у второго от края к середине (т.е. у первого слева направо, а у второго справа налево)... есть еще режим, когда они идут оба от середины к краям... убивал бы изобретателей таких контроллеров...

поэтому мне приходилось корректировку адреса делать путем несложных математических вычислений :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

вот моя функция:

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

void set_byte_at(uint8_t x, uint8_t pg, uint8_t byte){
	uint8_t controller;

	if(x < COLUMNS){
		controller = 1;
		sed_cmd_to(controller, SED_CMD_SET_ADDR | (COLUMNS - x - 1));
	} else {
		controller = 0;
		sed_cmd_to(controller, SED_CMD_SET_ADDR | (x - COLUMNS));
	}
	sed_cmd_to(controller, SED_CMD_SET_PAGE | pg);
	sed_data_to(controller, byte);
}
x - это номер байта памяти по горизонтали, pg - номер столбика байтов по вертикали, согласно принципу адресации. эти координаты в обычном стиле, т.е. непрерывные, а реальные адреса байтов в памяти обоих контроллеров вычисляет функция.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

ARV писал(а):вот моя функция:

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

void set_byte_at(uint8_t x, uint8_t pg, uint8_t byte){
	.[/quote]
Спасибо за пример!
Сейчас пробую его ввести в жизнь!
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»