Извините, что встреваю. Вот инициализация порта для ассемблера:
INITPORT PORTA, PULL, INP,PULL, INP,PULL,OUTH,OUTL,OUTL
чтобы не помнить про DDR, PORT и PIN.
макросом
/// port = @0 DDR = @0 - 1 PIN = @0-2
/// define IN=00 PULL=01 OUTL=10 OUTH=11 ( 0,1,2,3) <1><2><3> used
/// bit 7 6 5 4 3 2 1 0
/// example: INITPORT PORTA, OUTL,OUTL,OUTL,OUTH, PULL, IN, IN, IN
/// @0 @1 @2 @3 @4 @5 @6 @7 @8
#define INP 0
#define PULL 1
#define OUTL 2
#define OUTH 3
#define PIN 2 /// for "portb-PIN" = pinb
#define DDR 1
#define PORT 0
.MACRO INITPORT /// def: INITPORT Id,K2,K2,K2,K2,K2,K2,K2,K2
push2y X
ldi Xh,(@1&1)<<7|(@2&1)<<6|(@3&1)<<5|(@4&1)<<4|(@5&1)<<3|(@6&1)<<2|(@7&1)<<1|(@8&1) /// PORT
ldi Xl,(@1&2)<<6|(@2&2)<<5|(@3&2)<<4|(@4&2)<<3|(@5&2)<<2|(@6&2)<<1|(@7&2)|(@8&2)>>1 /// DDR
out @0-1,Xl
out @0,Xh /// быстро.
pop2y X
.ENDMACRO
Дальше в программе sbi LEDPORT,REDLED. Если DDR то sbi LEDPORT-DDR,INOUT. Ну и тест пина: sbic BUTTONPORT-PIN,BU2. Макрос предполагает, что адреса регистров pin-ddr-port идут подряд, для АВР-ок это соблюдается.