Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Шрифт с пропуском первых 32 непечатаемых символов кодировка 1251(русская тобишь), так что причина не в шрифте.Зукс писал(а):Я так понимаю Ваш шрифт тоже с пропуском первых 32 символов? Размер символов указал правильно но символы не те выводятся что нужно... Кодировка таже?
Английский текст печатает нормально а русский - иероглифы

Это ж вроде только среда разработки, а к ней уже компилятор подключается (насколько я знаю).У меня 5-я студия...
Код: Выделить всё
#include <stdio.h>
int main()
{
char a = -31;
unsigned char b = (unsigned char)a;
printf("%i, %i\n", (int)a, (int)b);
return 0;
}Хм. С приведением типов в GCC всё в порядке (вроде бы):
В приведении типов надо вспоминать приоритет операций. Чтобы этим не заниматься, проще написать: ch=pgm_read_byte(&FONT8x15[((unsigned char) (c))-32 ][h]); и не мучаться.Я так понимаю, WinAVR - какой то особенный, если в нем не работает приведение типов:
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 а не Unsigned char. Но когда пытаюсь поставить unsigned выдает ошибку "несоответствие типов". Как это исправить? Или там все нормально?
А вот этого не советую. Не имеет ни малейшего значения, какого типа у вас строка. Пусть будет char - это стандартная строка. Имеет огромное значение то, как вы будете вычислять смещение когда будете брать символы из строки.Может забить вообще на эту СИ-шку и перейти на старый добрый Паскаль? Там было все намного проще а тут только и делаю что на грабли наступаю...
Код: Выделить всё
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++
VDLab посоветовал. Я в Си-шке плохо разбираюсьЭто вам кто посоветовал так сделать? Не, ну если нравится извращениями заниматься, то, конечно.
Код: Выделить всё
ch=pgm_read_byte(&FONT8x15[((unsigned char) (c))-32 ][h])Код: Выделить всё
ch=pgm_read_byte(&FONT8x15[(unsigned char) c-32 ][h])А вы понимаете, что это выражение делает? И почему оно заканчивает вывод строки по достижению нуля.VDLab посоветовал. Я в Си-шке плохо разбираюсь
Вот функции печати:У меня эта часть выглядит вот так:
Код: Выделить всё
//----------------------------------------------------------------------------------------------------
//вывод символа в позицию
//----------------------------------------------------------------------------------------------------
inline void LCD_PutSymbol(unsigned char x,unsigned char y,unsigned char symbol,unsigned short color,unsigned short bkcolor)
{
if (symbol<32 || symbol>223) return;
symbol-=32;
LCD_SetOutputRectangle(x,y,x+7,y+13);
for(y=0;y<14;y++)
{
unsigned char byte=pgm_read_byte(&(Font8x14[symbol][y]));
for(x=0;x<8;x++,byte<<=1)
{
if (byte&0x80) LCD_SetPixel(color);
else LCD_SetPixel(bkcolor);
}
}
}
//----------------------------------------------------------------------------------------------------
//вывод строчки в позицию
//----------------------------------------------------------------------------------------------------
inline void LCD_PutString(unsigned char x,unsigned char y,const char *string,unsigned short color,unsigned short bkcolor)
{
unsigned char l=strlen(string);
for(unsigned char n=0;n<l;n++,x+=8)
{
LCD_PutSymbol(x,y,string[n],color,bkcolor);
}
}
Вы не правы, операция отнимания на низком уровне одинакова для знаковых и беззнаковых чисел. Я также это проверил, отнимание до преобразования типа и после дает одинаковый результат, даже если там происходит переход через нуль.da-nie писал(а):В приведении типов надо вспоминать приоритет операций.
Код: Выделить всё
А вы понимаете, что это выражение делает?Да, отнимание до или после действительно будет давать одинаковый результат, если будет выполнено преобразование типов. Этого я не заметил.Вы не правы, операция отнимания на низком уровне одинакова для знаковых и беззнаковых чисел. Я также это проверил, отнимание до преобразования типа и после дает одинаковый результат, даже если там происходит переход через нуль.
Да, разумеется.Я думаю там переменной J присваивается первый символ строки, потом следующий итд. и пока строка не закончится - цикл не завершается. А завершается наверное потому что в конце строки всегда находится ноль...
Переменная str - это только адрес строки в памяти и информация о типе того, что там в памяти. В цикле изменяется адрес. И читается их адреса символ.Но каким образом переменная *str может в себе нести целую строку и код текущего символа этого мне не понятьВ Паскале такого небыло
Я дал пример. Он работает у вас?Так в чем еще может быть проблема почему у меня русские символы не отображаются?