Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Бегущая строка Tiny2313 
V
    Опции темы
dedoki
Дата 21.5.2014, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 7.9.2008

Репутация: нет
Всего: нет



Здравствуйте! Нужно выводить бегущую строку на экран, но что-то не получается это сделать.
Я так понимаю, что нужно вывести текст на экран и раз в n секунд делать сдвиг курсора, но как его сделать? Из всех методов в lcd.h есть только эти:
Код

void _lcd_ready(void);
void _lcd_write_data(unsigned char data);
// write a byte to the LCD character generator or display RAM
void lcd_write_byte(unsigned char addr, unsigned char data);
// read a byte from the LCD character generator or display RAM
unsigned char lcd_read_byte(unsigned char addr);
// set the LCD display position  x=0..39 y=0..3
void lcd_gotoxy(unsigned char x, unsigned char y);
// clear the LCD
void lcd_clear(void);
void lcd_putchar(char c);
// write the string str located in SRAM to the LCD
void lcd_puts(char *str);
// write the string str located in FLASH to the LCD
void lcd_putsf(char flash *str);
// initialize the LCD controller
unsigned char lcd_init(unsigned char lcd_columns);
// writes a control byte to the LCD
void lcd_control (unsigned char control);

PM MAIL   Вверх
ФедосеевПавел
Дата 21.5.2014, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 1
Всего: 10



Объяви переменную - видеобуер. В видеобуфер запиши всю строкуи сдвигай символы. А после готовности - отправляй всю строку в lcd.
PM   Вверх
dedoki
Дата 21.5.2014, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 7.9.2008

Репутация: нет
Всего: нет



Цитата(ФедосеевПавел @ 21.5.2014,  18:17)
Объяви переменную - видеобуер. В видеобуфер запиши всю строкуи сдвигай символы. А после готовности - отправляй всю строку в lcd.

Пытался я что-то типа такого реализовать, но протеус ругается: attempted to read external RAM when not enabled.
Код

char _text[33] = "Test Running Line";
const int MaxLen = 13;
int _currPos;
int _startIndex = -MaxLen;  

char lcd_buffer[33];

char* AddSpace( char *str, int count )
{
    char sb[strlen(str) + count]; // скорее всего, ругается где-то здесь
    int i;
    if ( count < 1 )
    {
        return str;
    }    
    for ( i = 0; i < count; i++ )
    {
        sb[i] = ' ';
    }               
    for (i = count; i < strlen(str); i++)
    {
        sb[i] = str[i];    
    }
    return sb;
}

char *GetText(void)
{
    int tmpCurrPos;
    int tmpStartIndex;
    char *res;  
    char *tmps;
    if ( _currPos + 1 < strlen(_text) - 1 )
    {
        _currPos++;
        tmpCurrPos = _currPos;
    }
    else
    {
        tmpCurrPos = strlen(_text) - 1;
    }
    _startIndex++;    
    tmpStartIndex = _startIndex < 0 ? 0 : _startIndex;
    if ( tmpCurrPos > strlen(_text) - tmpStartIndex )
    {
        tmpCurrPos = strlen(_text) - tmpStartIndex;
    }
    strncpy(tmps, _text+tmpStartIndex, tmpCurrPos);   
    strcpy(res, AddSpace( tmps, MaxLen - _currPos )); // и здесь   
    if ( tmpStartIndex + 1 > strlen(_text) )
    {
        _currPos = 0;
        _startIndex = -MaxLen;
    }
    return res;
}

В main:
Код

sprintf(lcd_buffer, "%s", GetText());                                   
lcd_gotoxy(0,0);
lcd_puts(lcd_buffer);

PM MAIL   Вверх
ФедосеевПавел
Дата 21.5.2014, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 1
Всего: 10



Язык C для меня не очень "родной". Но я попытался бы наверное так - смещая индекс в строке текста (эта строка являлась бы подобием видеобуфера):
Код

char _text[33] = "Test Running Line";
int _len;
const int MaxLen = 13;
int _currPos;

void NextStep(void)
{
  _currPos++;
  if(_currPos>=_len) 
    _currPos=0;

}

void OutToLCD(void)
{
  lcd_gotoxy(0,0);
  // цикл по i - по позициям дисплея
  // цикл по j - по символам выводимого текста от _currPos до (_currPos+40) с учётом ограничения на длину строки
  for(int i=0, int j=_currPos; i<40; i++, j++)     <---------- за компиляцию этой конструкции не ручаюсь
  {
    if(j>=_len)
      j=0;
    lcd_putchar(_text[j]);
  }
}

void main(void)
{

   hard_init();

  _len=strlen(_text);
  _currPos=0;
  for(;;)
  {
    delay_ms(1000);
    NextStep();
    OutToLCD();
  }
}

Примерно так. Это скорее идея, чем рабочий код.

Это сообщение отредактировал(а) ФедосеевПавел - 21.5.2014, 21:03
PM   Вверх
dedoki
Дата 22.5.2014, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 7.9.2008

Репутация: нет
Всего: нет



Я свой код тестил на проге на C# - работало отлично.
Но и Ваш код работает нормально после некоторых исправлений, протеус не материться. Хотел сделать красиво, с отступами, но в задании этого не сказано, так что нормально и так.
Спасибо огромное.

Это сообщение отредактировал(а) dedoki - 22.5.2014, 18:30
PM MAIL   Вверх
ФедосеевПавел
Дата 22.5.2014, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 1
Всего: 10



Ну не вручную же отступы ставить. Есть же AStyle (я им как плагином в Code::Block пользовался), а ещё есть сообщение, что в AStudio6 есть аналогичное средство Edit/Advanced/Format document (or Format Selected). Может что-то ещё - повторюсь, язык C я плохо знаю.
PM   Вверх
dedoki
Дата 22.5.2014, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 7.9.2008

Репутация: нет
Всего: нет



Я имел в виду отступы при выводе на экран. Т.е. чтобы строка выезжала smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0464 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.