Страница 1 из 2
Бегущая строка
Добавлено: Пт июл 27, 2007 23:01:42
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
ктонибудь подскажите где я ошибся
заранее спасибо.
Добавлено: Сб июл 28, 2007 00:07:25
Piroman17
Пиши конкретней что не совсем то - экстрасенсы в отпуске.
Я так понял LСD у тебя моргает после каждого вывода символов. Совсем не надо делать
Символы запишутся поверх старых и всё будет ОК.
Да и её грубая ошибка в Proteuse у тебя ATmega8, а в CVAVR - mega8535. и LCD не к тому порту подключен
Добавлено: Сб июл 28, 2007 09:08:25
Dimas_ini
Нет символы у меня вовсе не моргают. По поводу протеуса изначально я использовал atmega8, а в протеусе нет ATmega8535
Сейчас постараюсь объяснить что у меня за проблема:
символы сдвинутые влевую сторону должны появлятьсы в конце строки но там пустота. Через какойто промежуток времени после того как слово ушло за пределы дисплея полнлстью оно снова появляется в начале строки.
Добавлено: Вс июл 29, 2007 07:14:21
Mamonth
Есть подозрение что строку надо добить пробелами, там где у тебя написано Hello World. Проблема в том что знак пробела и ничего - разные вещи. Си на это не обращает внимание, но программисту следует обратить.
Кроме того, строка у тебя (которая b) получается длиной 22 символа. Хоть ты и двигаешь только 20, здесь тоже надо посмотреть.
Ну и AVR Studio с дебаггером никто не отменял. Я не могу сейчас посмотреть - в коммандировке. А вот тебе рекомендую. ) Думаю там сразу будет видно.
Удачи.
Re: Бегущая строка
Добавлено: Вс июл 29, 2007 13:36:04
Барсик
Dimas_ini писал(а):...Написал программу бегущей строки для lcd-дисплея...
Скажите пожалуйста, почему Вы не хотите воспользоваться штатной командой для управления дисплеем, которая сдвигает изображение?
Пошлите ему команду 0x18 (на входе RS должен быть низкий уровень) и изображение сдвинется влево. Будете посылать эту команду через определённый интервал - получите бегущую строку... Причём вылезут все символы, которые были записаны в дисплей но не поместились на экране.
Добавлено: Ср авг 01, 2007 08:26:28
Dimas_ini
Mamonth писал(а):Есть подозрение что строку надо добить пробелами, там где у тебя написано Hello World. Проблема в том что знак пробела и ничего - разные вещи. Си на это не обращает внимание, но программисту следует обратить.
Кроме того, строка у тебя (которая b) получается длиной 22 символа. Хоть ты и двигаешь только 20, здесь тоже надо посмотреть.
Ну и AVR Studio с дебаггером никто не отменял. Я не могу сейчас посмотреть - в коммандировке. А вот тебе рекомендую. ) Думаю там сразу будет видно.
Удачи.
Строку я добивал до 20 символов пробелами но без изменений. А если
добить пробелами до 21 символа то получится:
Re: Бегущая строка
Добавлено: Ср авг 01, 2007 08:28:44
Dimas_ini
Барсик писал(а):Dimas_ini писал(а):...Написал программу бегущей строки для lcd-дисплея...
Скажите пожалуйста, почему Вы не хотите воспользоваться штатной командой для управления дисплеем, которая сдвигает изображение?
Пошлите ему команду 0x18 (на входе RS должен быть низкий уровень) и изображение сдвинется влево. Будете посылать эту команду через определённый интервал - получите бегущую строку... Причём вылезут все символы, которые были записаны в дисплей но не поместились на экране.
об этом я както не демал но будет время обязательно займусь этим
Добавлено: Чт авг 02, 2007 04:59:32
Mamonth
Dimas_ini писал(а):Mamonth писал(а):Есть подозрение что строку надо добить пробелами, там где у тебя написано Hello World. Проблема в том что знак пробела и ничего - разные вещи. Си на это не обращает внимание, но программисту следует обратить.
Кроме того, строка у тебя (которая b) получается длиной 22 символа. Хоть ты и двигаешь только 20, здесь тоже надо посмотреть.
Ну и AVR Studio с дебаггером никто не отменял. Я не могу сейчас посмотреть - в коммандировке. А вот тебе рекомендую. ) Думаю там сразу будет видно.
Удачи.
Строку я добивал до 20 символов пробелами но без изменений. А если
добить пробелами до 21 символа то получится:
Что-то не нравится мне протеус... может на железке попробуешь?
Добавлено: Чт авг 02, 2007 07:44:32
Dimas_ini
Mamonth писал(а):Что-то не нравится мне протеус... может на железке попробуешь?
На железе тоже самое что и при симуляции в протеусе
Добавлено: Пт авг 03, 2007 04:31:36
Mamonth
Я бы поигрался с элементами массива и с их количеством, а также внимательно посмотрел даташит на дисплей. Больше пока в голову ничего не приходит.
Ну и пробуй команду сдвига...
Добавлено: Сб авг 04, 2007 14:56:46
Dimas_ini
Доброго времени суток всем.
Я тут поиграл с элементами массива и оказалось что у меня вот ето лишнее
короче должно получиться так
Код: Выделить всё
#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 то добивать пробелами строку.
Второй вопрос: как увеличить длину текста бегущей строки????
Добавлено: Ср авг 15, 2007 13:21:16
I_ivi
вот случайно натолкнулся. может пригодится.
Re: Бегущая строка
Добавлено: Пн авг 20, 2007 19:15:13
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 - любое
Re: Бегущая строка
Добавлено: Чт авг 23, 2007 06:07:58
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 - любое
А можно все это выложить на си. Заранее благодарен
Re: Бегущая строка
Добавлено: Пт авг 24, 2007 21:39:03
Барсик
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". Сдвиг работал!
Добавлено: Сб авг 25, 2007 02:38:45
Томатный
У меня в самописном драйвере для ЖКИ команда
0x18 очищает дисплей
почему оно не здвигает?

Добавлено: Сб авг 25, 2007 11:48:34
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 МГц
Добавлено: Пн авг 27, 2007 12:12:38
Steam
Кто-нибудь попробовал? Работает?

Добавлено: Пн авг 27, 2007 13:21:03
Piroman17
А ты в Proteus'e попробуй
Добавлено: Пн авг 27, 2007 13:22:26
Steam
В протеусе пробовал, мне интересно работает ли мой драйвер на железе
