В области программного обеспечения, если количество необходимых настроек яркости не слишком велико, может быть полезно сохранить данные в «битовом» формате (как описано в моем другом аппаратном ответе), а затем иметь В выходных подпрограммах используются логические операторы для одновременной обработки 8 пикселей. Для максимальной эффективности это потребует наличия нескольких отдельных выходных подпрограмм, используемых для разных частей цикла ШИМ; например, если вы хотите использовать 4-битные значения яркости, можно использовать восемь подпрограмм в форме:
movf bit0Comp, w; Должно быть 00 или FF в зависимости от бита 0 сравнения (FF, если сброшено)
iorwf POSTINCF, w; Бит 0 данных; всегда используйте IORWF
andwf POSTINCF, w; Бит 1 данных; используйте IORWF, если установлен бит 1 сравнения; ANDWF, если ясно
andwf POSTINCF, w; Бит 2 данных; Используйте IORWF, если установлен бит 1 сравнения; ANDWF, если ясно
andwf POSTINCF, w; Бит 2 данных; Используйте IORWF, если установлен бит 1 сравнения; ANDWF, если ясно
MOVWF SPIREG; Сохранить результирующий байт (биты установлены, если> = сравнение)
Можно было бы использовать различные комбинации IORWF и ANDWF, в зависимости от значения сопоставимого. Обратите внимание, что используя этот подход, как показано, можно обновлять значения яркости пикселей в любой точке цикла ШИМ без мерцания при условии, что все четыре бита записываются между вызовами в процедуру сдвига отображения, или с помощью процедуры обновления пикселя определить, является ли следующий сдвиг выведет «1» или «0» для пикселя и либо установит, либо очистит все биты пикселя (в зависимости от того, какая операция заставит его делать то, что он собирался делать в любом случае), а затем записывает любые биты, значение которых должно быть противоположным. Отметим также, что можно достичь произвольных нелинейных шкал яркости, изменяя время обновления дисплея или используя несколько сравнительных значений более одного раза в цикле ШИМ.