|
Как "красиво" написать этот кусочек?, Хочется писать красиво... |
|
|
|
Mar 22 2007, 21:44
|

Профессионал
    
Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360

|
Вот такой кусочек кода, как написать его покрасивее? Заранее благодарен за внимание! Код void read_key(void) { if(PINA==0xFE) { up_press=1; } else { up_press=0; };
if(PINA==0xFD) { down_press=1; } else { down_press=0; };
if(PINA==0xFB) { left_press=1; } else { left_press=0; };
if(PINA==0xF7) { right_press=1; } else { right_press=0; };
if(PINA==0xEF) { mode_press=1; } else { mode_press=0; };
if(PINA==0xDF) { set_press=1; } else { set_press=0; }; }
--------------------
Андрей Смирнов
|
|
|
|
|
Mar 22 2007, 22:06
|
Участник

Группа: Участник
Сообщений: 70
Регистрация: 25-07-05
Из: Екатеринбург
Пользователь №: 7 077

|
Цитата(Pyku_He_oTTyda @ Mar 22 2007, 21:44)  Вот такой кусочек кода, как написать его покрасивее? Заранее благодарен за внимание! не совсем понятен смысл key_press потому как если PINA!=0xDF, то key_press = 0, вне зависимости от предыдущих кнопок. красота понятие относительное... как вариант заменить if/else на условный оператор, что немного сократит текст, но не факт, что станет красивее. Код up_press = PINA==0xFE ? 1 : 0; в делнейшем лучше сделать переменные состояния типом bool, тогда возможно будет написать Код up_press = PINA==0xFE; как то так...
|
|
|
|
|
Mar 22 2007, 22:08
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Pyku_He_oTTyda @ Mar 22 2007, 21:44)  Вот такой кусочек кода, как написать его покрасивее? Заранее благодарен за внимание! Код ............ А у Вас несколько кнопок не могут одновременно быть нажаты ? Если могут, вот так PINA==0xFE писать нельзя. И что значит покрасивее ? Что экономим ? flash или RAM ? нужно быстрее или короче код ? и т.д. .... и какой компилятор ?
|
|
|
|
|
Mar 22 2007, 22:09
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Pyku_He_oTTyda @ Mar 22 2007, 20:44)  Вот такой кусочек кода, как написать его покрасивее? Смотря что подразумевать под "красивее". можно так: Код #define KEY_UP (1<<0) #define KEY_DOWN (1<<1) #define KEY_LEFT (1<<2) #define KEY_RIGHT (1<<3) #define KEY_MODE (1<<4) #define KEY_SET (1<<5)
void read_key() { uint8_t Port_Val = PINA; if(!(Port_Val & KEY_UP)) up_press = 1; else up_press = 0;
....... if( !(Port_Val & (KEY_UP | KEY_DOWN | KEY_LEFT | KEY_RIGHT | KEY_SET | KEY_MODE))) key_press = 1; else key_press = 0; } А можно так: Код #define KEY_UP (1<<0) #define KEY_DOWN (1<<1) #define KEY_LEFT (1<<2) #define KEY_RIGHT (1<<3) #define KEY_MODE (1<<4) #define KEY_SET (1<<5)
enum keypressed_t {RELEASED, UP, DOWN, LEFT, RIGHT, MODE, SET}; keypressed_t Key; void read_key() { uint8_t Port_Val = PINA; if(!(Port_Val & KEY_UP)) Key = UP; else if(!(Port_Val & KEY_DOWN)) Key = DOWN; .......
else Key = RELEASED; }
void check_key() { switch(Key) { case UP: ..... break; case DOWN: ..... break; case RELEASED: default: ..... break; } }
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 22 2007, 22:37
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Pyku_He_oTTyda @ Mar 22 2007, 21:26)  Спасибо! Несколько кнопок не могут быть нажаты, это считается ошибкой. Тогда вполне мой второй вариант подходит. Зачем держать семь переменных, для которых валидным будет только семь значений на всех? Можно еще поправить: Код enum keypressed_t {RELEASED, UP, DOWN, LEFT, RIGHT, MODE, SET, MAX_KEY}; void read_key() { uint8_t Port_Val = ~PINA; uint8_t Mask = 1 << (MAX_KEY - 1); uint8_t Key_tmp = MAX_KEY - 1; do { if(Port_Val & Mask) break; Mask >>= 1; Key_tmp--; } while(Mask); Key = Key_tmp; }
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 22 2007, 22:40
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
А значения up_press, down_press , ..... нельзя объединить в массив ? по моему это сильно упростило бы код Цитата(Pyku_He_oTTyda @ Mar 22 2007, 22:26)  Несколько кнопок не могут быть нажаты, это считается ошибкой. то есть если несколько нажато, то считаем что не нажато ни одной ?
|
|
|
|
|
Mar 22 2007, 22:48
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Сергей Борщ @ Mar 22 2007, 22:37)  Тогда вполне мой второй вариант подходит. Зачем держать семь переменных, для которых валидным будет только семь значений на всех? Можно еще поправить: Код if(Port_Val & Mask) break; } так мы ловим первую по списку нажатую чтобы проверить что нажата только 1 нужно заменить break; на например tmp++; и в конце цикла проверять tmp<2
|
|
|
|
|
Mar 22 2007, 22:57
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(singlskv @ Mar 22 2007, 21:48)  так мы ловим первую по списку нажатую чтобы проверить что нажата только 1 нужно заменить break; на например tmp++; и в конце цикла проверять tmp<2 Да, про то, что две нажатые считаются как "ни одной" на момент написания не было. Тогда можно или считать, или так: Код void read_key() { uint8_t Port_Val = ~PINA; Port_Val &= (1<<MAX_KEYS) - 1; // mask unused bits if(!(Port_Val & (Port_Val - 1))) // if only one key pressed { uint8_t Mask = 1 << (MAX_KEY - 1); uint8_t Key_tmp = MAX_KEY - 1; do { if(Port_Val & Mask) break; Mask >>= 1; Key_tmp--; } while(Mask); Key = Key_tmp; } else Key = RELEASED; }
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 22 2007, 23:41
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Сергей Борщ @ Mar 22 2007, 22:57)  Да, про то, что две нажатые считаются как "ни одной" на момент написания не было. Тогда можно или считать, или так: Код void read_key() { uint8_t Port_Val = ~PINA; Port_Val &= (1<<MAX_KEYS) - 1; // mask unused bits if(!(Port_Val & (Port_Val - 1))) // if only one key pressed { uint8_t Mask = 1 << (MAX_KEY - 1); uint8_t Key_tmp = MAX_KEY - 1; do { if(Port_Val & Mask) break; Mask >>= 1; Key_tmp--; } while(Mask); Key = Key_tmp; } else Key = RELEASED; } Да, наверное так будет оптимально только вот здесь: uint8_t Mask = 1 << (MAX_KEY - 1); случайно не -2 ?
|
|
|
|
|
Mar 23 2007, 00:30
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
А если так??? Код #define CNT_KEY 6 // Число кнопок __no_init struct { uint8_t Up : 1, // Вверх Down : 1, // Вниз Left : 1, // Влево Right : 1, // Вправо Mode : 1, // Мода Set : 1; // Установить } Key;
void read_key() { uint8_t i,j,k; Key = ~PINA; i = ~Key; k=0; for(j=0;j<CNT_KEY;j++) {k += i & 1; i >>= 1}; if(k>1) Key = 0; }
// А анализировать так
if(Key.Up) { .... }
|
|
|
|
|
Mar 23 2007, 14:34
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(SasaVitebsk @ Mar 22 2007, 23:30)  А если так??? Код Key = ~PINA; i = ~Key; Присваивание целого структуре и наоборот недопустимо. Тогда уж Код union { struct { uint8_t Up : 1, // Вверх uint8_t Down : 1, // Вниз .......... }, uint8_t raw; } Key;
Key.raw = ~PINA; i = ~Key.raw;
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 23 2007, 21:19
|
Участник

Группа: Участник
Сообщений: 70
Регистрация: 25-07-05
Из: Екатеринбург
Пользователь №: 7 077

|
Цитата(Сергей Борщ @ Mar 23 2007, 14:34)  Присваивание целого структуре и наоборот недопустимо. Тогда уж Код union... поддерживаю кроме того, не помню, чтобы стандарт гарантировал прямое соответствие битов значения целого и битов поля. хотя признаю, что отклонения не встречал, но ведь вопрос был в красоте
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|