|
Опрос клавиатуры на С, Как написать компактный и "красивый" код? |
|
|
|
 |
Ответов
|
Jun 26 2018, 08:41
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(Make_Pic @ Jun 23 2018, 08:17)  . . . .Как написать компактный и "красивый" код? . . . Дайте pls примеры . . . . Вот пример моего кода (из первых версий), без претензий на красивость и компактность. Скорее наоборот. Претензии - на функциональность. (обработка в "событийном" режиме, очередь, скан-коды, обработка удержания). Без комментариев  Обрабатывать напильником до требуемой формы. 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)
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|