roboforum.ru

Технический форум по робототехнике.


Бегущая строка для LCD 1602 для AVR

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Бегущая строка для LCD 1602 для AVR

Сообщение grek » 04 фев 2010, 09:25

Добрый день,ни как не могу разобраться в чем у меня ошибка.При обращение к функции 2-й раз происходит следующее вместо печать нормальной строки начальные буквы пропадают.
flash unsigned char ish_str_0[74]={' ',66,195,99,111,186,184,185,32,121,112,111,179,101,189,196,32,99,184,180,189,97,187,97,32,99,32,227,97,191,192,184,186,97,32,112,97,99,120,111,227,97,32,179,111,183,227,121,120,97,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};
flash unsigned char ish_str_1[21]={' ',72,101,191,32,179,32,99,190,184,99,186,101,32,111,193,184,178,111,186,' '};
.......
.......
.......
/************************************************************************************
Функция LCD бегущая стоки
************************************************************************************/
beg_stroka(int stroka)
{
unsigned char i;
unsigned char ish_str[70];
switch(stroka)
{
case 0:
for(i=0;i<73;i++)
{
ish_str[i]=ish_str_0[i];
}
break;
case 1:
for(i=0;i<20;i++)
{
ish_str[i]=ish_str_1[i];
}
break;
};
if(beg_str) {
for(i=0;i<16;i++)lcd_write_byte(0xC0+i,lcd_read_byte(0xC1+i));// установка позиций курсора
beg_str=0;
// запись очередного символа в крайний правую позицию
lcd_gotoxy(15,1);
lcd_putchar(ish_str[n_sim]);
if(++n_sim>m_end)n_sim=0;
}
}
вот обращение к функции

case 1:
beg_stroka(0);
for(w=0;w<73;w++)
{
beg_str=1;//разрешение бегущей строки
beg_stroka(0);

beg_str=0;
delay_ms(200);
}
lcd_clear();// очиста LCВ
break;

При при обращение к следующиму case начальные буквы пропадают.
Подскажите в чем проблема?Может у кого есть еще варианты как организовать бегущую строку.
grek
 
Сообщения: 159
Зарегистрирован: 16 сен 2009, 15:41
Откуда: Арзамас

Re: Бегущая строка для LCD 1602 для AVR

Сообщение Angel71 » 04 фев 2010, 10:01

:) отформатировал немного эти каракули
Код: Выделить всёРазвернуть
flash unsigned char ish_str_0[74]={' ',66,195,99,111,186,184,185,32,121,112,111,179,101,189,196,32,99,184,180,189,97,187,97,32,99,32,227,97,191,192,184,186,97,32,112,97,99,120,111,227,97,32,179,111,183,227,121,120,97,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};
flash unsigned char ish_str_1[21]={' ',72,101,191,32,179,32,99,190,184,99,186,101,32,111,193,184,178,111,186,' '};

Код: Выделить всёРазвернуть
/************************************************************************************
Функция LCD бегущая стоки
************************************************************************************/
beg_stroka(int stroka)
{
    unsigned char i;
    unsigned char ish_str[70];
    switch(stroka)
    {
        case 0:
            for( i = 0; i < 73; i++)
                ish_str[i] = ish_str_0[i];
            break;
        case 1:
            for(i = 0; i < 20; i++)
                ish_str[i] = ish_str_1[i];
            break;
    }
    if(beg_str)
    {
        for(i = 0; i < 16; i++)
            lcd_write_byte(0xC0+i, lcd_read_byte(0xC1+i));// установка позиций курсора
        beg_str=0;
        // запись очередного символа в крайний правую позицию
        lcd_gotoxy(15, 1);
        lcd_putchar(ish_str[n_sim]);
        if(++n_sim > m_end) n_sim = 0;
    }
}

Код: Выделить всёРазвернуть
case 1:
    beg_stroka(0);
    for(w = 0; w < 73; w++)
    {
        beg_str = 1;//разрешение бегущей строки
        beg_stroka(0);
        beg_str = 0;
        delay_ms(200);
    }
    lcd_clear();// очиста LCВ
    break;
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Бегущая строка для LCD 1602 для AVR

Сообщение grek » 11 мар 2010, 12:07

Может кто подскажет как все таки очистить область DDRAM в начальное положение? То есть получается следующее.При первом обращении к функции beg_stroka все нормально.При следующих обращениях получается так, что в начале идут либо пропуски либо какие то не понятные символы. Как сделать так, что бы при следующем обращении к памяти LCD не было всякой ерунды.
grek
 
Сообщения: 159
Зарегистрирован: 16 сен 2009, 15:41
Откуда: Арзамас

Re: Бегущая строка для LCD 1602 для AVR

Сообщение CoSS » 15 мар 2010, 00:58

Я бы лично посоветовал бы сначала выкинуть из кода все "магические числа" типа 20, 73 и прочие 0xC1 - дело даже не в том ошибка может быть среди них, а в то что разбираться в этом "изврате" из чисел сложновато и вообщем-то неохотно. А лучше всего начать с написания нормальной функции вывода бег. строки которая будет независима от длины выводимой строки и без 70-и байтного лок. буфера.
CoSS
 
Сообщения: 5
Зарегистрирован: 01 ноя 2006, 18:27
Откуда: Неизвестно...

Re: Бегущая строка для LCD 1602 для AVR

Сообщение grek » 15 мар 2010, 09:02

А что там может быть не понятно,цифры про которые вы написали это строка на русском языке
Код: Выделить всёРазвернуть
/*beg_stroka(int stroka)
{
unsigned char i;
unsigned char ish_str[50];     
if(beg_str) {
for(i=0;i<16;i++)lcd_write_byte(0xC0+i,lcd_read_byte(0xC1+i));// установка позиций курсора
    beg_str=0;
    // запись очередного символа в крайний правую позицию
    lcd_gotoxy(15,1); 
    lcd_putchar(ish_str[n_sim]);
    if(++n_sim>m_end)n_sim=0;
    }
} */

вот сама функция бегущей строки,и если я изменяю данные бегущей строки и запускаю ее второй раз то получается какая то неразбериха.Как будто надо очистить память LCD но как это сделать пока не знаю.
grek
 
Сообщения: 159
Зарегистрирован: 16 сен 2009, 15:41
Откуда: Арзамас


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11