Перейти к содержанию
    

Зашивание текста в память микроконтроллера.

Там же кириллица не совпадает с кодировкой руссифицированного HD-44780

Сделайте таблицу перекодировки и все будет совпадать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не, таблица перекодировки - это некрасиво. Лишний объём флеша на то, что можно сделать до компиляции программы.

 

Можно перекодировку и в командный файл sed вставить, но это уже хотелось бы делать на чём-то более высокого уровня. Например, очень хороший перекодировщик

http://www.onembedding.com/tools/utility/pylcdstring/

но оно тоже рассчитано на то, что изначальный текст набивается вручную :)

 

Кстати, а какая проблема набить вручную небольшие объёмы текста? Особенно если они не превышают объём постов в этой теме? ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Текст длиной около 1000 символов. Ну.... в принципе 1 раз можно переморщиться..... Но проблема еще в том, что в каждом следующем приборе сообщения могут быть свои, отличные от предыдущих. И каждый раз долбить в компиляторе текст, честно говоря, не вдохновляет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Текст длиной около 1000 символов. Ну.... в принципе 1 раз можно переморщиться..... Но проблема еще в том, что в каждом следующем приборе сообщения могут быть свои, отличные от предыдущих. И каждый раз долбить в компиляторе текст, честно говоря, не вдохновляет.

 

 

тут вот вопрос возник...

а собственно кто мешает инклудить Ваши строки данных как внешнии файлы.. а в файлы уже заливать кодировщиком ? Или религия не-не ?

 

с уважением

(круглый)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот штука, которая спасет отцов русской демократии.

Да возблагодарят они (как и я) автора ее!

text_for_HD44780.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для перекодировки во время компиляции

для иаровского асма сделал такой макрос:

;-----------------------------------

LCDstr: macro

reptc chr,\1

if 'chr'='└'

db 65

elseif 'chr'='┴'

db 160

elseif 'chr'='┬'

db 66

elseif 'chr'='├'

db 161

elseif 'chr'='─'

db 224

elseif 'chr'='┼'

db 69

elseif 'chr'='╞'

db 163

elseif 'chr'='╟'

db 164

elseif 'chr'='╚'

db 165

elseif 'chr'='╔'

db 166

elseif 'chr'='╩'

db 75

elseif 'chr'='╦'

db 167

elseif 'chr'='╠'

db 77

elseif 'chr'='═'

db 72

elseif 'chr'='╬'

db 79

elseif 'chr'='╧'

db 168

elseif 'chr'='╨'

db 80

elseif 'chr'='╤'

db 67

elseif 'chr'='╥'

db 84

elseif 'chr'='╙'

db 169

elseif 'chr'='╘'

db 228

elseif 'chr'='╒'

db 88

elseif 'chr'='╓'

db 225

elseif 'chr'='╫'

db 171

elseif 'chr'='╪'

db 172

elseif 'chr'='┘'

db 226

elseif 'chr'='┌'

db 173

elseif 'chr'='█'

db 174

elseif 'chr'='▄'

db 98

elseif 'chr'='▌'

db 175

elseif 'chr'='▐'

db 176

elseif 'chr'='▀'

db 177

elseif 'chr'='р'

db 97

elseif 'chr'='с'

db 178

elseif 'chr'='т'

db 179

elseif 'chr'='у'

db 180

elseif 'chr'='ф'

db 227

elseif 'chr'='х'

db 101

elseif 'chr'='ц'

db 182

elseif 'chr'='ч'

db 183

elseif 'chr'='ш'

db 184

elseif 'chr'='щ'

db 185

elseif 'chr'='ъ'

db 186

elseif 'chr'='ы'

db 187

elseif 'chr'='ь'

db 188

elseif 'chr'='э'

db 189

elseif 'chr'='ю'

db 111

elseif 'chr'='я'

db 190

elseif 'chr'='Ё'

db 112

elseif 'chr'='ё'

db 99

elseif 'chr'='Є'

db 191

elseif 'chr'='є'

db 121

elseif 'chr'='Ї'

db 228

elseif 'chr'='ї'

db 120

elseif 'chr'='Ў'

db 229

elseif 'chr'='ў'

db 192

elseif 'chr'='°'

