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
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.
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…