'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
'IIIIIII  Programm steuert eine 64 Led Leiste an
'IIIIIII  IC Max7219
'IIIIIII  06.01.2008 15:30:59
'IIIIIII  Demonstration Ausgabe Basic, Basic compiliert, Maschinenprogramm
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII


' Das IC MAX7219 (Fa. Maxim) wurde für die Ansteuerung von bis zu acht
' 7-Segment-Anzeigen entwickelt.
' Man kann aber auch 64 einzelne LEDs oder eine Dot-Matrix (5X7) (8x8) ansteuern.
' Durch kaskadieren (hintereinanderschalten) mehrer MAX7219 können auch größerer
' Anzeigen gebaut werden.
' Dies alles kann mit drei Portleitungen und einem einfachen
' Programmieralgorythmus realisiert werden.
' In diesem Programm werden 64 einzelne Leds angesteuert.

'        Die Pinbelegung Max7219
'        ______    ______
'        |     \  /     |         Din Dateneingang vom Controller
'       [  Din     Dout  ]        Dout wird mit einem weiteren Max7219 verbunden, wenn nicht vorhanden NC.(nicht belegt)
'        |              |
'       [  Dig1    S D  8]        Dig 1 bis Dig 8 sind die einzelnen Digits (Kathode)
'        |              |
'       [  Dig5    S Dp 128]      S A bis S Dp = Segmente der Anzeige
'        |              |         Die Zahlen 1 bis 128 geben die Wertigkeit der einzelnen Leds an.(Anode)
'       [  GND     S E  4]
'        |              |
'       [  Dig7    S C 16]
'        |              |
'       [  Dig3     + 5V ]        Versorgungsspannung 5 V +
'        |              |
'       [  Dig4    Iset  ]
'        |              |
'       [  Dig8    S G  1]
'        |              |
'       [  GND     S B 32]        GND = - Masse
'        |              |
'       [  Dig6    S F  2]
'        |              |
'       [  Dig2    S A 64]
'        |              |
'       [  Load    Clk   ]        Load Steuerleitung am Anfang und Ende einer Datenübertragung
'        |              |         Clk  Takt.Nach jeder Bitausgabe an > Din < wird Clk an und ausgeschaltet. ( Pulse clk)
'         ______________
'
' Siehe auch Schaltplan auf dieser Internetseite.(Ansteuerung von 60 Leds, Sekundenanzeige)
' Wer sich weiter in die Materie einarbeiten will,dem sei das Datenblatt von Maxim empfohlen.
' Im Internet stehen auch einige Beschreibungen.
' Besonders gefallen hat mir die Anleitung von Stefan Buchgeher. (in deutsch)
' http://www.stefan-buchgeher.info/elektronik/max7219/max7219_dot_matrix.html
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

' Das Programm wurde mit OCbasr.exe compiliert.
' Die Routine zur Datenübertragung an den Max 7219 wurde in drei verschiedenen
' Versionen geschrieben. Basic, Basic Compiliert, Maschinensprache.
' Man kann sehr gut die Geschwindigkeiten der einzelnen Übertragungsroutinen sehen.
' Laufzeit des untenstehenden Programms. ( 100 mal alle 64 Leds nacheinander einschalten)
' reines Basic     55 Sekunden
' Basic compiliert 21 Sekunden
' Maschinenprogramm 6 Sekunden
' Den Max 7219 gibt es bei Reichelt Elektronic für 5,90 Euro.
' (Soll keine Werbung sein, wenn jemand eine billigere Bezugsquelle 
'  weiß, bitte Mail an mich.)
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII


 option openmicro
'--------------------------
'------ I/O PORTS ---------
'--------------------------

define clk   port[6]
define d_in   port[4]
define Load  port[5]
define port1 byteport[1]

define Adresse byte
define Daten byte
define Mask byte
define x Byte
define xx byte
define xxx byte
define i byte
define ii byte

include "om.def"

gosub Initialisierung

xx = 1
#Hauptprogramm
xxx =3
for x = 0 to 63
gosub anzeigen
next
pause 100
gosub display_aus
gosub hell
goto Hauptprogramm



for xxx = 1 to 3
for xx = 1 to 100

for x = 0 to 63

gosub anzeigen

next

gosub display_aus
next xx
pause 100
next xxx
pause 100
goto hauptprogramm
end

#Anzeigen

   i = x/ 8
  ii = x mod 8
    Daten = looktab (reihe,ii)
    adresse = i+1
#Anz1
if xxx = 1 then
 gosub Dataout        ' Basic
