реклама на сайте
подробности

 
 
> Опрос клавиатуры на С, Как написать компактный и "красивый" код?
Make_Pic
сообщение Jun 23 2018, 05:17
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 779
Регистрация: 9-10-04
Из: Россия, Пермь
Пользователь №: 828



Опрос клавиатуры на С -> Как написать компактный и "красивый" код?
Дайте pls примеры опроса матрицы клавиш на С (C++ не надо).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
k155la3
сообщение Jun 26 2018, 08:41
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Make_Pic @ Jun 23 2018, 08:17) *
. . . .Как написать компактный и "красивый" код? . . . Дайте pls примеры . . . .
Вот пример моего кода (из первых версий), без претензий на красивость и компактность. Скорее наоборот. Претензии - на функциональность. (обработка в "событийном" режиме, очередь, скан-коды, обработка удержания).
Без комментариев sm.gif Обрабатывать напильником до требуемой формы.
CODE
// MSP430, S_M_V
// -------- keyb ---------
#define S_PORT_KEYB_IN P6IN
#define S_PORT_KEYB_OUT P6OUT
// P6.0 . . . P6.3 - входные линии матрицы, подтянуты через 100к на GND
// P6.4 . . . P6.7 - выходные линии матрицы (опрос линии установкой в 1)

static char key_wr = 0, key_rd = 0, keyCodeScan_old = 0;
char keyCodeScan = 0, KeyCode = 0;
char KeyCodeRep = 0; // запомнить код удерживаемой клавиши
char f_repeat = 0; // флаг удержания нажатия

t16_sint time_repeat; // таймаут удержания клавиши, после которого работает автоповтор

