А вот шрифт в кодировке DOS размером 8x8 (не помню, но вроде бы я его когда-то с PC снял). И здесь код начинается с 0! Смещение символа равно 8*код символа.
Я так понимаю Ваш шрифт тоже с пропуском первых 32 символов? Размер символов указал правильно но символы не те выводятся что нужно... Кодировка таже? Английский текст печатает нормально а русский - иероглифы
Шрифт с пропуском первых 32 непечатаемых символов кодировка 1251(русская тобишь), так что причина не в шрифте. Я так понимаю, WinAVR - какой то особенный, если в нем не работает приведение типов:
Без этого, на нормальных компиляторах тоже нормально вторая половина шрифта не отображалась. Короче, теперь вопрос в том, как осуществляется приведение типов в WinAVR.
VDLab, У меня 5-я студия. На winavr все некак руки не доходят перейти... Может в ней и причина? Еще попробовал вывести на экран то что у меня находится в массиве символов и вот что вышло(правада все не влезли в экран): Это я коды символов передавал
_________________ Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
Так в чем же тогда может быть проблема? Может компилятор както настроить можно? У меня студия отказывается работать с файлом если в его пути присутсвтуют киррилические символы. А теперь и при компиляции проблемы с кирилицей...
_________________ Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
Нету никаких проблем с компиляцией, проблемы у Вас с текстовым редактором. Он по всей видимости использует UTF-8, а нужно cp1251. Нужно копаться в настройках студии, либо использовать другой редактор как временное решение.
Хм. С приведением типов в GCC всё в порядке (вроде бы):
Цитата:
Я так понимаю, WinAVR - какой то особенный, если в нем не работает приведение типов: ch=pgm_read_byte(&FONT8x15[(unsigned char) c-32 ][h]);
В приведении типов надо вспоминать приоритет операций. Чтобы этим не заниматься, проще написать: ch=pgm_read_byte(&FONT8x15[((unsigned char) (c))-32 ][h]); и не мучаться.
void put_string(unsigned char x, unsigned char y, char *str, unsigned int color) { unsigned char j;
while (j =*str++) { LCD_Char(x , y, j, color); x+=CHAR_W; } }
char *str В передаче строки используется тип Char а не Unsigned char. Но когда пытаюсь поставить unsigned выдает ошибку "несоответствие типов". Как это исправить? Или там все нормально? З.Ы. Может забить вообще на эту СИ-шку и перейти на старый добрый Паскаль? Там было все намного проще а тут только и делаю что на грабли наступаю... Вроде видел что Паскаль используют для АВР
_________________ Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
В передаче строки используется тип Char а не Unsigned char. Но когда пытаюсь поставить unsigned выдает ошибку "несоответствие типов". Как это исправить? Или там все нормально?
Так и должно быть.
Цитата:
Может забить вообще на эту СИ-шку и перейти на старый добрый Паскаль? Там было все намного проще а тут только и делаю что на грабли наступаю...
А вот этого не советую. Не имеет ни малейшего значения, какого типа у вас строка. Пусть будет char - это стандартная строка. Имеет огромное значение то, как вы будете вычислять смещение когда будете брать символы из строки. Совершенно не важно, что у вас в программе ниже j - unsigned char. Очень важно, какого типа у вас символ внутри LCD_Char. Сделайте вот так вот и не мучайтесь: ch=pgm_read_byte(&FONT8x15[((unsigned char) (c))-32 ][h]); Если и так не работает, то у вас просто коды символов перепутаны и всё - приведение типов тут не при чём.
Код:
void put_string(unsigned char x, unsigned char y, char *str, unsigned int color) { unsigned char j;
while (j =*str++) { LCD_Char(x , y, j, color); x+=CHAR_W; } }
Цитата:
j =*str++
Это вам кто посоветовал так сделать? Не, ну если нравится извращениями заниматься, то, конечно.
В приведении типов надо вспоминать приоритет операций.
Вы не правы, операция отнимания на низком уровне одинакова для знаковых и беззнаковых чисел. Я также это проверил, отнимание до преобразования типа и после дает одинаковый результат, даже если там происходит переход через нуль.
Честно говоря не совсем. Для меня пока язык СИ - далек. Я думаю там переменной J присваивается первый символ строки, потом следующий итд. и пока строка не закончится - цикл не завершается. А завершается наверное потому что в конце строки всегда находится ноль... Но каким образом переменная *str может в себе нести целую строку и код текущего символа этого мне не понять В Паскале такого небыло Так в чем еще может быть проблема почему у меня русские символы не отображаются?
_________________ Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
Вы не правы, операция отнимания на низком уровне одинакова для знаковых и беззнаковых чисел. Я также это проверил, отнимание до преобразования типа и после дает одинаковый результат, даже если там происходит переход через нуль.
Да, отнимание до или после действительно будет давать одинаковый результат, если будет выполнено преобразование типов. Этого я не заметил.
Цитата:
Я думаю там переменной J присваивается первый символ строки, потом следующий итд. и пока строка не закончится - цикл не завершается. А завершается наверное потому что в конце строки всегда находится ноль...
Да, разумеется.
Цитата:
Но каким образом переменная *str может в себе нести целую строку и код текущего символа этого мне не понять В Паскале такого небыло
Переменная str - это только адрес строки в памяти и информация о типе того, что там в памяти. В цикле изменяется адрес. И читается их адреса символ.
Цитата:
Так в чем еще может быть проблема почему у меня русские символы не отображаются?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения