'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