db 193

elseif 'chr'='∙'

db 230

elseif 'chr'='·'

db 194

elseif 'chr'='√'

db 195

elseif 'chr'='№'

db 196

elseif 'chr'='¤'

db 197

elseif 'chr'='■'

db 198

elseif 'chr'='ж'

db 199

elseif 'chr'='и'

db 162

elseif 'chr'='╕'

db 181

else

db 'chr'

endif

endr

db 0

endm

;-----------------------------------

 

инклужу его из отдельного файла,

в программе пишу:

 

LSTEXP-

str0: LCDstr "строка по-русски"

str1: LCDstr "больщая буква Я работает"

str2: LCDstr "вместо маленькой приходится ставить вертикальную палку"

even

LSTEXP+

 

LSTEXP - это чтоб компилер результат этого макроса в листинг не писал,

а то уж очень нечитаемый листинг получается.

нуль в конец строки он сам добавляет...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Внесу свои 4.(9) копеек:

 

перекодировщик Win1251 => HD44780, работает по принципу "фильтра":

CODE4LCD < Text_1251.txt > Text_44780.txt

Применять по вкусу ;) . Я в makefile вставляю, перед компиляцией...

CODE4LCD.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Макрос, разумеется, такой. (в пред. посте кодировку не сменил):

 

 

LCDstr: macro

reptc chr,\1

if 'chr'='А'

db 65

elseif 'chr'='Б'

db 160

elseif 'chr'='В'

db 66

elseif 'chr'='Г'

db 161

elseif 'chr'='Д'

db 224

elseif 'chr'='Е'

db 69

elseif 'chr'='Ж'

db 163

elseif 'chr'='З'

db 164

elseif 'chr'='И'

db 165

elseif 'chr'='Й'

db 166

elseif 'chr'='К'

db 75

elseif 'chr'='Л'

db 167

elseif 'chr'='М'

db 77

elseif 'chr'='Н'

db 72

elseif 'chr'='О'

db 79

elseif 'chr'='П'

db 168

elseif 'chr'='Р'

db 80

elseif 'chr'='С'

db 67

elseif 'chr'='Т'

db 84

elseif 'chr'='У'

db 169

elseif 'chr'='Ф'

db 228

elseif 'chr'='Х'

db 88

elseif 'chr'='Ц'

db 225

elseif 'chr'='Ч'

db 171

elseif 'chr'='Ш'

db 172

elseif 'chr'='Щ'

db 226

elseif 'chr'='Ъ'

db 173

elseif 'chr'='Ы'

db 174

elseif 'chr'='Ь'

db 98

elseif 'chr'='Э'

db 175

elseif 'chr'='Ю'

db 176

elseif 'chr'='Я'

db 177

elseif 'chr'='а'

db 97

elseif 'chr'='б'

db 178

elseif 'chr'='в'

db 179

elseif 'chr'='г'

db 180

elseif 'chr'='д'

db 227

elseif 'chr'='е'

db 101

elseif 'chr'='ж'

db 182

elseif 'chr'='з'

db 183

elseif 'chr'='и'

db 184

elseif 'chr'='й'

db 185

elseif 'chr'='к'

db 186

elseif 'chr'='л'

db 187

elseif 'chr'='м'

db 188

elseif 'chr'='н'

db 189

elseif 'chr'='о'

db 111

elseif 'chr'='п'

db 190

elseif 'chr'='р'

db 112

elseif 'chr'='с'

db 99

elseif 'chr'='т'

db 191

elseif 'chr'='у'

db 121

elseif 'chr'='ф'

db 228

elseif 'chr'='х'

db 120

elseif 'chr'='ц'

db 229

elseif 'chr'='ч'

db 192

elseif 'chr'='ш'

db 193

elseif 'chr'='щ'

db 230

elseif 'chr'='ъ'

db 194

elseif 'chr'='ы'

db 195

elseif 'chr'='ь'

db 196

elseif 'chr'='э'

db 197

elseif 'chr'='ю'

db 198

elseif 'chr'='╓'

db 199

elseif 'chr'='Ё'

db 162

elseif 'chr'='ё'

db 181

else

db 'chr'

endif

endr

db 0

endm

 

