Im Softwarebereich kann es hilfreich sein, die Daten im Bit-Planar-Format (wie in meiner anderen hardwarebasierten Antwort beschrieben) zu speichern, wenn die Anzahl der benötigten Helligkeitseinstellungen nicht zu groß ist Ausgaberoutinen verwenden Boolesche Operatoren, um 8 Pixel gleichzeitig zu bearbeiten. Für eine maximale Effizienz sind mehrere separate Ausgaberoutinen erforderlich, die für verschiedene Teile des PWM-Zyklus verwendet werden. Wenn man beispielsweise 4-Bit-Helligkeitswerte verwenden möchte, würde man acht Routinen der Form verwenden:
movf bit0Comp, w; Sollte 00 oder FF sein, abhängig von Bit 0 des Vergleichers (FF, wenn frei)
iorwf POSTINCF, w; Bit 0 von Daten; benutze immer IORWF
undwf POSTINCF, w; Bit 1 von Daten; verwende IORWF, wenn Bit 1 des Vergleichers gesetzt ist; ANDWF wenn klar
undwf POSTINCF, w; Bit 2 von Daten; Verwenden Sie IORWF, wenn Bit 1 des Komparanden gesetzt ist. ANDWF wenn klar
undwf POSTINCF, w; Bit 2 von Daten; Verwenden Sie IORWF, wenn Bit 1 des Komparanden gesetzt ist. ANDWF wenn klar
movwf SPIREG; Ergebnisbyte speichern (Bits gesetzt, wenn> = Vergleicher)
Man würde verschiedene Kombinationen von IORWF und ANDWF verwenden, abhängig vom Wert des Komparanden. Es ist zu beachten, dass unter Verwendung dieses Ansatzes, wie dargestellt, Pixelhelligkeitswerte an jedem Punkt im PWM-Zyklus ohne Flimmern aktualisiert werden können, vorausgesetzt, dass alle vier Bits zwischen Aufrufen der Anzeigeverschiebungsroutine geschrieben werden, oder indem die Pixelaktualisierungsroutine bestimmt, ob die Die nächste Verschiebung gibt eine "1" oder eine "0" für das Pixel aus und setzt oder löscht alle Bits des Pixels (welche Operation es auch immer veranlassen würde, das zu tun, was es ohnehin tun würde) und schreibt dann alle Bits, deren Wert es sollte gegenüber sein. Man beachte auch, dass man willkürliche nichtlineare Helligkeitsskalen erzielen kann, indem man den Zeitpunkt der Anzeigeaktualisierungen variiert oder einige Vergleichswerte mehr als einmal in einem PWM-Zyklus verwendet.