Сообщение от
Alex
Просто сравнить два массива, без указателей, никак ?
Как раз так и получилось:
Код:
unsigned char x[4] = {2,5,8,0};
while(1)
{ if(bit_is_set(PIND, DS0)) //Дешифрация DTMF кода
{ data = PIND & 0x0F;
if(data == 10) data=0;
if(data < 10) //Набор цифр пароля
{ if(data != x[++parol-1]) result=result+1; //Если есть ошибки, то result>0
else result=result+0; //Иначе result=0
sound(MID); //Сигнал приема кода
}
if(data == 11) //Команда подтверждения
{ if(parol == 4 && result == 0) //Если набрано 4 правильных цифры
{ PORTC |= 0x38; sound(HIGH); PORTC &= ~0x38; //То выдаем сигнал и
pause(60000); sound(HIGH); parol=0; command=1; //переходим в подцикл
} //приема команд
else //Иначе выдаем сигнал,
{ sound(LOW); pause(60000); sound(LOW); //"ложим" трубку и
PORTD &= ~_BV(HOCK); parol=0; result=0; command=1; //переходим в подцикл
} //приема команд
}
if(data == 12) //Команда сброса введенных цифр
{ sound(LOW); sound(HIGH); //Сигнал сброса
parol=0; result=0; //Обнуление переменных
}
}
while(command == 1) //Подцикл приема команд
{ if(bit_is_clear(PIND, CALL)) //Сигнал вызова
{ PORTC |= 0x38; pause(30000); PORTC &= ~0x38; //Индикация вызова
if(++bell>10)
{ PORTD |= _BV(HOCK); pause(60000); //Захват звонка
sound(HIGH); pause(60000); sound(HIGH); //Сигнал подтверждения
bell=0; command=0; //Выход из подцикла
} //приема команд
}
if(bit_is_set(PIND, DS0)) //Дешифрация DTMF кода
{ data = PIND & 0x0F;
if(data == 10) data=0;
if(data == 9 && bit_is_set(PIND, HOCK)) //Команда "положить" трубку
{ sound(HIGH); pause(60000); sound(HIGH); //Сигнал подтверждения
PORTD &= ~_BV(HOCK); //"Ложим" трубку
}
if(data == 11) //Команда подтверждения
{ PORTC |= 0x38; control(); //Индикация подтверждения и
count=0; //обращение к функции control
}
if(data == 12) //Команда сброса введенных цифр
{ sound(LOW); sound(HIGH); //Сигнал сброса
count=0; //Обнуление переменных
}
if(data < 8) //Набор цифр команды
{ if(++count>3) count=0; //Счетчик принятых цифр
sound(MID); //Сигнал приема кода
}
}
if(count == 0) //Обнуление всех переменных
{ PORTC &= ~0x38; ind(0);
p=v1=v2=0;
}
if(count == 1) //Индикация номера потока (HL1)
{ PORTC &= ~0x30; PORTC |= _BV(HL1);
p=data; ind(p);
}
if(count == 2) //Индикация номера направления №1 (HL2)
{ PORTC &= ~0x28; PORTC |= _BV(HL2);
v1=data; ind(v1);
}
if(count == 3) //Индикация номера направления №2 (HL3)
{ PORTC &= ~0x18; PORTC |= _BV(HL3);
v2=data; ind(v2);
}
}
}
Основное время работаем в подцикле while(command == 1), где принимаем команды по каналам ТЧ. После поступления с АТС двух "гудков" устройство "поднимает" трубку и выходим из подцикла в основной цикл while. После авторизации возвращаемся в подцикл while(command == 1), в котором снова можем принимать команды и "в ручную" положить трубку.
Теперь задача другая: удаленно перезаписывать массив x[4] = {2,5,8,0} - то есть удаленно менять пароль доступа к устройству. Думаю эту функцию повесить на неиспользуемую (для управления используются только кнопки 0-7, "*" и "#") кнопку 8, назову ее "F" (функция).
Социальные закладки