Я тоже.menzoda писал(а):k000858 писал(а):поэтому я бы предпочел внешнюю FRAM, ну или EEPROM.
Виктор.
Я тоже.menzoda писал(а):k000858 писал(а):поэтому я бы предпочел внешнюю FRAM, ну или EEPROM.
Код: Выделить всё
switch (GetPressedButton())
{
case key_1:
time_s++; break;
case key_2:
time_s = time_s + 10; break;
case key_3:
time_s = time_s + 60; break;
default:
break;
}Код: Выделить всё
if(GetPressedButton() & key_1) time_s++;
if(GetPressedButton() & key_2) time_s = time_s + 10;
if(GetPressedButton() & key_3) time_s = time_s + 60;Код: Выделить всё
timer_1 = GetPressedButton();
if(timer_1 & key_1) time_s++;
if(timer_1 & key_2) time_s = time_s + 10;
if(timer_1 & key_3) time_s = time_s + 60;Код: Выделить всё
#define key_1 0x01
#define key_2 0x02
#define key_3 0x04
int GetPressedButton( void )
{
if( button_cnt_1 == TRESHOLD ) {button_cnt_1 = TRESHOLD+1; return key_1;}
if( button_cnt_2 == TRESHOLD ) {button_cnt_2 = TRESHOLD+1; return key_2;}
if( button_cnt_3 == TRESHOLD ) {button_cnt_3 = TRESHOLD+1; return key_3;}
return ( 0 );
}Вам нужно в момент времени Т определить, какая нажата кнопка. Вы ОДИН раз должны обратится в момент Т к этой функции, зафиксировать этот результат, а потом уже заняться его анализом. В вашем же примере вы вызываете функцию в ТРИ разных момента времени Т1, Т2 и Т3 (каждый if в свой момент времени). Состояние кнопок может быть непредсказуемым, особенно, если учесть, что работает прерывание 1 мсек.mial писал(а):Привет всем. Мучаю потихоньку stm32f100c4.
Возник у меня вот такой вопрос по Си.
....
А код на основе if работает через разПричем первый if отрабатывает почти всегда, а вот последующие могут и через десять нажатий сработать.Код: Выделить всё
if(GetPressedButton() & key_1) time_s++; if(GetPressedButton() & key_2) time_s = time_s + 10; if(GetPressedButton() & key_3) time_s = time_s + 60;
если код переделать вот такТо тогда работает четко. Процедура обработки кнопок взята отсюда http://radiokot.ru/forum/viewtopic.php? ... 4#p1704144Код: Выделить всё
timer_1 = GetPressedButton(); if(timer_1 & key_1) time_s++; if(timer_1 & key_2) time_s = time_s + 10; if(timer_1 & key_3) time_s = time_s + 60;
Сам опрос крутится в 1мс таймере, TRESHOLD 20 мс. эта часть вопросов не вызывает. Кстати в самой функции GetPressedButton() небольшая неточность. else там лишние. Если их оставить то код кнопки возвращается всегда, независимо нажата или нет.
Вопрос, почему не работают if если функцию GetPressedButton() вызывать непосредственно из if?
Я так полагаю, раз вы догадались до вот этогоmial писал(а):Вопрос, почему не работают if если функцию GetPressedButton() вызывать непосредственно из if?
Код: Выделить всё
timer_1 = GetPressedButton();mial писал(а):Таким образом ваш вопрос совершенно не к языку Си. Захромало понимание алгоритма.
Я в школе учился когда еще и калькуляторов не былоFoks писал(а):Нет, серьезно, вопрос детский. Уровня средней школы, где алгоритмы только начинают изучать.
Да.mial писал(а):Если в этот момент вызвать функцию GetPressedButton() то она вернет код нажатой кнопки key_1. Одновременно увеличив счетчик button_cnt_1 на единицу. Что не даст при повторном вызове функции пока кнопка еще не отпущена повторного возвращения кода кнопки. Вроде тут я все правильно понял? Из за этого и получается, если предположим была нажата key_2, а вызов GetPressedButton() был например из первого IF, то при повторном вызове из второго IF пока кнопка не была отпущена и повторно нажата GetPressedButton() вернет 0?
Код: Выделить всё
switch(...)
{
case key1: ...
case key2: ...
case key3: ...
}
Код: Выделить всё
if(... & key1) ...
if(... & key2) ...
if(... & key3) ...
Мне показалось, что и во втором случае имеет место быть оператор сравнения. В неявном виде.menzoda писал(а):В первом куске кода мы сравниваем условие и флаги с помощью ==, а во втором &. Когда-нибудь так можно нарваться на ошибку.
Код: Выделить всё
if( var & mask ) ...Код: Выделить всё
if( (var & mask) == TRUE ) ...А на какую именно ошибку можно нарватся?menzoda писал(а):Хорошо, что проблема решилась, но почему никто не заметил, что:иКод: Выделить всё
switch(...) { case key1: ... case key2: ... case key3: ... }разные вещи. В первом куске кода мы сравниваем условие и флаги с помощью ==, а во втором &. Когда-нибудь так можно нарваться на ошибку.Код: Выделить всё
if(... & key1) ... if(... & key2) ... if(... & key3) ...
Код: Выделить всё
switch(var)
{
case 0x01:
...
break;
}
Код: Выделить всё
if (var == 0x01)
{
...
}
Код: Выделить всё
if (var & 0x01)
{
....
}
Угу а две и более кнопки одновременно нажаты не могут бытьshads писал(а): Но мы сейчас говорим о функции обработки регистра флагов нажатых кнопок....
Да хоть стопицот! Отработана будет только одна.dosikus писал(а):Угу а две и более кнопки одновременно нажаты не могут бытьshads писал(а): Но мы сейчас говорим о функции обработки регистра флагов нажатых кнопок....
Код: Выделить всё
#define key_1 1
#define key_2 2
#define key_3 3Код: Выделить всё
#define key_1 1
#define key_2 2
#define key_3 4Т.е. выхода нет и всё неправильно???menzoda писал(а): Это тоже, скорее всего, не то, что хотелось бы при работе с такими данными.
А я себе давно уже такую библиотечку слепил, обрабатывает короткие и длинные нажатия 4-х кнопок.ut1wpr писал(а):Процедура обработки кнопок взята отсюда http://radiokot.ru/forum/viewtopic.php? ... 4#p1704144
Ыыыы.... я вообще то про свою библиотечку рассуждал..... вы ее читали?.....Foks писал(а):Блин, вы код читали? Там три отдельных счетчика, и функция всегда возвращает одну(!) кнопку. Следующую вернет уже при следующем вызове.