Yazılım alanında, birinin ihtiyaç duyduğu farklı parlaklık ayarlarının sayısı çok büyük değilse, verileri "bit-düzlemsel" biçimde (diğer donanım tabanlı cevabımda açıklandığı şekilde) saklamak ve sonra çıktı yordamları, bir defada 8 pikselde etki etmek için Boolean işleçlerini kullanır. Maksimum verimlilik için bu, PWM döngüsünün farklı bölümleri için kullanılan çoklu ayrı çıkış rutinlerine sahip olmayı gerektirecektir; örneğin, biri 4 bitlik parlaklık değerleri kullanmak isterse, formun sekiz rutini kullanılır:
movf bit0Comp, w; Karşılaştırıcının 0 bitine bağlı olarak 00 veya FF olmalıdır (eğer netse FF)
iorwf POSTINCF, w; Veri biti 0; daima IORWF kullanın
vewf POSTINCF, w; Veri 1 biti; Comparand'ın 1 biti ayarlanmışsa IORWF kullanın; ANDWF temizse
vewf POSTINCF, w; Veri 2 biti; Comparand'ın 1 biti ayarlanmışsa, IORWF kullanın; ANDWF temizse
vewf POSTINCF, w; Veri 2 biti; Comparand'ın 1 biti ayarlanmışsa, IORWF kullanın; ANDWF temizse
movwf SPIREG; Elde edilen baytı sakla (eğer> = comparand ise ayarlanmış bit
Biri, karşılaştırıcının değerine bağlı olarak farklı IORWF ve ANDWF kombinasyonlarını kullanır. Bu yaklaşımı gösterildiği gibi kullanmanın, PWM döngüsünün herhangi bir noktasındaki piksel parlaklığı değerlerini titremeden titremeden güncelleyebileceğini unutmayın; ancak, dört bitin de ekran kaydırma rutinine çağrılar arasında yazılması veya piksel güncelleme rutininin belirleyip belirlemediğini belirlemesi sonraki vardiya, piksel için "1" veya "0" çıktısını verir ve pikselin tüm bitlerini (hangisi ne yaparsa yapsın işlem yapsın) ayarlayıp temizler ve sonra değeri olan bitleri yazar. karşı olmak. Ayrıca, ekran güncellemelerinin zamanlamasını değiştirerek veya bazı karşılaştırmalı değerleri bir PWM döngüsünde bir kereden fazla kullanarak isteğe bağlı doğrusal olmayan parlaklık ölçekleri elde edebileceğinizi unutmayın.