Показаны сообщения с ярлыком микроконтроллеры. Показать все сообщения
Показаны сообщения с ярлыком микроконтроллеры. Показать все сообщения
0

Кириллица для LCD

На днях коллеги по работе интересовались у меня документацией по LCD и, естественно, встал вопрос о том, можно ли на них выводить символы кириллицы. Когда то я занимался этой проблемой, и даже сам составил такую таблицу для "своего" LCD фирмы Winstar WH2002A. Если начертание кириллического и латинского символов совпадают, то для такого кириллического символа нет "своего" кода, он заменяется латинским. Извиняюсь, что все коды приведены в десятичной системе, просто когда я их получал "опытным путем", мне так было удобнее. Итак, сама таблица:
Код Символ Код Символ Код Символ Код Символ
160Б 161Г 162Ё 163Ж
164З 165И 166Й 167Л
168П 169У 170Ф 171Ч
172Ш 173Ъ 174Ы 175Э
176Ю 177Я 178б 179в
180г 181ё 182ж 183з
184и 185й 186к 187л
188м 189н 190п 191т
192ч 193ш 194ъ 195ы
196ь 197э 198ю 199я
224Д 225Ц 226Щ 227д
228ф 229ц 230щ
12

Микроконтроллеры и язык Си: указатели на функции

Последние пару месяцев я занимаюсь тем, что пишу программку для одного микроконтроллера (для M30624, семейство m16c/62). Хотя называть его "микроконтроллер" - не совсем правильно, поскольку микросхема эта довольно навороченная.

Частенько я программу для контроллера описываю в виде графа состояний. Имеется одна глобальная переменная STATE, в зависимости от значения которой вызываются соответствующие подпрограммы, например вот так:

while(1)
{
int res;
int cmd = getCommand();
switch(STATE)
{
case STATE_1:
res = sub_prog1(cmd);
break;
case STATE_2:
res = sub_prog2(cmd);
break;
...
..
case STATE_N:
res = sub_progN(cmd);
}
STATE = res;
}

В этот раз состояний оказалось многовато, более 20 штук (а точнее - 22). Возможно, я что-то не то сделал, и все это можно было как-то иначе описать, но... пока не хочется, думаю что и так все будет фурыкать. Другое дело, что неохота было такой громадный оператор switch расписывать. Тут я вовремя вспомнил про указатели на функции. Хорошая штука, только на работе, млин, ни одной книжки по Сям не оказалось, а я, как на зло, забыл, как оно называется. Искал в инете по словам "процедурный тип", "функциональный тип" и т.п, и ессно, ничего нужного мне не нашел. На скорую руку написал по памяти:

typedef int (*StateHandler)(int);

По моим представлениям, такое объявление дает понять компилятору, что StateHandler - это указатель на функцию, возвращающую тип int и принимающую один параметр тоже типа int. Как потом оказалось, правильно я его все-таки объявил :) После этого приведенный в начале поста код можно переписать уже вот так:

StateHandler handlers[] = {sub_prog1, sub_prog2, ... sub_progN};

while(1)
{
cmd = getCommand();
STATE = (*(handlers[STATE]))(cmd);
}

По-моему, получается короче, да и работать наверняка будет побыстрее. Главное, чтобы значения переменной STATE шли по-порядку, но имхо, это как раз не проблема.