Язык "С" не знаю, но заинтересовала меня вот эта прога, та что во вложении, отсюда.Полное описание и схема тут, на схеме ошибка, перепутаны столбцы клавиатуры,
но это не суть. Как она работает разобрался, вообщем, перегнал ее в формат WinAvr, добавил возможность ввода кода охраны... Переделал
под Atmega8, все хорошо работает, однако есть там недоработка, позволяющая легко подобрать код охранной системы!
Решил ее тоже исправить, однако не получается, уперся в то, что не понимаю, как работает этот кусок:
Спойлер
Код: Выделить всё
// HOLD WHILE KEYDOWN
scn = 0;
while (scn != 45) {
scn = 0;
PORTD.4 = 0;
delay_ms(1);
scn = scn + (PIND & 15);
PORTD.4 = 1;
PORTD.5 = 0;
delay_ms(1);
scn = scn + (PIND & 15);
PORTD.5 = 1;
PORTD.6 = 0;
delay_ms(1);
scn = scn + (PIND & 15);
PORTD.6 = 1;
}Спойлер
Код: Выделить всё
// **********************************************************************************************
// **** READ KEYPAD AND RETURN ASCII VALUE
// **********************************************************************************************
unsigned char KEYPAD() {
unsigned char key;
unsigned char scn;
key = 0;
// SCAN KEYS IN COLUMN 1
PORTD.4 = 0;
delay_ms(1);
scn = (PIND & 15);
PORTD.4 = 1;
// CONVERT KEY TO ASCII
if (scn == 14) key = '1';
if (scn == 13) key = '4';
if (scn == 11) key = '7';
if (scn == 7) key = '*';
// SCAN KEYS IN COLUMN 2
PORTD.5 = 0;
delay_ms(1);
scn = (PIND & 15);
PORTD.5 = 1;
// CONVERT KEY TO ASCII
if (scn == 14) key = '2';
if (scn == 13) key = '5';
if (scn == 11) key = '8';
if (scn == 7) key = '0';
// SCAN KEYS IN COLUMN 3
PORTD.6 = 0;
delay_ms(1);
scn = (PIND & 15);
PORTD.6 = 1;
// CONVERT KEY TO ASCII
if (scn == 14) key = '3';
if (scn == 13) key = '6';
if (scn == 11) key = '9';
if (scn == 7) key = '#';
// SEND KEY BEEP
if (key != 0){
for (scn = 0; scn < 50; scn++) {
PORTC.0 = 0;
PORTC.1 = 1;
delay_us(200);
PORTC.0 = 1;
PORTC.1 = 0;
delay_us(200);
}
}
// HOLD WHILE KEYDOWN
scn = 0;
while (scn != 45) {
scn = 0;
PORTD.4 = 0;
delay_ms(1);
scn = scn + (PIND & 15);
PORTD.4 = 1;
PORTD.5 = 0;
delay_ms(1);
scn = scn + (PIND & 15);
PORTD.5 = 1;
PORTD.6 = 0;
delay_ms(1);
scn = scn + (PIND & 15);
PORTD.6 = 1;
}
// RETURN KEY VALUE
delay_ms(100);
return(key);
}PS: начало обсуждения было здесь
UPD:Кажется понял как работает: пока нажата любая клавиша будет крутиться в этом цикле, если нет нажатой кнопки, то пройдет его один раз и дальше по программе.
Вопрос снят
- Вложения
-
- WIDE C Source File.c
- (8.06 КБ) 231 скачивание


