А вот шрифт в кодировке 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 - это только адрес строки в памяти и информация о типе того, что там в памяти. В цикле изменяется адрес. И читается их адреса символ.
Цитата:
Так в чем еще может быть проблема почему у меня русские символы не отображаются?
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения