неправильно
PORTB=0b00000001; // РВО - вход
правильно:
PORTB=0b00000001; // РВО - включение подтяжки
не важно что вперёд - ПОРТ или ДДР писать - в любом случае 1 в ПОРТ тянет вверх, а 1 в ДДР включает силовые выходные транзисторы (с ними порт начинает работать на выход, кстати, при этом не переставая работать и на вход тоже)
_____________
ты понимаешь суть этой строки?:
PORTB|= 0x10; // зажигаем зеленый
объясню, это пример сокращенной записи вот этой строки:
PORTB = (PORTB) | (0x10); // зажигаем зеленый
вертикальная черта
| - это поразрядное ИЛИ (это как плюс, только без переноса) если хотябы в одном из операндов в данном месте была 1, то на выходе в этом же месте будет 1.
тоесть взяли регистр ПОРТБ и записали его весь обратно, кроме 1го (2го по счету) бита - он в результате этой операции всегда станет равным 1.
я стал объяснять про эту строчку из-за этой строки (она хоть и работать будет, но написана неправильно и может в дальнейшем навредить - когда начнешь мигать более чем одним светодиодом):
PORTB= 0x01; // тушим зеленый
на самом деле эта строчка выключает все ножки порта, кроме 0й (там у тебя подтяжка кнопки)
если надо отключить только 1ю ногу и не тронуть остальные, то правильно писать так:
PORTB&= 0x11111101; // тушим зеленый
& - (поразрядное И) записывает 0 в те разряды, где хоть у одного оператора был 0.
но такая запись неудобна, проще инвертировать чило:
~ - (поразрядное НЕ, или инверсия)
PORTB&= ~(0x00000010); // тушим зеленый
такие операции встречаются очень часто и их стоит запомнить.
ещё, для улучшения восприятия можно воспользоваться командой сдвига:
PORTB|= (1<<x); // зажигаем x ногу порта
PORTB&= ~(1<<x); // тушим x ногу порта
<< - сдвиг, в данных строках происходит сдвиг "1" на х позиций, (вместо х число) так и получится при х = 0 единица не сдвинется и будет переключение 0 ноги порта, при х=1 - первой, и т.д.
___________
надеюсь эта информация поможет тебе написать более красивый и правильный код
