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 начальные буквы пропадают.
Подскажите в чем проблема?Может у кого есть еще варианты как организовать бегущую строку.
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;
grek » 11 мар 2010, 12:07
Может кто подскажет как все таки очистить область DDRAM в начальное положение? То есть получается следующее.При первом обращении к функции beg_stroka все нормально.При следующих обращениях получается так, что в начале идут либо пропуски либо какие то не понятные символы. Как сделать так, что бы при следующем обращении к памяти LCD не было всякой ерунды.
CoSS » 15 мар 2010, 00:58
Я бы лично посоветовал бы сначала выкинуть из кода все "магические числа" типа 20, 73 и прочие 0xC1 - дело даже не в том ошибка может быть среди них, а в то что разбираться в этом "изврате" из чисел сложновато и вообщем-то неохотно. А лучше всего начать с написания нормальной функции вывода бег. строки которая будет независима от длины выводимой строки и без 70-и байтного лок. буфера.
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 но как это сделать пока не знаю.