Dentro del ámbito del software, si el número de configuraciones de brillo distintas que necesita no es demasiado grande, puede ser útil almacenar los datos en formato "bit-planar" (como se describe en mi otra respuesta basada en hardware) y luego haga que las rutinas de salida usen operadores booleanos para actuar en 8 píxeles a la vez. Para lograr la máxima eficiencia, esto requerirá tener múltiples rutinas de salida separadas, utilizadas para diferentes partes del ciclo de PWM; por ejemplo, si uno desea usar valores de brillo de 4 bits, uno usaría ocho rutinas de la forma:
movf bit0Comp,w ; Should be 00 or FF depending upon bit 0 of comparand (FF if clear)
iorwf POSTINCF,w ; Bit 0 of data; always use IORWF
andwf POSTINCF,w ; Bit 1 of data; use IORWF if bit 1 of comparand is set; ANDWF if clear
andwf POSTINCF,w ; Bit 2 of data; Use IORWF if bit 1 of comparand is set; ANDWF if clear
andwf POSTINCF,w ; Bit 2 of data; Use IORWF if bit 1 of comparand is set; ANDWF if clear
movwf SPIREG ; Store resulting byte (bits set if >= comparand)
Uno usaría diferentes combinaciones de IORWF y ANDWF, dependiendo del valor del comparando. Tenga en cuenta que al utilizar este método como se ilustra, se pueden actualizar los valores de brillo de píxeles en cualquier punto del ciclo PWM sin parpadeo, siempre que los cuatro bits se escriban entre las llamadas a la rutina de cambio de pantalla, o haciendo que la rutina de actualización de píxeles determine si el siguiente turno generará un "1" o un "0" para el píxel, y establecerá o borrará todos los bits del píxel (cualquiera sea la operación que haga que haga lo que fuera a hacer) y luego escriba cualquier bit cuyo valor deba ser opuesto Tenga en cuenta también que se pueden lograr escalas de brillo no lineales arbitrarias variando la sincronización de las actualizaciones de la pantalla, o usando algunos valores comparativos más de una vez en un ciclo de PWM. Las escalas de brillo no lineales suelen ser útiles con los LED, ya que la diferencia de brillo entre 1/128 y 2/128 generalmente es mucho más visible que la diferencia entre 127/128 y 128/128 (o incluso entre 7/8 y 8/8).