Бегущая строка

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Dimas_ini
Родился
Сообщения: 17
Зарегистрирован: Ср май 23, 2007 03:31:24
Откуда: г. Колпашево

Бегущая строка

Сообщение Dimas_ini »

Доброго времени суток всем.
Написал программу бегущей строки для lcd-дисплея по алгоритму "запоминаем первый символ, затем берем второй символ и помещаем его на место первого, потом третий на место второго и так до последнего, после чего на место последнего символа ставим запомненный первый" получилось совсем не что я хотел
Вот сам код:

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

#include "mega8535.h"
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd>
#include <stdio>
#include <delay>
unsigned char nn;
unsigned   char b[21] = "Hello World";
void main(void) {
lcd_init(20);
 

while(1) {
nn=b[0];
b[0]=b[1];
b[1]=b[2];
b[2]=b[3];
b[3]=b[4];
b[4]=b[5];
b[5]=b[6];
b[6]=b[7];
b[7]=b[8];
b[8]=b[9];
b[9]=b[10];
b[10]=b[11];
b[11]=b[12];
b[12]=b[13];
b[13]=b[14];
b[14]=b[15];
b[15]=b[16];
b[16]=b[17];
b[17]=b[18];
b[18]=b[19];
b[19]=b[20];
b[20]=nn;

delay_ms(500);
lcd_clear();
lcd_gotoxy(0,1);

lcd_puts(b);

}
}

контроллер я использовал atmega8535-16pi
компилятор avr code vision
язык - си (других не знаю)
ниже выложил файл для протеуса и файлы для avr code vision
ктонибудь подскажите где я ошибся
заранее спасибо.
Вложения
Бегущая строка.rar
Исходники моей программы и файлы для протеуса
(29.78 КБ) 612 скачиваний
Аватара пользователя
Piroman17
Грызет канифоль
Сообщения: 296
Зарегистрирован: Пт янв 12, 2007 17:16:35
Откуда: Дубна
Контактная информация:

Сообщение Piroman17 »

Пиши конкретней что не совсем то - экстрасенсы в отпуске.
Я так понял LСD у тебя моргает после каждого вывода символов. Совсем не надо делать

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

lсd_clear();

Символы запишутся поверх старых и всё будет ОК.

Да и её грубая ошибка в Proteuse у тебя ATmega8, а в CVAVR - mega8535. и LCD не к тому порту подключен
"Всё новое - хорошо забытое старое" - для творцов без творческий мысли.
Dimas_ini
Родился
Сообщения: 17
Зарегистрирован: Ср май 23, 2007 03:31:24
Откуда: г. Колпашево

Сообщение Dimas_ini »

Нет символы у меня вовсе не моргают. По поводу протеуса изначально я использовал atmega8, а в протеусе нет ATmega8535
Сейчас постараюсь объяснить что у меня за проблема:
символы сдвинутые влевую сторону должны появлятьсы в конце строки но там пустота. Через какойто промежуток времени после того как слово ушло за пределы дисплея полнлстью оно снова появляется в начале строки.
Вложения
Бегущая строка.rar
Исходники моей программы и файлы для протеуса но под atmega8
(35.67 КБ) 493 скачивания
proteus.rar
экран во время симуляции впротеусе
(96.36 КБ) 491 скачивание
Бегущая строка.rar
Исходники моей программы и файлы для протеуса на at90s8535
(41.73 КБ) 461 скачивание
Аватара пользователя
Mamonth
Вымогатель припоя
Сообщения: 534
Зарегистрирован: Пн янв 16, 2006 08:00:17
Откуда: Иркутск

Сообщение Mamonth »

Есть подозрение что строку надо добить пробелами, там где у тебя написано Hello World. Проблема в том что знак пробела и ничего - разные вещи. Си на это не обращает внимание, но программисту следует обратить.
Кроме того, строка у тебя (которая b) получается длиной 22 символа. Хоть ты и двигаешь только 20, здесь тоже надо посмотреть.

