Dein Code funktioniert grundsätzlich, aber ich sehe da zwei Probleme:
Blink_an = 0 in der ISR, direkt vor dem Port schalten.
Das sorgt dafür, dass der Vergleich nur ein einziges Mal zutrifft, danach ist das Display wieder aus.
Du musst das Hochzählen dieser Variable durchlaufen lassen. Das Verhältnis von Max_blink_an und 255 (weil Byte) gibt dir das Blink Verhältnis. Und das ist das zweite Problem: Meistens will man ein 50/50 Verhältnis, weil das besser aussieht. Dein Code würde mehr ein PWM erzeugen, also feste Frequenz aber veränderbares Verhältnis. Bei Display_off ist das so, weil du da ja dimmen willst. Beim Blinken über den Sectic ist das Verhältnis automatisch 50/50, die gesamte Dauer 2 Sekunden. Das könnte etwas langsam sein, geht mit Sekundentakt aber nicht schneller. Wenn du es schneller haben willst dann so wie du angefangen hast.
Du müsstest dann erst einmal überlegen, in welchem Verhältnis an und aus sein sollen und dann auch die absolute Zeit für eine Periode.
Deine Timer ISR wird jetzt etwa 1000 mal pro Sekunde aufgerufen. Wenn die gesamte Periode also z.B. 1 Sekunde sein soll, dann zählst du eine Variable bis 1000 hoch. Der Wechsel käme dann bei 500, wenn du 50/50 haben willst. Für langsamers Blinken zählst du höher, für kürzeres entsprechend niedriger. Solange du nicht wesentlich niedriger gehst, kommt dir das mit den anderen Umschaltungen nicht in die Quere.
Ich habe es dir mal in deinen Code eingebaut:
Code:
$regfile = "m16DEF.DAT"
$crystal = 16000000
Config Porta = Input
Config Portb = Output
Config Portc = Output
Config Portd = Output

Dim Offset As Word                                'kann auch byte sein, wenn du nicht mehr als 50 Zeichen brauchst
Dim Zeichen As Byte
Dim Spalte As Byte
Dim Werte As Byte
Dim Display_off As Byte , Max_display_off As Byte ,
Dim Blink_an As Word , Blink_count As Word , Max_blink_an As Word   'damit auch höhere Zahlen als 255 gehen

Config Dcf77 = Pind.7 , Check = 2 , Timer = 1 , Timer1sec = 1 , Debug = 1 , Sectic = 1

Config Timer0 = Timer , Prescale = 64             'timer läuft alle 16.000.000/256/256=250.stel Sekunde über, also etwa alle 4ms
On Timer0 Timer0_isr
Enable Timer0
Enable Interrupts
Spalte = 0
Do
   Zeichen = Asc( "2")
   If Pina.7 = 1 Then Max_display_off = 4
   If Pina.7 = 0 Then Max_display_off = 0

   If Pina.6 = 1 Then
      Max_blink_an = 800
      Blink_an=400              'hier das Verhältnis (400/800), heisst nach der Hälfte der Zeit geht es an, kleiner Wert heisst länger an
   else
      Max_blink_an = 0
      Blink_an=0
   end if                   
Loop

Timer0_isr:
   Offset = Zeichen - 49
   Offset = Offset * 5                            'immer 5 Werte pro Zeichen
   If Spalte = 5 Then
      Spalte = 0
   End If
   Offset = Offset + Spalte
   Werte = Lookup(offset , Zeichen_data)
   Incr Display_off
   Incr Blink_count
   if Blink_count>Max_blink_an Then Blink_count=0
   Portd = 0                                      'zum Verhindern von Geisterbildern
   If Display_off > Max_display_off Then          'damit bleibt das Zeichen immer für eine bestimmte Zeit aus
      Display_off = 0
      If Blink_count >= Blink_an Then
         Portb = Werte                                      'lädt die Werte
         Portd.spalte = 1                            'Gibt die Spalte frei
         Incr Spalte
      End If
   End If
Return

Zeichen_data:
Data &B11111111 , &B10111101 , &B10000000 , &B10111111 , &B11111111       '1
Data &B10111101 , &B10011110 , &B10101110 , &B10110110 , &B10111001       '2
Gruß

Rolf