Сообщение от svorog1
|
Извините можно поподробнее как вес бита вычислять
|
Вес бита - двойка в степени номера бита:
pb0 -› 2^0 = 1
pb1 -› 2^1 = 2
pb7 -› 2^7 = 0x80 = 128
мне нужно чтобы кнопики были на P1(2)
P2(4) и P4(16 или 0x10)
Код:
|
Вот что я пытался пустить
#define bt_mode 0x01 - PB0
#define bt_cnt 0x02 - PB1
#define ld_mode 0x04 - PB2 !!!! СВЕТОДИОД
n = PINB & (bt_mode|bt_cnt); - ЧИТАЕМ КНОПКИ
v = p ^ n; - ИЗМЕНЕННЫЕ
v = v & p; - ИЗМЕНИЛИ И БЫЛИ НАЖАТЫ -› ОТПУЩЕНЫ
p = n;
v = v & 0x0F; - ЭТО ЗАЧЕМ?!!!!!! Я в том примере так делал, дабы не затрагивать подтягивающие резисторы старшей тетрады, ибо на ней сидели кнопки... здесь зачем?!
if (v & n & bt_cnt) - ЗДЕСЬ V - это уже НЕ ИЗМЕНЕННЫЕ!!! получается "ОТПУЩЕННЫЕ и СЕЙЧАС НАЖАТЫ" немогу сообразить, но вроде бы как тут всегда фальш будет
{
PORTB ^= BIT(3); - 2^3 = 8 !!! А СВЕТОДИОД НА PB2!!! Если Вы сделали Define c ВЕСАМИ? то используйте их: PORTB ^= ld_mode ... или define определите номера бит и везде используйте BIT(x)
}
тока бли неработат
--------
#define bt_mode 0x01
#define bt_cnt 0x02
#define ld_mode 0x04
n = PINB & (bt_mode|bt_cnt);
v = p ^ n;
if (v & p & bt_cnt)//"v & p" все нажатые кнопки, а добавив "& bt_cnt" - "среди нажатых есть и bt_cnt"
{
PORTB ^= ld_mode;
}
p = n; |
Попробуйте так - при отпускании должно переключать ... если не намудрил нигде
![Улыбка](images/smilies/icon_smile.gif)
если заменить if (v & p & bt_cnt) P на N, то будет при нажатии переключать.