elseif xxx = 2 then
data_out              'Basic Compiler
else

    max_write          'Assembler
end if
 return

#Hell

Adresse = &H0A                 ' Intensität
Daten =  xx
gosub dataout
add  xx,1
if xx >15 then xx = 1
return

#Initialisierung
port1 = off
load = on

Adresse = &H09                 ' Decode Mode , keine Decodierung
Daten = 0                       'aus
gosub dataout

Adresse = &H0A                 ' Intensität
Daten =  5
gosub dataout

Adresse = &H0B                 ' Anzahl der Digits
Daten =  &H07                   ' alle Digits an
gosub dataout

Adresse = &H0F                 ' Display Test
Daten =  0                      ' aus
gosub dataout

 gosub display_aus

Adresse = &H0C                 ' Display einschalten
Daten =  &H01                   'normal
gosub dataout

return

#display_aus
 for i = 1 to 8
Adresse = i
Daten = 0
gosub anz1
next
return


'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
 ' BASIC
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

#Dataout
Load = off
CLK = off

MASK=&B10000000
While MASK                  'Schleife so lange durchlaufen bis MASK 0 ist
 d_in =(Adresse and MASK)    'Adresse wird  maskiert, ein Bit wird gesendet
  pulse CLK
 MASK=MASK shr 1            'schiebt Bits eine Stelle nach rechts aus &B10000000 wird &B01000000 usw.
wend
MASK=&B10000000
While MASK
 d_in =(Daten and MASK)
  pulse CLK
 MASK=MASK shr 1
wend
Load = on
return

'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
 ' Compiliertes Basic
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

procedure data_out compile
Load = off
CLK = off

MASK=&B10000000
While MASK                  'Schleife so lange durchlaufen bis MASK 0 ist
 d_in =(Adresse and MASK)    'Adresse wird  maskiert, ein Bit wird gesendet
  pulse CLK
 MASK=MASK shr 1            'schiebt Bits eine Stelle nach rechts aus &B10000000 wird &B01000000 usw.
wend
MASK=&B10000000
While MASK
 d_in =(Daten and MASK)
  pulse CLK
 MASK=MASK shr 1
wend
Load = on
 return
 end procedure





'  ---------------------------------------------------------------------------
'  ---  Maschinenprogramm Ausgabe Daten Max 7219
'  ---------------------------------------------------------------------------
 DEFINE din   bPTA3
 Define lad  bPTA4
 Define clock bPTA5

PROCEDURE Max_write INLASM
! bclr lad ,PORT1         ' Port[5](in Basic) auf low
! bclr clock,port1        ' Port[6](in Basic) auf low
!  ldx #8                 ' Indexregister mit 8 laden
!  lda adresse          ' lade Akku mit adresse
#Max_write_1
 ! lsla                ' >Shift left Akku< ein Bit in das Carryflag schieben
 !   bcc Max_write_2    ' > Branch if Carry Clear<

!  bra Max_write_3    ' >Branch Always<
#Max_write_2
!   bclr din ,PORT1      '>Clear Bit in Memory< einen Datenport auf low
!   bset clock,Port1     '>Set Bit in Memory < Port[6](in Basic) auf high
!   bclr clock,port1     ' Port[6](in Basic) auf low
!   bra max_write_4
#Max_write_3
!     bset din,PORT1      'Datenport auf high
!   bset clock,Port1     '>Set Bit in Memory<
!   bclr clock,port1


#Max_write_4
!   decx                'Index minus 1
!   bne Max_write_1     'solang nicht null gehe zu Max_write_1

'*********************************************
 'nochmals das Gleiche mit den Daten
'*********************************************

 !  ldx #8
!  lda daten          ' lade Akku mit " daten "
#Max_w_1
 ! lsla
 !   bcc Max_w_2

!  bra Max_w_3
#Max_w_2
!   bclr din ,PORT1
!   bset clock,Port1
!   bclr clock,port1
!   bra max_w_4
#Max_w_3
!     bset din,PORT1
!   bset clock,Port1
!   bclr clock,port1


#Max_w_4
!   decx
!   bne Max_w_1



!   bset lad,Port1
!  rts                 'Rücksprung von Unterroutine


end PROCEDURE
' ---------------------------------------------------------------------------

end


 table reihe byte  'für den 60 Sekundenring
1, 3, 7, 15, 31, 63, 127, 255, 254, 252, 248, 240, 224, 192, 128, 0, 1, 2, 4, 8, 16, 32, 64, 128

tabend