// процедура сканирования клавиатуры (аппаратный опрос линий)
// void OS::system_timer_user_hook()
// Периодически вызывается в тиках OS или в обработчике таймера
void KEY_Scan_R(void)
{
static char F_Press_now = 0, F_Press_old = 0, KKeyCode = 0;
// ================== KEY ===================================
SOUND_OFF;

keyCodeScan_old = keyCodeScan; // проверка изменения коорд. нажатия
F_Press_old = F_Press_now; // контроль событий нажатия-отжатия

key_rd = S_PORT_KEYB_IN & 0x0F; // Read keyLines 0...3 (InData) from PORT
keyCodeScan = (key_wr << 4) & 0xF0; // номер скан-линии 0 1 2 3 (row)
keyCodeScan |= key_rd & 0x0F; // считанные столбцы (col)

if( keyCodeScan & 0x0F ) // нажата как минимум 1 клавиша
{ // нажата ли любая кнопка ? 0F маска - читаем из порта только "приемные" линии
F_Press_now = 1;
if( keyCodeScan != keyCodeScan_old ) // изменен скан-код ?
{ // первый вход по нажатию клавиши
time_repeat = 0; // сбросить таймаут
f_repeat = 0;

}
else // повторные входы по нажатой клавише
{
if( f_repeat == 0 ) // пока нет события "удержание", ++ таймера
{
if( time_repeat > 62 ) //4 // 62 цикла по 16 мс - около 1с
{
time_repeat = 0; // сбросить таймаут
f_repeat = 1;
}
else
time_repeat++;

}
}

}
else // клавиша не нажата
{
F_Press_now = 0; // холостой проход - без нажатий
}

// ---------- выдать скан-линию для следующего цикла --------
if( !F_Press_now ) // продолжаем сканировать линии - тк нет нажатия
{ // далее только если не нажата кнопка
if( key_wr == 3 )
key_wr = 0;
else
key_wr++; // счетчик скан-линий ++
// ----------------------
if( key_wr == 3 ) S_PORT_KEYB_OUT = 0x80; // A B C D выбор столбца D0 D1 D2 D3
if( key_wr == 2 ) S_PORT_KEYB_OUT = 0x40; // 3 6 9 #
if( key_wr == 1 ) S_PORT_KEYB_OUT = 0x20; // 2 5 8 0
if( key_wr == 0 ) S_PORT_KEYB_OUT = 0x10; // 1 4 7 *
}

// заменить switch на перекодировку по ассоц.массиву
// ------- скан для матрицы 4x4 ---------------------
// перекодировка в KKeyCode - для PCB F5438A с подключением на мембр. кл-ру 4x4
// кабелем 9-w и HDR'10 на PCB
switch( keyCodeScan )
{
// key_wr == 0 1 4 7 *
case (0x00 | 0x01): KKeyCode = 0x31; break; // 1
case (0x00 | 0x02): KKeyCode = 0x34; break; // 4
case (0x00 | 0x04): KKeyCode = 0x37; break; // 7
case (0x00 | 0x08): KKeyCode = 0x2E; break; // * ekeyPoint
// ----------------
// key_wr == 1 2 5 8 0
case (0x10 | 0x01): KKeyCode = 0x32; break; // 2
case (0x10 | 0x02): KKeyCode = 0x35; break; // 5
case (0x10 | 0x04): KKeyCode = 0x38; break; // 8
case (0x10 | 0x08): KKeyCode = 0x30; break; // 0
// ----------------
// key_wr == 2 3 6 9 #
case (0x20 | 0x01): KKeyCode = 0x33; break; // 3
case (0x20 | 0x02): KKeyCode = 0x36; break; // 6
case (0x20 | 0x04): KKeyCode = 0x39; break; // 9
case (0x20 | 0x08): KKeyCode = 0x04; break; // # ekeyEnter
// ----------------
// key_wr == 3 A B C D
case (0x30 | 0x01): KKeyCode = 0x01; break; // A F1
case (0x30 | 0x02): KKeyCode = 0x02; break; // B F2
case (0x30 | 0x04): KKeyCode = 0x03; break; // C F3
case (0x30 | 0x08): KKeyCode = 0x05; break; // D F4

default: KKeyCode = 0x00; break; // ekeyNO
}

KeyCode = KKeyCode;
// ================= /KEY ===================================

if( F_Press_old && !F_Press_now ) // KEY_OFF
{ // обработка отжатия
time_repeat = 0;

if ( f_repeat == 2 ) // если был режим "отпуск-удержания" (2)
{
KEY_push( (t16_sint) (KeyCodeRep | 0x4000) ); // (стоп удержания) маска 0x40
//KEY_pushBf( (t16_sint) ( 0x99 | 0x4000) );

f_repeat = 0;

}
}

if( !F_Press_old && F_Press_now ) // KEY_ON
{ // обработка нажатия

SOUND_ON;

KEY_push( (t16_sint) KKeyCode ); // тк буфер 16-битный

}

if( F_Press_old && F_Press_now ) // KEY_ON_ON_ON
{ // обработка удержания

if( f_repeat == 1 )
{
f_repeat = 2; // положить в буфер код "удержания", переключиться в след. цикле на
// ожидание "отпуск-удержания" (режим 2)

KEY_push( (t16_sint) (KKeyCode | 0x8000) ); // (старт удержания) маска 0x80

// --------- системный ресет --------------------
if( KKeyCode == 0x31 ) // Reset на удержание клавиши <1>
{
SLEEP(100);
WDTCTL = WDTPW | WDTHOLD;
asm ("push &0xfffe");
asm ("ret");
}
// -------- /системный ресет --------------------

KeyCodeRep = KeyCode; // сохранить для выдачи кода отжатия
}
}

}// KEY_Scan(void)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Make_Pic   Опрос клавиатуры на С   Jun 23 2018, 05:17
- - Forger   Цитата(Make_Pic @ Jun 23 2018, 08:17) Опр...   Jun 23 2018, 06:38
|- - Make_Pic   Цитата(Forger @ Jun 23 2018, 09:38) ... Д...   Jun 23 2018, 07:20
||- - Forger   Цитата(Make_Pic @ Jun 23 2018, 10:20) Я н...   Jun 23 2018, 08:05
||- - AlexandrY   RE: Опрос клавиатуры на С   Jun 23 2018, 13:40
||- - Forger   ЦитатаB такая генерация спасает от рутины громозди...   Jun 23 2018, 13:54
|||- - AlexandrY   Цитата(Forger @ Jun 23 2018, 16:54) Отлич...   Jun 23 2018, 14:09
|||- - Forger   Цитата(AlexandrY @ Jun 23 2018, 17:09) Во...   Jun 23 2018, 14:13
|||- - AlexandrY   Цитата(Forger @ Jun 23 2018, 17:13) Друго...   Jun 23 2018, 14:22
|||- - Forger   Цитата(AlexandrY @ Jun 23 2018, 17:22) Та...   Jun 23 2018, 14:29
|||- - AlexandrY   Цитата(Forger @ Jun 23 2018, 17:29) Какие...   Jun 23 2018, 14:43
|||- - Forger   Цитата(AlexandrY @ Jun 23 2018, 17:43) Че...   Jun 23 2018, 14:54
||- - x893   Цитата(AlexandrY @ Jun 23 2018, 16:40) .....   Jun 23 2018, 15:01
||- - Сергей Борщ   QUOTE (x893 @ Jun 23 2018, 18:01) Но это ...   Jun 23 2018, 16:01
||- - AlexandrY   Цитата(Сергей Борщ @ Jun 23 2018, 19:01) ...   Jun 23 2018, 17:25
|- - x893   Цитата(Forger @ Jun 23 2018, 09:38) ... д...   Jun 23 2018, 08:03
- - iliusmaster   Обычно, чтобы ничего постояно не опрашивать, все с...   Jun 23 2018, 17:17
|- - Forger   Цитата(iliusmaster @ Jun 23 2018, 20:17) ...   Jun 23 2018, 18:03
|- - k155la3   Цитата(iliusmaster @ Jun 23 2018, 20:17) ...   Jun 24 2018, 08:23
- - ArtemKAD   Ну развели... Проблема дребезга полностью освещена...   Jun 23 2018, 19:56
|- - Forger   Цитата(ArtemKAD @ Jun 23 2018, 22:56) Ну ...   Jun 23 2018, 20:43
|- - Сергей Борщ   QUOTE (ArtemKAD @ Jun 23 2018, 22:56) For...   Jun 23 2018, 21:07
|- - Forger   Цитата(Сергей Борщ @ Jun 24 2018, 00:07) ...   Jun 23 2018, 21:17
|- - ArtemKAD   Цитата(Сергей Борщ @ Jun 24 2018, 00:07) ...   Jun 23 2018, 23:20
|- - Forger   Цитата(ArtemKAD @ Jun 24 2018, 02:20) Я б...   Jun 24 2018, 06:52
- - ArtemKAD   Импульсную подтяжку еще и на кнопку - знаете вы то...   Jun 24 2018, 07:23
|- - Forger   Цитата(ArtemKAD @ Jun 24 2018, 10:23) Имп...   Jun 24 2018, 08:10
||- - ArtemKAD   Цитата(Forger @ Jun 24 2018, 11:10) Извра...   Jun 25 2018, 22:31
||- - AlexandrY   Цитата(ArtemKAD @ Jun 26 2018, 01:31) Кон...   Jun 26 2018, 05:17
||- - Forger   Цитата(AlexandrY @ Jun 26 2018, 08:17) Чт...   Jun 26 2018, 05:25
||- - iliusmaster   Цитата(AlexandrY @ Jun 26 2018, 08:17) Чт...   Jun 26 2018, 05:30
|||- - =L.A.=   Цитата(iliusmaster @ Jun 26 2018, 08:30) ...   Jun 26 2018, 05:44
||||- - haker_fox   QUOTE (=L.A.= @ Jun 26 2018, 13:44) Писан...   Jun 26 2018, 06:32
||||- - Forger   Имхо, физика процесса тут не очень однозначная: ра...   Jun 26 2018, 06:52
|||- - AlexandrY   Цитата(iliusmaster @ Jun 26 2018, 08:30) ...   Jun 26 2018, 07:42
|||- - Forger   Цитата(AlexandrY @ Jun 26 2018, 10:42) По...   Jun 26 2018, 07:49
|||- - iliusmaster   Цитата(AlexandrY @ Jun 26 2018, 10:42) А ...   Jun 28 2018, 15:55
|||- - AlexandrY   Цитата(iliusmaster @ Jun 28 2018, 18:55) ...   Jun 28 2018, 19:40
|||- - Herz   Цитата(AlexandrY @ Jun 28 2018, 22:40) Ну...   Jun 28 2018, 19:49
||||- - AlexandrY   Цитата(Herz @ Jun 28 2018, 22:49) Коллега...   Jun 28 2018, 20:27
||||- - Forger   Вот еще немного любопытной информации про электрич...   Jun 28 2018, 20:28
|||||- - AlexandrY   Цитата(Forger @ Jun 28 2018, 23:28) Вот е...   Jun 29 2018, 04:36
|||||- - Forger   Цитата(AlexandrY @ Jun 29 2018, 07:36) У ...   Jun 29 2018, 05:08
|||||- - AlexandrY   Цитата(Forger @ Jun 29 2018, 08:08) И не ...   Jun 29 2018, 05:39
|||||- - Forger   Цитата(AlexandrY @ Jun 29 2018, 08:39) Ищ...   Jun 29 2018, 05:50
|||||- - AlexandrY   Цитата(Forger @ Jun 29 2018, 08:50) По-хо...   Jun 29 2018, 06:40
|||||- - Forger   Цитата(AlexandrY @ Jun 29 2018, 09:40) От...   Jun 29 2018, 06:51
|||||- - AlexandrY   Цитата(Forger @ Jun 29 2018, 09:51) Пруфы...   Jun 29 2018, 06:56
|||||- - Forger   Цитата(AlexandrY)Также вам предлагаю помолчать отн...   Jun 29 2018, 07:05
||||- - rx3apf   Цитата(AlexandrY @ Jun 28 2018, 23:27) То...   Jun 28 2018, 20:41
|||||- - AlexandrY   Цитата(rx3apf @ Jun 28 2018, 23:41) Все б...   Jun 28 2018, 20:43
||||- - Herz   Цитата(AlexandrY @ Jun 28 2018, 23:27) С ...   Jun 28 2018, 23:13
|||- - rx3apf   Цитата(AlexandrY @ Jun 28 2018, 22:40) (д...   Jun 28 2018, 20:11
||- - ArtemKAD   Цитата(AlexandrY @ Jun 26 2018, 08:17) Чт...   Jun 28 2018, 14:42
|- - Herz   Цитата(ArtemKAD @ Jun 24 2018, 10:23) Имп...   Jun 24 2018, 09:50
|- - Forger   Цитата(Herz @ Jun 24 2018, 12:50) Греть р...   Jun 24 2018, 10:03
|- - Herz   Цитата(Forger @ Jun 24 2018, 13:03) Напри...   Jun 25 2018, 10:02
|- - Forger   Цитата(Herz @ Jun 25 2018, 13:02) А зачем...   Jun 25 2018, 12:13
|- - AlexandrY   Цитата(Forger @ Jun 25 2018, 15:13) Вы ве...   Jun 25 2018, 12:24
|- - Forger   Цитата(AlexandrY @ Jun 25 2018, 15:24) А ...   Jun 25 2018, 12:32
- - iliusmaster   У музыкантов нужно точно отслеживать длительность ...   Jun 24 2018, 09:30
|- - Forger   Цитата(iliusmaster @ Jun 24 2018, 12:30) ...   Jun 24 2018, 09:38
|- - k155la3   Цитата(iliusmaster @ Jun 24 2018, 12:30) ...   Jun 24 2018, 09:57
- - iliusmaster   Ну раз музыканты это специфика, то вот еще один пр...   Jun 24 2018, 11:11
|- - Forger   Цитата(iliusmaster @ Jun 24 2018, 14:11) ...   Jun 24 2018, 11:21
|- - k155la3   Цитата(iliusmaster @ Jun 24 2018, 14:11) ...   Jun 24 2018, 13:07
|- - Make_Pic   Цитата(k155la3 @ Jun 24 2018, 17:07) Мой ...   Jun 25 2018, 02:06
|- - AlexandrY   Цитата(Make_Pic @ Jun 25 2018, 05:06) Тем...   Jun 25 2018, 08:49
|- - k155la3   Цитата(Make_Pic @ Jun 25 2018, 05:06) Тем...   Jun 25 2018, 09:09
||- - AlexandrY   Цитата(k155la3 @ Jun 25 2018, 12:09) Вот ...   Jun 25 2018, 10:35
|- - arhiv6   Цитата(Make_Pic @ Jun 25 2018, 09:06) Тем...   Jun 27 2018, 05:34
- - Jenya7   В последних проектах юзаем ADP5589. Изначально я б...   Jun 26 2018, 14:35
|- - Forger   Цитата(Jenya7 @ Jun 26 2018, 17:35) В пос...   Jun 26 2018, 15:24
||- - haker_fox   QUOTE (Forger @ Jun 26 2018, 23:24) Имхо,...   Jun 27 2018, 02:32
|||- - Forger   Цитата(haker_fox @ Jun 27 2018, 05:32) Ну...   Jun 27 2018, 04:35
||- - k155la3   Цитата(Forger @ Jun 26 2018, 18:24) Код в...   Jun 27 2018, 06:36
|- - AlexandrY   Цитата(Jenya7 @ Jun 26 2018, 17:35) В пос...   Jun 27 2018, 05:08
- - haker_fox   QUOTE (Forger @ Jun 27 2018, 12:35) Спорн...   Jun 27 2018, 07:22
- - rx3apf   Напряжение, очевидно, нужно чтобы пробить пленку. ...   Jun 28 2018, 15:59
- - Forger   Цитата(iliusmaster) Цитата(rx3apf) Вот: https://el...   Jun 28 2018, 16:04


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 11:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01505 секунд с 7
ELECTRONIX ©2004-2016