W dziedzinie oprogramowania, jeśli liczba potrzebnych różnych ustawień jasności nie jest zbyt duża, pomocne może być przechowywanie danych w formacie „bit-planar” (jak opisano w mojej innej odpowiedzi sprzętowej), a następnie procedury wyjściowe używają operatorów logicznych do działania na 8 pikseli jednocześnie. Aby uzyskać maksymalną wydajność, będzie to wymagało posiadania wielu oddzielnych procedur wyjściowych, używanych dla różnych części cyklu PWM; na przykład, jeśli chce się użyć 4-bitowych wartości jasności, użyłby się ośmiu procedur postaci:
movf bit0Comp, w; Powinien wynosić 00 lub FF w zależności od bitu 0 porównania (FF, jeśli jest czysty)
iorwf POSTINCF, w; Bit 0 danych; zawsze używaj IORWF
iwf POSTINCF, w; Bit 1 danych; użyj IORWF, jeśli ustawiony jest bit 1 porównania; ANDWF, jeśli jest czysty
iwf POSTINCF, w; Bit 2 danych; Użyj IORWF, jeśli ustawiony jest bit 1 porównania; ANDWF, jeśli jest czysty
iwf POSTINCF, w; Bit 2 danych; Użyj IORWF, jeśli ustawiony jest bit 1 porównania; ANDWF, jeśli jest czysty
movwf SPIREG; Przechowuj wynikowy bajt (zestaw bitów, jeśli> = porównanie)
Można stosować różne kombinacje IORWF i ANDWF, w zależności od wartości porównania. Zauważ, że stosując to podejście, jak pokazano, można aktualizować wartości jasności pikseli w dowolnym punkcie cyklu PWM bez migotania, pod warunkiem że wszystkie cztery bity są zapisywane między wywołaniami procedury przesunięcia wyświetlania lub poprzez procedurę aktualizacji pikseli określającą, czy następne przesunięcie wyświetli „1” lub „0” dla piksela i albo ustawi lub usunie wszystkie bity piksela (dowolna operacja sprawi, że zrobi to, co zamierzał zrobić i tak), a następnie zapisze wszystkie bity, których wartość powinna być odwrotnie. Należy również zauważyć, że można osiągnąć dowolną nieliniową skalę jasności, zmieniając czas aktualizacji wyświetlacza lub stosując niektóre wartości porównania więcej niż raz w cyklu PWM.