вместо прописной 'я' приходится альт-214 вводить...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тема древняя как г мамонта, но вот сейчас пришлось заморачиваться такойже проблемой, и решил поделиться своим решением. Вот взял коды из макроса qqqqqq для своей таблички...

// коды букв русского алфавита в таблице контроллера жки
unsigned char __flash LcdRusChar[] =
{
  65,160,66,161,224,69,163,164,165,166,75,167,77,72,79,168,80,67,
  84,169,228,88,225,171,172,226,173,174,98,175,176,177,97,178,179,
  180,227,101,182,183,184,185,186,187,188,189,111,190,112,99,191,
  121,228,120,229,192,193,230,194,195,196,197,198,199
};

а в процедуру вывода символов на жки вставляется пара строк:

  if(c >= 192) // 192 - код русской А в кодировке WIN1251
  {
    c = LcdRusChar[c-192]; // перекодировка в русские символы на жки
  }
    lcdDataWrite(c);

проблемы с буквой "я" нет. Да, перекодировка на лету, но в сравнении со общим временем обращения к ЖКИ это пшик. Ну и плюс 64 байта табличка. Зато как удобно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Waso, поддерживаю.

Я тоже делал что-то родственное на CvAVR.

Да, жрёт лишние пол-копейки флэша, зато удобно и переносимо на любые компиляторы (применял и на WnAVR), в отличие от асмовских макросов и прочих "хитростей", которые у каждого компилятора со своими выкрутасами.

Изменено пользователем hd44780

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть даже универсальное решение одновременно для IAR и WinAVR, но на С++. Кому интересно посмотрите как это сделано в классе CLCD.

 

Ну и мой вариант таблицы перекодировки:

 

/*   +----------------+
 |Таблица символов|
 |Windows (ANSI)  |
 +----------------+	  +----------------+
 |0123456789ABCDEF|	  |0123456789ABCDEF|
 +----------------+	  +----------------+
0x00 |( пропущено )   | 0x80 |( пропущено )   |
0x10 |( пропущено )   | 0x90 |( пропущено )   |
0x20 | !"#$%&'()*+,-./| 0xA0 |( пропущено )   |
0x30 |0123456789:;<=>?| 0xB0 |( пропущено )   |
0x40 |@ABCDEFGHIJKLMNO| 0xC0 |АБВГДЕЖЗИЙКЛМНОП|
0x50 |PQRSTUVWXYZ[\]^_| 0xD0 |РСТУФХЦЧШЩЪЫЬЭЮЯ|
0x60 |`abcdefghijklmno| 0xE0 |абвгдежзийклмноп|
0x70 |pqrstuvwxyz{|}~ | 0xF0 |рстуфхцчшщъыьэюя|
 +----------------+	  +----------------+
*/

