Код: Выделить всё
while(1)
{
if(PINB.1<1)allarm1();
if(PINB.2<1)allarm2();
if(PINB.3<1)allarm3();
};
Код: Выделить всё
while(1)
{
if(PINB.1<1)allarm1();
if(PINB.2<1)allarm2();
if(PINB.3<1)allarm3();
};
Для этого нужно обнаруживать не уровень, а смену уровня - то есть, не только читать состояние порта с кнопками, но и помнить предыдущее значение и сравнивать с ним побитным XOR'ом - единички в результате побитного XOR'а покажут какие биты изменились, а единички в только что прочитанном покажут, в каких битах переход был с нуля на единичку (ну, а в остальных - ...).Arik писал(а):Как сделать чтобы подпрограмма сработала один раз и не срабатывала повторно ...
Зачем советовать тот же принцип? Ведь и работать будет также:Arik писал(а):Как сделать чтобы подпрограмма сработала один раз и не срабатывала повторно если низкий уровень всё еще присутствует на выводе...?Код: Выделить всё
if(PINB.1<1)allarm1();
Единственное отличие в том, что вызов alarm() будет не по нулю, а по единице на входе.Vov123 писал(а):Код: Выделить всё
if(PINB.1) alarm1(); else no_alarm1();
Благодарю, нет нужды. Работать этот код будет именно так, как не хочет автор вопроса, а именно - пока кнопка нажата, будет, как из пулемета, вызываться функция alarm(), и связано это, как я уже говорил, с тем, что предложенный код устроен так же, как и тот, который хотел заменить автор вопроса.Vov123 писал(а):Вот поиграйтесь.
P.S. Не сразу заметил вот это:Arik писал(а):срабатывает соответствующая подпрограмма allarm(1-3) но мне не нужно чтобы подпрограмма выполнялась постоянно, пока удерживается низкий уровень на выводе. Как сделать чтобы подпрограмма сработала один раз и не срабатывала повторно если низкий уровень всё еще присутствует на выводе, но сканирование оставшихся выводов продолжалось? Спасибо!
Можно узнать, кто будет вызывать функцию alarm() в этом коде:Vov123 писал(а):но и при отпускании кнопки alarm будет продалжать "гудеть"
Код: Выделить всё
if(PINB.1<1)allarm1();YKolomiets писал(а):Предлагаю так:То же самое, что с побитным XOR'ом, только значительно длиннее, медленнее, запутаннее и с массой ненужных переменных.Код: Выделить всё
unsigned char x1, x2, x3; x1=x2=x3=1; while(1) { if(PINB.1<1) { if(x1) { allarm1(); x1=0; } } else { x1=1; } ... };
Ты не понял - это был не вопрос, это был намёк! Подсказка.Vov123 писал(а):Тогда бы не стал ... задавать глупых вопросов.

Код: Выделить всё
//=== Global definitions
void InitDevices( void ); //Init controller perifery
void main(void)
{
InitDevices();
while (1)
{
if (!PINB.0) // if PB.0's pressed
PINB.1 = 1;
};
}
, а затем с этими:Yellow Tiger писал(а):пока кнопка нажата, будет, как из пулемета, вызываться функция alarm()
и делаем выводы.Vov123 писал(а):если без ELSE,то ... и при отпускании кнопки alarm будет продалжать "гудеть"

Код: Выделить всё
while (1)
{
if (!PINB.0) // if PB.0's pressed
PINB.1 = 1;
else
#asm("nop");
};Код: Выделить всё
#define f_1 0b00000001
#define f_2 0b00000010
#define f_3 0b00000100
unsigned char flags = 0;
while(1){
// проверка первого варианта f_1
if(!(PINB & f_1)){
// если в пине 0, то проверим, не было ли уже такого ранее?
if(!(flag & f_1)){
// если флажок не установлен, то вызываем свою функцию
alarm1();
// и устанавливаем флаг обработки события
flag |= f_1;
}
} else flag &= ~f_1; // если в пине 1, то сбросим флажок этого события
// далее аналогично для обработки состояний f_2 и f_3
}Код: Выделить всё
void alarm(unsigned char pin){
if(flag & pin) return; // если флаг уже стоит - сразу выход
flag |= pin;
switch(pin){
case f_1: SMS_SEND("караул!!!");
case f_2: SMS_SEND("грабят!!!");
case f_3: SMS_SEND("насилуют");
default: SMS_SEND("ошибка!");
}
}Код: Выделить всё
#define MAX_ALARM1_TIME 5000 // 5 секунд
unsigned int alarm1_time = 0; // счётчик времениКод: Выделить всё
if(!alarm1_time)
{
sendSms(?????);
alarm1_time = MAX_ALARM1_TIME
}Код: Выделить всё
if(alarm1_time)
alarm1_time--;И отличается этот код от приведенного автором только тем, что при установленном флаге выходим сразу. А автор хочет продолжать сканирование остальных кнопок.ARV писал(а): что-то типа такого:разумеется, и это не самое элегантное решение, но не буду же я все сам за вас делать?Код: Выделить всё
void alarm(unsigned char pin){ if(flag & pin) return; // если флаг уже стоит - сразу выход flag |= pin; switch(pin){ case f_1: SMS_SEND("караул!!!"); case f_2: SMS_SEND("грабят!!!"); case f_3: SMS_SEND("насилуют"); default: SMS_SEND("ошибка!"); } }
уважаемый, вы бы хоть подумали 5 минут, прежде чем это писать... я предлагаю вариант замены функциё alarm1()...alarm3(), введенных автором топика, а анализ пинов осуществляется "снаружи" примерно по тому алгоритму, что я и предложил. в этом случае единожды сработавший пин обрабатывается так же один раз, а остальные продолжают сканироваться.__Alexander писал(а):И отличается этот код от приведенного автором только тем, что при установленном флаге выходим сразу. А автор хочет продолжать сканирование остальных кнопок.
Забей.ARV писал(а):уважаемый, вы бы хоть подумали 5 минут, прежде чем это писать...