Ну и AVR Studio с дебаггером никто не отменял. Я не могу сейчас посмотреть - в коммандировке. А вот тебе рекомендую. ) Думаю там сразу будет видно.

Удачи.
Today fine night...
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: Бегущая строка

Сообщение Барсик »

Dimas_ini писал(а):...Написал программу бегущей строки для lcd-дисплея...

Скажите пожалуйста, почему Вы не хотите воспользоваться штатной командой для управления дисплеем, которая сдвигает изображение?
Пошлите ему команду 0x18 (на входе RS должен быть низкий уровень) и изображение сдвинется влево. Будете посылать эту команду через определённый интервал - получите бегущую строку... Причём вылезут все символы, которые были записаны в дисплей но не поместились на экране.
Dimas_ini
Родился
Сообщения: 17
Зарегистрирован: Ср май 23, 2007 03:31:24
Откуда: г. Колпашево

Сообщение Dimas_ini »

Mamonth писал(а):Есть подозрение что строку надо добить пробелами, там где у тебя написано Hello World. Проблема в том что знак пробела и ничего - разные вещи. Си на это не обращает внимание, но программисту следует обратить.
Кроме того, строка у тебя (которая b) получается длиной 22 символа. Хоть ты и двигаешь только 20, здесь тоже надо посмотреть.

Ну и AVR Studio с дебаггером никто не отменял. Я не могу сейчас посмотреть - в коммандировке. А вот тебе рекомендую. ) Думаю там сразу будет видно.

Удачи.

Строку я добивал до 20 символов пробелами но без изменений. А если
добить пробелами до 21 символа то получится:
Вложения
CG16.rar
(50.33 КБ) 441 скачивание
Dimas_ini
Родился
Сообщения: 17
Зарегистрирован: Ср май 23, 2007 03:31:24
Откуда: г. Колпашево

Re: Бегущая строка

Сообщение Dimas_ini »

Барсик писал(а):
Dimas_ini писал(а):...Написал программу бегущей строки для lcd-дисплея...

Скажите пожалуйста, почему Вы не хотите воспользоваться штатной командой для управления дисплеем, которая сдвигает изображение?
Пошлите ему команду 0x18 (на входе RS должен быть низкий уровень) и изображение сдвинется влево. Будете посылать эту команду через определённый интервал - получите бегущую строку... Причём вылезут все символы, которые были записаны в дисплей но не поместились на экране.

об этом я както не демал но будет время обязательно займусь этим
Аватара пользователя
Mamonth
Вымогатель припоя
Сообщения: 534
Зарегистрирован: Пн янв 16, 2006 08:00:17
Откуда: Иркутск

Сообщение Mamonth »

Dimas_ini писал(а):
Mamonth писал(а):Есть подозрение что строку надо добить пробелами, там где у тебя написано Hello World. Проблема в том что знак пробела и ничего - разные вещи. Си на это не обращает внимание, но программисту следует обратить.
Кроме того, строка у тебя (которая b) получается длиной 22 символа. Хоть ты и двигаешь только 20, здесь тоже надо посмотреть.

Ну и AVR Studio с дебаггером никто не отменял. Я не могу сейчас посмотреть - в коммандировке. А вот тебе рекомендую. ) Думаю там сразу будет видно.

Удачи.

Строку я добивал до 20 символов пробелами но без изменений. А если
добить пробелами до 21 символа то получится:


Что-то не нравится мне протеус... может на железке попробуешь?
Today fine night...
Dimas_ini
Родился
Сообщения: 17
Зарегистрирован: Ср май 23, 2007 03:31:24
Откуда: г. Колпашево

Сообщение Dimas_ini »

Mamonth писал(а):Что-то не нравится мне протеус... может на железке попробуешь?

На железе тоже самое что и при симуляции в протеусе
Аватара пользователя
Mamonth
Вымогатель припоя
Сообщения: 534
Зарегистрирован: Пн янв 16, 2006 08:00:17
Откуда: Иркутск

