Die Sache ist die, daß Bascom mit getadc immer mit vollen 10bit arbeitet - für deine 8 Kombinationen brauchst Du aber nur 3 Bit. Folglich käme man mit nur 8bit aus. (ADLAR, aber das wird Dir als Bascom-ler nichts sagen).
Der ADC erhält bei seiner Conversion ein 10-bit-Ergebnis, und muß das irgendwie in "einem" Ergebnisregister ablegen. Da die AVR aber 8bit-Controller sind, benötigt er dafür 2 Ergebnisregister: ADCH und ADCL. damit stehen aber 16bit bereit. Im ADC Multiplexer Selection Register kann nun mit ADLAR (ADC Left Adjust Result) festgelegt werden, ob die 10bit linksbündig oder rechtsbündig in diesen 2 Registern landen. Wenn rechtsbündig, landen die unteren 8bit im ADCL, und die letzten beiden im ADCH, getadc liest beide aus und weist sie 'ner 16bit-Variable zu.
Wenn ADLAR gesetzt ist, landen die oberen 8 Bits in ADCH, die letzten beiden in ADCL. Liest man jetzt also nur ADCH aus (in ein Byte), spart man sich das auslesen des 2ten Registers, kommt mit einem Ergebnisbyte aus, und hat defacto bereits durch 4 geteilt (binär zweimal nach rechts geschoben).
Jetzt mal zu Deinen Schaltgrenzen. Warum nicht konsequent:
128=0b00_1000_0000
256=0b01_0000_0000
384=0b01_1000_0000
512=0b10_0000_0000
640=0b10_1000_0000
768=0b11_0000_0000
896=0b11_1000_0000
linksorientiert wäre das dann immer ein viertel davon, auslesen würde man dann:
0b0010_0000
0b0100_0000
0b0110_0000
0b1000_0000
0b1010_0000
0b1100_0000
0b1110_0000
Im Deinem Soft-PWM kannst Du ja davon ausgehen, daß die LEDs vor dem (erneuten) anschalten generell aus sind (Du kannst ja auch immer alle 3 zusammen Abschalten), wenn man das Result also einmal linksschiebt, fällt das oberste Bit ins Carry. Dafür gibt es bedingte Sprungbefehle (jedes IF-Then läuft über sowas ab) - wenn das Carry nicht gesetzt ist, wird einfach die Instruktion übersprungen, die den Port-Pin anschaltet. Das ganze dann noch zweimal für die anderen beiden Bits, und Du kannst Dir den langen IF-Then-Elseif... sparen.
Wäre allerdings Assembler. Da Deine Lösung (zufriedenstellend) funktioniert, will ich Dir da allerdings nicht reinreden - aber vielleicht interessiert Dich, was da hinter getadc und so abläuft, und was eben Deine Ergebnisse sind...
Normalerweise würde man beim soft-PWM mittels Timer einen Takt generieren lassen, und mit diesem Takt eine Variable hochzählen und irgendwo zurücksetzen lassen. Sozusagen einen Software-Timer (der durch einen HW-Timer getaktet wird). Bei jedem inkrement des SW-Timers wird der Zählerstand des SW-Timers mit den PWM-Vorgabewerten verglichen und ggf der Ausgang umgeschaltet, beim Überlauf des SW-Timers wieder zurück. Damit hast Du aus dem SW-Timer einen SW-PWM gemacht - genau so, wie es auch der HW-Timer macht.
Wenn der Timer binär genauso "breit" wie das ermittelte ADC-Ergebnis ist (8 oder 10 bit), braucht man da auch nicht mehr rumrechnen, das ADC-Ergebnis ist dann halt der neue PWM-Vorgabewert.