// Таблица перекодировки из CP1251 (WIN)
#ifdef __ICCAVR__
__flash uint8_t CP1251_TO_CPHD44780[ 256 ] = {
#elif defined __GNUC__
PROGMEM uint8_t _CP1251_TO_CPHD44780[ 256 ] = {
#endif
//PROGMEM unsigned char CP1251_TO_CPHD44780[ 256 ] = {
  /* +---------------------------------------------------------------------------------------------------------------+
	 |  00  |  01  |  02  |  03  |  04  |  05  |  06  |  07  |  08  |  09  |  0A  |  0B  |  0C  |  0D  |  0E  |  0F  | */
/* CGRAM:  (1)	(2)	(3)	(4)	(5)	(6)	(7)	(8)	(1)	(2)	(3)	(4)	(5)	(6)	(7)	(8)	*/
/* 0x00 */ 0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08 , 0x09 , 0x0A , 0x0B , 0x0C , 0x0D , 0x0E , 0x0F , //

/* 0x10 */ 0x10 , 0x11 , 0x12 , 0x13 , 0x14 , 0x15 , 0x16 , 0x17 , 0x18 , 0x19 , 0x1A , 0x1B , 0x1C , 0x1D , 0x1E , 0x1F , //
/* 0x20 */ 0x20 , 0x21 , 0x22 , 0x23 , 0x24 , 0x25 , 0x26 , 0x27 , 0x28 , 0x29 , 0x2A , 0x2B , 0x2C , 0x2D , 0x2E , 0x2F , //
/* 0x30 */ 0x30 , 0x31 , 0x32 , 0x33 , 0x34 , 0x35 , 0x36 , 0x37 , 0x38 , 0x39 , 0x3A , 0x3B , 0x3C , 0x3D , 0x3E , 0x3F , //
/* 0x40 */ 0x40 , 0x41 , 0x42 , 0x43 , 0x44 , 0x45 , 0x46 , 0x47 , 0x48 , 0x49 , 0x4A , 0x4B , 0x4C , 0x4D , 0x4E , 0x4F , //
/* 0x50 */ 0x50 , 0x51 , 0x52 , 0x53 , 0x54 , 0x55 , 0x56 , 0x57 , 0x58 , 0x59 , 0x5A , 0x5B , 0x20 , 0x5D , 0x5E , 0x5F , //
/* 0x60 */ 0x60 , 0x61 , 0x62 , 0x63 , 0x64 , 0x65 , 0x66 , 0x67 , 0x68 , 0x69 , 0x6A , 0x6B , 0x6C , 0x6D , 0x6E , 0x6F , //
/* 0x70 */ 0x70 , 0x71 , 0x72 , 0x73 , 0x74 , 0x75 , 0x76 , 0x77 , 0x78 , 0x79 , 0x7A , 0x5B , 0x20 , 0x5D , 0xE9 , 0x7F , //
   /*|  00  |  01  |  02  |  03  |  04  |  05  |  06  |  07  |  08  |  09  |  0A  |  0B  |  0C  |  0D  |  0E  |  0F  | */
/* 0x80 */ 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , //
/* 0x90 */ 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , //
/* 0xA0 */ 0xCB , 0x20 , 0x49 , 0x69 , 0x04 , 0x20 , 0xFE , 0xEF , 0xA2 , 0xCC , 0x00 , 0xC9 , 0x20 , 0x20 , 0x20 , 0x02 , //
/* 0xB0 */ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xB5 , 0x4E , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , //
/* 0xC0 */ 0x41 , 0xA0 , 0x42 , 0xA1 , 0xE0 , 0x45 , 0xA3 , 0xA4 , 0xA5 , 0xA6 , 0x4B , 0xA7 , 0x4D , 0x48 , 0x4F , 0xA8 , //
/* 0xD0 */ 0x50 , 0x43 , 0x54 , 0xA9 , 0xAA , 0x58 , 0xE1 , 0xAB , 0xAC , 0xE2 , 0xAD , 0xAE , 0x62 , 0xAF , 0xB0 , 0xB1 , //
/* 0xE0 */ 0x61 , 0xB2 , 0xB3 , 0xB4 , 0xE3 , 0x65 , 0xB6 , 0xB7 , 0xB8 , 0xB9 , 0xBA , 0xBB , 0xBC , 0xBD , 0x6F , 0xBE , //
/* 0xF0 */ 0x70 , 0x63 , 0xBF , 0x79 , 0xE4 , 0x78 , 0xE5 , 0xC0 , 0xC1 , 0xE6 , 0xC2 , 0xC3 , 0xC4 , 0xC5 , 0xC6 , 0xC7 , //
  /* |  00  |  01  |  02  |  03  |  04  |  05  |  06  |  07  |  08  |  09  |  0A  |  0B  |  0C  |  0D  |  0E  |  0F  |
	 +---------------------------------------------------------------------------------------------------------------+ */
};
#ifdef __GNUC__
FU08T_PTR CP1251_TO_CPHD44780(_CP1251_TO_CPHD44780);
#endif

Изменено пользователем IgorKossak
[codebox] для длинного кода!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кому интересно посмотрите как это сделано в классе CLCD.
А из каких соображений эта таблица не является статическим членом класса?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А из каких соображений эта таблица не является статическим членом класса?

Из тех соображений, что у меня код одновременно компилируется в IAR и GCC, что наложило отпечаток на форму декларации принадлежности к флешу. В GCC варианте создаётся два идентификатора: массив и указатель на него, а у IAR'а можно обойтись только одним. Не знаю как это объяснить компилятору в терминах членов класса. Пока это не критично, функционал ещё допиливается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...