Сообщение Mamonth »

Я бы поигрался с элементами массива и с их количеством, а также внимательно посмотрел даташит на дисплей. Больше пока в голову ничего не приходит.
Ну и пробуй команду сдвига...
Today fine night...
Dimas_ini
Родился
Сообщения: 17
Зарегистрирован: Ср май 23, 2007 03:31:24
Откуда: г. Колпашево

Сообщение Dimas_ini »

Доброго времени суток всем.
Я тут поиграл с элементами массива и оказалось что у меня вот ето лишнее

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

b[19]=b[20]; 
b[20]=nn;

короче должно получиться так

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

#include "mega8535.h"
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd>
#include <stdio>
#include <delay>
unsigned char nn;
unsigned   char b[21] = "Code Vision AVRv1.25";
void main(void) {
lcd_init(20);

while(1) {
nn=b[0];
b[0]=b[1];
b[1]=b[2];
b[2]=b[3];
b[3]=b[4];
b[4]=b[5];
b[5]=b[6];
b[6]=b[7];
b[7]=b[8];
b[8]=b[9];
b[9]=b[10];
b[10]=b[11];
b[11]=b[12];
b[12]=b[13];
b[13]=b[14];
b[14]=b[15];
b[15]=b[16];
b[16]=b[17];
b[17]=b[18];
b[18]=b[19];
b[19]=nn;

delay_ms(500);
lcd_clear();
lcd_puts(b);

}
}

это все уже похоже на бегущую строку , но несовсем: текст бегущейстроки должен содержать min/max 20 символов, если больше
20 то лишние символы переходят на следующие строки , если меньше то возвращается первая проблема.
Мой первый вопрос: как написать программу(алгоритм,пример программы ...) которая могла бы подсчитывать колличество символов и если оно меьше 20 то добивать пробелами строку.
Второй вопрос: как увеличить длину текста бегущей строки????
I_ivi
Родился
Сообщения: 9
Зарегистрирован: Пн май 15, 2006 14:24:40

Сообщение I_ivi »

вот случайно натолкнулся. может пригодится.
Вложения
beg_stroka.rar
(2.6 КБ) 681 скачивание
Аватара пользователя
Steam
Грызет канифоль
Сообщения: 296
Зарегистрирован: Чт апр 19, 2007 15:27:28
Откуда: Мурманск, Россия
Контактная информация:

Re: Бегущая строка

Сообщение Steam »

Барсик писал(а):Скажите пожалуйста, почему Вы не хотите воспользоваться штатной командой для управления дисплеем, которая сдвигает изображение?

Делаю также и рекомендую всем! Сначала записываю всю строчку в МК (до 64-ёх символов!), а потом посылаю команды сдвига дисплея через определённый промежуток (например 1/4 секунды). Код получается компактный (не более 10-ти строк).

P.S. Команда сдвига:

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

RS   = 0
R/W = 0
DB7 = 0
DB6 = 0
DB5 = 0
DB4 = 1
DB3 = 1
DB2 = 0 (если вправо сдвиг, то DB2 = 1)
DB1 = X
DB0 = X

где X - любое
Гальваническое сопротивление - это восстание батареек
Dimas_ini
Родился
Сообщения: 17
Зарегистрирован: Ср май 23, 2007 03:31:24
Откуда: г. Колпашево

Re: Бегущая строка

Сообщение Dimas_ini »

Steam писал(а):
Барсик писал(а):Скажите пожалуйста, почему Вы не хотите воспользоваться штатной командой для управления дисплеем, которая сдвигает изображение?

Делаю также и рекомендую всем! Сначала записываю всю строчку в МК (до 64-ёх символов!), а потом посылаю команды сдвига дисплея через определённый промежуток (например 1/4 секунды). Код получается компактный (не более 10-ти строк).

P.S. Команда сдвига:

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

