přečtení 1/2 portu v bascomu

Zdravím ,mám na port D u ATMEGA 32 připojený 2 palcový BCD přepínače a potřebuji přečíst každý zvlášť a potom ještě tuto hodnotu převést na dec.číslo.Mám to vymyšlené celkem zdlouhavým způsobem :
Chtěl bych se zeptat zda to nejde i jednodušeji.Za info díky:
$regfile = “m32def.dat”
$crystal = 16000000
Config Lcd = 16 * 2
Config Portd = Input
Dim A As Bit
Dim B As Bit
Dim C As Bit
Dim D As Bit
Dim A1 As Byte
Dim B1 As Byte
Dim C1 As Byte
Dim D1 As Byte
Dim X As Byte
Dim Y As Byte
Dim Z As Byte
X = 0
Y = 0
Z = 0
Cursor Off
Cls
Waitms 500
A = Pind.0
Toggle A
B = Pind.1
Toggle B
C = Pind.2
Toggle C
Waitms 10
D = Pind.3
Toggle D
A1 = A
B1 = B
B1 = B1 * 2
C1 = C
C1 = C1 * 4
D1 = D
D1 = D1 * 8
X = A1 + B1
X = X + C1
X = X + D1
Waitms 500
A = Pind.4
Toggle A
B = Pind.5
Toggle B
C = Pind.6
Toggle C
D = Pind.7
Toggle D
A1 = A
B1 = B
B1 = B1 * 2
C1 = C
C1 = C1 * 4
D1 = D
D1 = D1 * 8
Y = A1 + B1
Y = Y + C1
Y = Y + D1

Z = X + Y

Locate 1 , 1
Lcd Z

End
navíc mi to občas načte špatnou hodnotu.

Nevím sice co je “2 palcový BCD přepínač”, ale jesli je to zapojeno tak, že např. při nastavení 99 je na portu 0b10011001, tak v C je to práce na 2 řádky:

jednotky = PIND & 0x0F; // nacist port a vynulovat horni 4 bity
desitky = PIND >> 4; // nacist port a posunout o 4b doprava

je to tak jak píšeš .Já to napsal nepřesně,mám 2 ks palcových přepínačů.
Ta hodnota na tom portu je však negovaná,protože se spíná jako tlačítko proti 0. V C jsem zatím ještě nic nedělal a nevím jestli má cenu se ho učit.zase tolik toho nedělám.

O C ani tak nejde. Spíš ten postup. I v Bacomu musí jít udělat logický součin proměnné s konstantou (to je první řádek) a bitový posun (druhý řádek).
Kdyby to tam nešlo, asi by to bylo možné vyřešit matematicky díky celočíselné aritmetice.

V Bascomu bude

Bajt = Not Pind 'negace všech bitů Dolni_nibl = Bajt And &H0F Horni_nibl = Bajt Shift Horni_nibl , Right , 4

Díky vyzkouším.

OK tak to šlape.
jenom když to dám do jednoduchý smyčky tak to při změně vstupu načte občas nesmysl a správná hodnota se načte třeba až po 3 sec.

Do
Waitms 500
A = Not Pinc
B = A And &H0F
C = A
Shift C , Right , 4
Cls
Locate 1 , 1
Lcd B
Locate 2 , 1
Lcd C
Loop
End

nevím čím to je .

no teoreticky ked robiš nejake posuny cez register je vhodne pred opetovnym prebehnutim smycky vynulovat registre. dalsia vec je ze ked urobis smenu na bcd a akurat sa bude vykonavat prikaz tak prvym prebehom vypise hlupost…

to že vypíše blbost když právě program probíhá bych chápal,ale tady to načte správnou hodnotu třeby až po třetím nebo čtvrtém průběhu smyčky.

tak vyřešeno chyba byla v pull-up odporech. Ještě bych se zeptal jak v bascomu zapnu u ATMEGA 32 vnitřní pull-up odpory na portech.