Umwandlung von Bitposition in Bitmaske unter Verwendung von MPASM-Direktiven

Ich schreibe Firmware für einen PIC16F877A in Assembler und möchte einige Konstanten am Anfang meines Quellcodes setzen, um anzugeben, welcher Port wofür verwendet wird, damit ich bei Bedarf problemlos alle E / A-Pins ändern kann Ändern der konstanten Werte und Neukompilieren.

So was:

O_LEDS   EQU      PORTA
CONSTANT O_RED    = RA1
CONSTANT O_GREEN  = RA2
CONSTANT O_BLUE   = RA3

In meinem Code benötige ich eine Bitmaske, um die von mir verwendeten Ports darzustellen. Meine Frage ist, wie kann ich einen Ausdruck mit Assembler-Direktiven schreiben, um die Bitmaske zu berechnen?

Anhand meines obigen Beispiels:

O_RED = 1
O_GREEN = 2
O_BLUE = 3

und die Bitmaske, die ich will, ist:

movlw b'00001110'

Wenn es einen zur Macht des Operators gäbe, könnte ich so etwas tun:

movlw (2 ^ O_RED) | (2 ^ O_GREEN) | (2 ^ O_BLUE)

aber ^in MPASM ist ein bitweises exklusives ODER, nicht hoch .

Kann sich jemand einen anderen Weg vorstellen, dies zu tun?

Antworten (1)

Ich habe MPASM noch nie benutzt, aber funktioniert das?

movlw (1 << O_RED) | (1 << O_GREEN) | (1 << O_BLUE)

Eine Verschiebung nach links verdoppelt eine Zahl.

1 << x== 2x

Ah ja!!! Ich kann nicht glauben, dass ich das nicht selbst gesehen habe. Danke.