
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.217.4] |
![]() |
|
Страницы: (18) « Первая ... 4 5 [6] 7 8 ... 17 18 все ( Перейти к последнему сообщению ) |
Сообщ.
#76
,
|
|
|
Я так понимаю, что схема включения из CVET.RAR?
tick() - задержка на некоторый интервал времени? Тогда этот код должен моргать некоторое время после нажатия кнопок одним из светодиодов, соответсвующим двоичному коду, образуемому нажатыми клавишами ![]() ![]() main() { volatile unsigned char Keys; unsigned char mask; unsigned int i; TRISA = 4 | 8 | 16; // RA2,RA3,RA4 настраиваем на вход PORTA = 0x1c; TRISB = 0; while( 1 ) { PORTB = 0xff; do { tick(); // не будеи опрашивать кнопки слишком часто Keys = (~PORTA) & (4|8|16); // состояние кнопок на RA2-RA4. 1-нажата } while(Keys == 0); Keys >>= 2; // нормализуем(сдвигаем) mask = 1<<Keys; // битовая маска инвертируемого вывода порта B for( i=1000 ; i != 0 ; i-- ) { // "мигаем" соответствующим светодиодом PORTB ^= mask; // инвертируем бит tick(); // делаем небольшую задержку } } } |
![]() |
|
|
![]() ![]() for( i=1000; i != 0; i-- ) i=1000, это i = (TRISA = 8)? (В донном случаи i будет TRISA?) ![]() ![]() mask = 1<<Keys; // битовая маска инвертируемого вывода порта B По подробнее объясните. У тебя в исходнике где: // "мигаем" соответствующим светодиодом Можно указать одну последовательность миганий при нажатии, А если я хочу к каждой кнопки различные последовательности мигания? Так, на словах, что за "антидребезг". ![]() ![]() Я так понимаю, что схема включения из CVET.RAR? tick() - задержка на некоторый интервал времени? Да, да. |
Сообщ.
#78
,
|
|
|
Цитата Это просто цикл из 1000 изменений состояния одного из светодиодов(светит/не светит).bizar, 28.01.04, 17:01 i=1000, это i = (TRISA = 8)? (В донном случаи i будет TRISA?) Цитата Это формирование битовой маски для инвертирования состояния нужного вывода. Просто в mask в бите, номер которого находится в Keys, будет установлена 1, в остальных битах - 0.bizar, 28.01.04, 17:01 mask = 1<<Keys; // битовая маска инвертируемого вывода порта B По подробнее объясните. Цитата Можно. Программа только немного изменится.bizar, 28.01.04, 17:01 У тебя в исходнике где: // "мигаем" соответствующим светодиодом Можно указать одну последовательность миганий при нажатии, А если я хочу к каждой кнопки различные последовательности мигания? Цитата Это несколько считываний состояния с небольшими интервалами между ними. Для устранения дребезга контактов. bizar, 28.01.04, 17:01 Так, на словах, что за "антидребезг". |
Сообщ.
#79
,
|
|
|
![]() ![]() main() { volatile unsigned char Keys; unsigned char mask; unsigned int i; TRISA = 4 | 8 | 16; // RA2,RA3,RA4 настраиваем на вход PORTA = 0x1c; TRISB = 0; while(1) { PORTB = 0xff; do { tick(); // не будеи опрашивать кнопки слишком часто Keys = (~PORTA) & (4|8|16); // состояние кнопок на RA2-RA4. 1-нажата } while(Keys == 0); Keys >>= 2; // нормализуем(сдвигаем) mask = 1<<Keys; // битовая маска инвертируемого вывода порта B for( i=1000; i != 0; i-- ) { if (PORTA = 0x1b) PORTB == 0xfd; //Если RA2 вход, зажигаем RB1 if (PORTA = 0x17) PORTB == 0xfb; //Если RA3 вход, зажигаем RB2 else POTRB == 0xf7; //Если RA4 вход, зажигаем RB3 PORTB ^= mask; // инвертируем бит tick(); // делаем небольшую задержку } } } } Для нескольких кнопок. Думаю что здесь что то не то. Проверьте? |
Сообщ.
#80
,
|
|
|
![]() ![]() main() { volatile unsigned char Keys; unsigned char mask; unsigned int i; TRISA = 4 | 8 | 16; // RA2,RA3,RA4 настраиваем на вход PORTA = 0x1c; TRISB = 0; while(1) { PORTB = 0xff; do { tick(); // не будеи опрашивать кнопки слишком часто Keys = (~PORTA) & (4|8|16); // состояние кнопок на RA2-RA4. 1-нажата } while(Keys == 0); Keys >>= 2; // нормализуем(сдвигаем). Теперь: // бит 0 - RA2, // бит 1 - RA3, // бит 2 - RA4. mask = Keys; for( i=1000; i != 0; i-- ) { PORTB ^= mask; tick(); // делаем небольшую задержку } } } P.S. Можно кое-что соптимизировать, но нагладность окончательно потеряется. |
Сообщ.
#81
,
|
|
|
1)что то я не понял, Trainer же сделал тебе для нескольких кнопок?
2) нафига , если у тебя есть код нажатой кнопки в переменной mask, ты еще раз пытаешься проверять PORTA??? 3) в твоем коде ошибка if (PORTA = 0x1b) PORTB == 0xfd; //Если RA2 вход, зажигаем RB1 if (PORTA = 0x17) PORTB == 0xfb; //Если RA3 вход, зажигаем RB2 else POTRB == 0xf7; //Если RA4 вход, зажигаем RB3 эти строчки лишние:) |
Сообщ.
#82
,
|
|
|
potor, то есть где у trainer, написано
![]() ![]() // "мигаем" соответствующим светодиодом Можно написать код: Если mask ровен тому-то выполнять те та включения светодиодов, Если равен другому то другие светодиоды будут гореть? ![]() ![]() for( i=1000; i != 0; i-- ) trainer, зачем ты ![]() ![]() |
Сообщ.
#83
,
|
|
|
Это цикл. Выполнять заданное действие ограниченное количество раз, а значит и ограниченное время.
Добавлено в : Цитата Только лучше не mask, а Keys. Расшифровку см. в сообщении #80 bizar, 30.01.04, 09:29 Если mask ровен тому-то выполнять те та включения светодиодов, |
Сообщ.
#84
,
|
|
|
![]() ![]() potor, то есть где у trainer, написано // "мигаем" соответствующим светодиодом Можно написать код: Если mask ровен тому-то выполнять те та включения светодиодов, Если равен другому то другие светодиоды будут гореть? Это будет выглядеть вот так: ![]() ![]() { if (Keys = 0) POTRB == 0xfd; //Если Keys равен 0 горит светодиод на RB1 if (Keys = 1) PORTB == 0xfb; //Если Keys равен 1 горит светодиод на RB2 if (Keys = 2) PORTB == 0xf7; // Если Keys равен 2 горит светодиод на RB3 } ![]() ![]() Это цикл. Выполнять заданное действие ограниченное количество раз, а значит и ограниченное время. Тоесть светодиод мигнёт 1000 раз, и всё? |
Сообщ.
#85
,
|
|
|
Цитата Точнее - 500 раз. В цикле одна итерация - зажечь, другая - погасить, т.е. две итерации на одну "вспышку". 1000/2 = 500.bizar, 31.01.04, 12:10 Тоесть светодиод мигнёт 1000 раз, и всё? Потом снова будет ожидаться нажатие кнопок. Цитата Keys внутри цикла for никогда не будет равен 0. Только от 1 до 7 включительно.bizar, 31.01.04, 12:10 if (Keys = 0) POTRB == 0xfd; //Если Keys равен 0 горит светодиод на RB1 И этот набор if-ов можно заменить на switch(Keys) P.S. В C и C++ присваивание значения обозначается = , а сравнение на равенство == |
Сообщ.
#86
,
|
|
|
![]() ![]() { switch (Keys == 1) PORTB = 0xfb; //Если Keys равен 1 горит светодиод на RB2 switch (Keys == 2) PORTB = 0xf7; // Если Keys равен 2 горит светодиод на RB3 else PORTB = 0xf7; } Как ещё можно сделать, Keys = 0? trainer, у тебя в примере, Keys от ноля до 2, можно было сделать от 1 до 3, или нет? Чтобы такого гимара не было как в for не может Keys = 0. |
Сообщ.
#87
,
|
|
|
Цитата А зачем? Почему именно 0, а не, например, 1?bizar, 1.02.04, 10:59 Как ещё можно сделать, Keys = 0? Цитата Не от 0 до 2, а три бита(с №0 по №2) - семь ненулевых значений(1,2,3,4,5,6,7). bizar, 1.02.04, 10:59 у тебя в примере, Keys от ноля до 2 Добавлено в : ![]() ![]() switch( Keys ) { case 1: PORTB = 0xfb; //Если Keys равен 1 горит светодиод на RB2 break; case 2: PORTB = 0xf7; // Если Keys равен 2 горит светодиод на RB3 break; case 3: // другое действие break; case 4: // другое действие break; case 5: // другое действие break; case 6: // другое действие break; case 7: // другое действие } |
Сообщ.
#88
,
|
|
|
У нас же 3 кнопки почему case - 7 значений?
![]() |
Сообщ.
#89
,
|
|
|
Цитата Потому что каждой кнопке соответствует один бит, три кнопки - три бита. Могут быть нажаты и две и три кнопки одновременно. Всего комбинаций нажатий трех кнопок - 7 штук, в двоичном виде так:bizar, 2.02.04, 11:52 У нас же 3 кнопки почему case - 7 значений? 001 010 011 100 101 110 111 Прим.: 1 - кнопка нажата, 0 - нет. |
Сообщ.
#90
,
|
|
|
Можно до 7 кнопок замутить?
|