Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2017, 19:38   #1
Nikita-C
Новичок
Джуниор
 
Регистрация: 09.10.2017
Сообщений: 3
По умолчанию Разобраться с кодом. Работа домофона - C (СИ)

Помогите разобраться с кодом.
Нужны комментарии хотя-бы по основным моментам
Исходник выполняет работу домофона. Считывает таблетки Ibutton и прочее
Вложения
Тип файла: txt Новый текстовый документ.txt (8.3 Кб, 123 просмотров)
Nikita-C вне форума Ответить с цитированием
Старый 09.10.2017, 20:08   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Так Вы спрашивайте основные моменты, отвечу.
А то откуда я знаю границы Ваших познаний..

А комментировать все ~400 строк кода - как-то стимула нет..
Black Fregat вне форума Ответить с цитированием
Старый 09.10.2017, 20:31   #3
Nikita-C
Новичок
Джуниор
 
Регистрация: 09.10.2017
Сообщений: 3
По умолчанию

Вот этот момент не очень понятен

byte key_search() {
byte i, n;
for (i = 0; i < MAX_KEY + 1; i++) {
for (n = 0; n < 8; n++) {
if (c_key[n] != keys[i][n]) break;
}
if (n == 8) break;
}
if (i == MAX_KEY + 1) return 0xff; else return i;
}

byte key_empty() {
byte i, n;
byte t[8];
for (i = 1; i < MAX_KEY + 1; i++) {
for (n = 0; n < 8; n++) t[n] = keys[i][n];
if (w1_dow_crc8(t, 8) != 0) break;
}
if (i == MAX_KEY + 1) return 0xff; else return i;}
Nikita-C вне форума Ответить с цитированием
Старый 09.10.2017, 21:10   #4
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Код:
// Поиск ключа в глобальном массиве ключей keys[][]
// Ключ для поиска лежит в глобальном же массиве c_key[]
byte key_search() {
    byte i, n;
    // Цикл по всем ключам (индекс от 0 до MAX_KEY включительно)
    for (i = 0; i < MAX_KEY + 1; i++) {
        // Для каждого ключа сравниваается 8 элементов 
        for (n = 0; n < 8; n++) {
            // При первом же несовпадении цикл прерывается
            if (c_key[n] != keys[i][n]) break;
        }
        // Здесь по значению индекса n проверяется, дошёл ли цикл до конца
        // Если дошёл, ключ найден - прерывается основной цикл
        if (n == 8) break;
    }
    // Здесь по значению индекса i проверяется, дошёл ли цикл до конца
    // Если не дошёл, ключ найден - возврат индекса i
    // иначе ключ не найден - возврат ff
    if (i == MAX_KEY + 1) return 0xff; else return i;
}
 
// Поиск пустого слота в глобальном массиве ключей keys[][]
byte key_empty() {
    byte i, n;
    byte t[8];
    // Цикл по всем ключам (индекс от 0 до MAX_KEY включительно)
    for (i = 1; i < MAX_KEY + 1; i++) {
        // Копирование во временный массив
        for (n = 0; n < 8; n++) t[n] = keys[i][n];
        // Проверка корректности, на некорректном ключе - прервать цикл
        if (w1_dow_crc8(t, 8) != 0) break;
    }
    // Здесь по значению индекса i проверяется, дошёл ли цикл до конца
    // Если не дошёл, пустой слот найден - возврат индекса i
    // иначе пустой слот не найден - возврат ff
    if (i == MAX_KEY + 1) return 0xff; else return i;
}
Black Fregat вне форума Ответить с цитированием
Старый 09.10.2017, 21:15   #5
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

А когда выполниться это условие:
Код:
if (i == MAX_KEY + 1)
если максимум дойдёт до:
Код:
for (i = 0; i < MAX_KEY + 1; i++)
А не, то я протупил. Всё Ок.

Последний раз редактировалось ura_111; 09.10.2017 в 21:19.
ura_111 вне форума Ответить с цитированием
Старый 09.10.2017, 21:15   #6
Nikita-C
Новичок
Джуниор
 
Регистрация: 09.10.2017
Сообщений: 3
По умолчанию

Спасибо.Еще вот это,если можно
Код:
interrupt[TIM0_OVF] void timer0_ovf_isr(void) {
    if (key_init() != 0) {
        k_num = key_search();
        if (k_to == 0 || k_num != lk_num) {
            set_act();
            lk_num = k_num;
        }
        k_to = KEY_ACT_TIMEOUT*15.26;
    }
    else {
        if (k_to > 0) k_to--;
    }
    if (ul_time == 0 && l_state != 0) {
        l_state = 0;
        C_LOCK = 0;
        k_to = 0;
        nobeep();
    }
    else if (ul_time > 0) {
        ul_time--;
    }
}
interrupt[EXT_INT0] void ext_int0_isr(void) {
    if (state == 0) unlock();
}
 
interrupt[TIM1_COMPA] void timer1_compa_isr(void) {
    flash word *p;
    if (t_beep == 0) {
        p = pb + c_beep;
        if (*p == 0) {
            t_beep = 255;
            p_beep = 0;
        }
        else if (*p == 1) {
            TCCR1B = 0;
            p_beep = 0;
        }
        else {
            t_beep = 125000 / (*p);
            p_beep = 1;
        }
        p++;
        OCR1A = t_beep;
        OCR1B = t_beep >> 1;
        t_beep = 125000 / t_beep / (*p);
        c_beep += 2;
        if (c_beep == max_beep) c_beep = 0;
    }
    if (p_beep != 0) BEEP = 1; else BEEP = 0;
    TCNT1H = 0;
    TCNT1L = 0;
    t_beep--;
}
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 10.10.2017 в 10:25.
Nikita-C вне форума Ответить с цитированием
Старый 10.10.2017, 15:13   #7
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Так не пойдёт, этак мы все ~400 строк будем разбирать...

Это обработчики пррываний.

Код:
interrupt[TIM0_OVF] void timer0_ovf_isr(void) {
Первый обработчик TIM0_OVF, это вроде таймера в обычном программистском смысле, он для того, чтобы периодически производить полезную работу. Там вводится ключ, потом он ищется в массиве, если находится, что-то выполняется в set_act();. Остальное - это разные задержки и паузы в работе алгоритма.

Код:
interrupt[EXT_INT0] void ext_int0_isr(void) {
Это обработчик внешнего события. По логике, он просто открывает дверь по нажатию кнопки

Код:
interrupt[TIM1_COMPA] void timer1_compa_isr(void) {
Эта фиговина исключительно для проигрывания мелодии. Оно Вам надо его разбирать?
Black Fregat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разобраться с кодом Boris2 Помощь студентам 1 15.07.2013 15:58
С++ разобраться с кодом marina12 Помощь студентам 2 21.05.2013 23:22
разобраться с кодом iris_ka Помощь студентам 0 16.05.2012 17:19
Разобраться с кодом. Vlero PHP 2 20.01.2011 12:46
Помогите разобраться с кодом Superlotles Общие вопросы Delphi 6 19.08.2009 22:24