RS   = 0
R/W = 0
DB7 = 0
DB6 = 0
DB5 = 0
DB4 = 1
DB3 = 1
DB2 = 0 (если вправо сдвиг, то DB2 = 1)
DB1 = X
DB0 = X

где X - любое


А можно все это выложить на си. Заранее благодарен
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: Бегущая строка

Сообщение Барсик »

Dimas_ini писал(а):...А можно все это выложить на си...

Похоже, с этим жопа. Вы используете библиотечные функции из lcd.h, а там я такой функции не нашёл, которая могла бы послать на дисплей команду 0x18. Вообще-то, есть функция:
void _lcd_write_data(unsigned char data)
которая, судя по "Help"-у, должна делать, то что надо. Но у меня с ней нифига не получилось. Вместо сдвига, символы с дисплея поочерёдно удаляются...
Скорее всего, придётся дёргать дисплей "врукопашную" - осуществлять обмен и формировать импульсы управления самому. Сейчас у меня нет времени, чтобы это всё написать на "C".
Но, может быть, я плохо искал... Может быть ошибся...
Но зато появилось стойкое желание забить в эту библиотеку и написать всё самому на "C".
Вот что я делал:

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

#include <tiny2313>
#include <delay>

#asm
   .equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd>

void main(void)
{
unsigned char message[] = "Zdes bul Vasya";
lcd_init(16);
_lcd_ready();
lcd_puts(message);
   
while (1)
      {
      delay_ms(1000);
      _lcd_write_data(0x18);
      };
}

До этого, я дёргал дисплей через LPT порт из-под DOS-а с помощью самопальной программы на том же "C". Сдвиг работал!
Аватара пользователя
Томатный
Нашел транзистор. Понюхал.
Сообщения: 174
Зарегистрирован: Вт июл 31, 2007 20:32:30
Откуда: Киев, Украина
Контактная информация:

Сообщение Томатный »

У меня в самописном драйвере для ЖКИ команда 0x18 очищает дисплей :cry:
почему оно не здвигает? :shock:
Вложения
lcd.c
(1.21 КБ) 774 скачивания
Аватара пользователя
Steam
Грызет канифоль
Сообщения: 296
Зарегистрирован: Чт апр 19, 2007 15:27:28
Откуда: Мурманск, Россия
Контактная информация:

Сообщение Steam »

Я драйвер для ЖК написал сам - кому интересно (всё в Си) http://rapidshare.com/files/51155673/LCD_4-bit_Test.rar.html

Если что-то непонятно - стучите в асю или пишите ЛС - объясню.

Подключена вот так:

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

B0 - RS
B1 - R/W
B2 - E
B3 - ничаго :)))
B4 - DB4
B5 - DB5
B6 - DB6
B7 - DB7


З.Ы. 4-ёх битный режим, 1 строка, 16 символов, на частоту 1 МГц
Гальваническое сопротивление - это восстание батареек
Аватара пользователя
Steam
Грызет канифоль
Сообщения: 296
Зарегистрирован: Чт апр 19, 2007 15:27:28
Откуда: Мурманск, Россия
Контактная информация:

Сообщение Steam »

Кто-нибудь попробовал? Работает? :)))
Гальваническое сопротивление - это восстание батареек
Аватара пользователя
Piroman17
Грызет канифоль
Сообщения: 296
Зарегистрирован: Пт янв 12, 2007 17:16:35
Откуда: Дубна
Контактная информация:

Сообщение Piroman17 »

А ты в Proteus'e попробуй
"Всё новое - хорошо забытое старое" - для творцов без творческий мысли.
Аватара пользователя
Steam
Грызет канифоль
Сообщения: 296
Зарегистрирован: Чт апр 19, 2007 15:27:28
Откуда: Мурманск, Россия
Контактная информация:

Сообщение Steam »

В протеусе пробовал, мне интересно работает ли мой драйвер на железе :)
Гальваническое сопротивление - это восстание батареек
Закрыто

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