Reguacja jasności multipleksowanego wyświetlacza LED


Jestem tu po raz pierwszy więc najpierw witam wszystkich :)
O ile multipleksowanie wyświetlaczy LED można opanować w dość prosty sposób, to już z ich regulacją jasności jest trochę inaczej. Generalnie gotowych kodów brak. Przynajmniej ja nie znalazłem. Przedstawiam prostą regulację świecenia wyświetlaczy.
Układ działa w przerwaniu Timera0 co 400us. Czas ten jest uzależniony od ilości cyfr i poziomów jasności. W poniższym układzie poziomów tych jest 10, co w wiekszości przypadków jest wystarczające. Cyfry wyświetlacza załączane są co 4ms. Regulowany jest tylko ich czas świecenia od 400us do 4ms z krokiem 400us. Czas ten uzalezniony jest od wartości zmiennej PW . Program można rozbudować o regulację jasności każdej cyfry osobno. Podobną regulację można zrobić z wykorzystaniem Timera1 i rejestru Compare. Zainteresowanym mogę udostepnić kod.
W programie wykorzystano fragmenty kodów Mirleya.

$regfile = "m8def.dat"
$crystal = 8000000
Config Portb = &B11111111 : Portb = &B11111111   ' segmenty
Config Portc = &B11111110 : Portc = &B11111111   'anody wyswietlacza
 
'Wyswietlacz ----------------------------------------------------------------------------------
Dim Mux As byte , W(4) As Byte
'Dzielnik Timera0------------------------------------------------------------------------------
Dim Mult As Byte
'PWM-------------------------------------------------------------------------------------------
Dim PW As byte, LedOff As Byte , Dzialka As Byte
 
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 dzielnik
Enable Interrupts
 
w(1) = 249   'przykladowe wartości wyświetlacza
w(2) = 164
w(3) = 176
w(4) = 153
 
Do
 
Loop
End
 
Dzielnik:                     'przerwanie co 400us (czas jednego kroku PWM)
 
   Timer0 = 206
 
   PW = 10                       'wartość PWM  (1 do 10)
   If LedOff = 0 Then
      incr Dzialka
      If Dzialka = PW then      'jasność LED - wypełnienie
         Dzialka = 0
         Set LedOff
         Portb = 255
 
      End If
   End If
   Incr Mult             'częstotliowsć multipleksowania wyświetlaczy
   If Mult = 10 Then
      Mult = 0
      Gosub Wyswietlacz  'skok co 4ms
   End If
 
Return
 
Wyswietlacz:
 
   Incr Mux
 
   If Mux >4 Then Mux = 1
   Select Case Mux
      Case 1
 
         Set portc.4
         PORTb = w(1)
         Reset portc.1
 
      Case 2
 
         Set portc.1
         PORTb = w(2)
         Reset portc.2
 
      Case 3
 
         Set portc.2
         PORTb = w(3)
         Reset portc.3
 
      Case 4
 
         Set portc.3
         PORTb = w(4)
         Reset portc.4
 
   End Select
 
   reset ledoff
 
Return