PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 7 segment multiplex + DP



alf-k
27.05.2008, 16:16
Hallo Habe 7 Segment Anzeige.
Meine Frage ist, wie kann ich nur die 2 Dp Punkte Leuchten lassen
ohne das die Anderen Leuchten ( ist alles in multiplex auch DP)
Danke.

On Timer1 Ontimer1
Config Timer1 = Timer , Prescale = 64

Segment_zahl(1) = &H79
Segment_zahl(2) = &H24
Segment_zahl(3) = &H30
Segment_zahl(4) = &H19
Segment_zahl(5) = &H12
Segment_zahl(6) = &H2
Segment_zahl(7) = &H78
Segment_zahl(8) = &H0
Segment_zahl(9) = &H10
Segment_zahl(10) = &H40

Segment_anzeige(1) = &B11111101
Segment_anzeige(2) = &B11111011
Segment_anzeige(3) = &B11110111
Segment_anzeige(4) = &B11101111
Segment_anzeige(5) = &B11111101
Segment_anzeige(6) = &B11011011
Segment_anzeige(7) = &B11010111
Segment_anzeige(8) = &B11001111

'--- Sekunden-Punkt darf in diesem Fall nicht in der Multiplexroutine stehen ---
Dezimalpunkt Alias Portc.2
Dim Sek_blink As Bit

PicNick
27.05.2008, 16:30
Versteh ich das richtig:
Du hast 8 stück 7 SegmentAnzg., die du mit irgendwelchen Zahlen multiplext.
Bei zwei Anzeigen sollen die DP (sekundentakt?) "unabhängig" blinken ?

alf-k
27.05.2008, 16:34
Hallo nein Ich habe nur 4 7 Segment.

alf-k
27.05.2008, 16:35
Hallo nein Ich habe nur 4 7 Segment. (timer)

PicNick
27.05.2008, 16:56
Ahja. Hab nur gedacht, weil du 8 "Sement_anzeige" definiert hast.
Ist auch egal.
Normalerweise macht man den blinkenden DP gleich mit, indem man ihn an der passenden Stelle rein-odert oder nicht.

alf-k
27.05.2008, 17:03
Hi und wie mach ich das, hasst du mir ein Beispiel.
mfg alfons

PicNick
27.05.2008, 17:27
Also, du hast


7-Segment PORTC ? a, b, c, d, e, f, g DP
Kathoden PORTB ? 0001 0010 0100 100



Dim Zahl As Word ' dein timer 0-9999

DIM strg AS STRING * 5 ' timer als ASCII-String
DIM ziffern(4) AS BYTE AT strg OVERLAY ' zum multiplexen
DIM dez_p AS BYTE ' dezimalpunkt on/off
DIM tmp AS BYTE
strg = "9999"
DO
PORTB = &HFE
tmp = ziffern(1)
tmp = tmp AND &H0F
PORTC = lookup( tmp , Tabelle)

PORTB = &HFD
tmp = ziffern(2)
tmp = tmp AND &H0F
tmp = lookup( tmp , Tabelle)
PORTC = tmp OR dez_p

PORTB = &HFB
tmp = ziffern(3)
tmp = tmp AND &H0F
tmp = lookup( tmp , Tabelle)
PORTC = tmp OR dez_p

PORTB = &HF7
tmp = ziffern(4)
tmp = tmp AND &H0F
PORTC = lookup( tmp , Tabelle)


LOOP

END

Timer_isr:
if Zahl > 0 then
zahl = zahl - 1
strg = str(zahl)
end if
dez_p = dez_p XOR &H04 ' dezimalpunkt an/aus
return


Tabelle:
DATA &H79
DATA &H24
DATA &H30
DATA &H19
DATA &H12
DATA &H2
DATA &H78
DATA &H0
DATA &H10
DATA &H40

Das mit dem Timer richtig zählen kannst du ja.
ich zähl da nur runter

Ich hab angenommen, die hast sowas vor wie HH:MM



EDIT: Ich hab da was ausbessern müssen

alf-k
27.05.2008, 18:03
Hallo wie und wom setze ich das ein.
danke

PicNick
27.05.2008, 19:31
Für's Genaue muß ich wissen:
welche Pins für die segmente a - g und DP
welche Pins für die Anzeige
kurzum: die Beschaltung

Welcher µC, welcher Quartz
Wie stellst du deinen Timer ein

Was genau soll wann passieren

alf-k
27.05.2008, 19:43
hi sihe:


$regfile = "m48def.dat"
$crystal = 4000000

Dim Segment_zahl(10) As Byte
Dim Segment_anzeige(8) As Byte
Dim Zeit(4) As Byte
Dim Eezeit(4) As Eram Byte
Dim Z As Byte
Dim I As Word
Dim Timerpreset As Word
Dim Taste1 As Bit
Dim Taste2 As Bit
Dim Taste3 As Bit
Dim Taste4 As Bit
Taste4 = 1
Declare Sub Zeiteinstellung
Declare Sub Vorgabe
Declare Sub Sound
Declare Sub Sound1
Config Portd.0 = Output 'A
Config Portd.1 = Output 'B
Config Portd.2 = Output 'C
Config Portd.3 = Output 'D
Config Portd.4 = Output 'E
Config Portd.5 = Output 'F
Config Portd.6 = Output 'G


Config Portb.1 = Output 'Digi 1
Config Portb.2 = Output 'Digi 2
Config Portb.3 = Output 'Digi 3
Config Portb.4 = Output 'Digi 4
Config Portc.2 = Output 'Dezimalpunkt = Sek_blink Gegen +
Config Portc.1 = Output 'Relais
Config Portc.0 = Output 'Peeper Gegen -
Config Portc.3 = Input ' Start/ Stop Taster
Config Portc.4 = Input 'Minuten Taster
Config Portc.5 = Input 'Sekunden Taster

Portd.0 = 1
Portd.1 = 1
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1


Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1


Portc.2 = 1
Portc.1 = 0
Portc.0 = 0



Portc.3 = 1
Portc.4 = 1
Portc.5 = 1






On Timer1 Ontimer1
Config Timer1 = Timer , Prescale = 64
'Parameter für 7Segment um diese Zahl Anzuzeigen über die Ausgänge
Segment_zahl(1) = &H79
Segment_zahl(2) = &H24
Segment_zahl(3) = &H30
Segment_zahl(4) = &H19
Segment_zahl(5) = &H12
Segment_zahl(6) = &H2
Segment_zahl(7) = &H78
Segment_zahl(8) = &H0
Segment_zahl(9) = &H10
Segment_zahl(10) = &H40
'Parameter für Aktives Segment,immer nur eins kann an sein
Segment_anzeige(1) = &B00000010
Segment_anzeige(2) = &B00000100
Segment_anzeige(3) = &B00001000
Segment_anzeige(4) = &B00010000
Segment_anzeige(5) = &B00100010
Segment_anzeige(6) = &B00100100
Segment_anzeige(7) = &B00101000
Segment_anzeige(8) = &B00110000

'--- Sekunden-Punkt darf in diesem Fall nicht in der Multiplexroutine stehen ---
Dezimalpunkt Alias Portc.2 'dezimalpunkt blinkt im halbsekunden takt
Dim Sek_blink As Bit

'Zeit Voreinstellung laden aus EEProm
Call Zeiteinstellung
Timerpreset = 3036

Enable Timer1
Stop Timer1
Timer1 = Timerpreset
Enable Interrupts
'************************************************* ******************************
Main:

For Z = 1 To 4
Dezimalpunkt = Sek_blink
I = I + 1
If I = 600 Then
Sek_blink = 0
I = 0
End If

If Zeit(z) = 0 Then
Portd = Segment_zahl(10) 'eine "0" in 7segment anzeigen
Else
Portd = Segment_zahl(zeit(z)) 'zahl aus Variable in 7segment anzeigen
End If

If Tccr1b = 0 Then 'wenn timer gestoppt, ist Relais aus
Portb = Segment_anzeige(z + 4) 'einzelnen segmente ansteuern
Else

Portb = Segment_anzeige(z) 'wenn timer läuft relais an

End If
Waitms 1
'----------------- Start/Stop und wenn geändert EEPROM-werte Schreiben ---------

If Pinc.3 = 0 And Taste4 = 0 Then
Eezeit(1) = Zeit(1)
Eezeit(2) = Zeit(2)
Eezeit(3) = Zeit(3)
Eezeit(4) = Zeit(4)
Taste4 = 1
End If

'----------------- Reine Start/Stop Routien ------------------------------------
If Pinc.3 = 0 And Taste3 = 0 Then

Taste3 = 1
If Tccr1b = 0 Then
Start Timer1

Call Zeiteinstellung

I = 0

Portc.1 = 1





Else



Stop Timer1
Call Zeiteinstellung

I = 0
Portc.1 = 0









End If
End If

If Pinc.3 = 1 Then
Taste3 = 0
End If

'----------------- Minuten um 1 erhöhen Taster ---------------------------------

If Pinc.4 = 0 And Taste2 = 0 And Tccr1b = 0 Then

Taste2 = 1
Taste4 = 0
Incr Zeit(2)
If Zeit(2) = 10 Then
Zeit(2) = 0
Incr Zeit(1)
If Zeit(1) = 10 Then Zeit(1) = 0
End If
End If

If Pinc.4 = 1 Then
Taste2 = 0
End If



'------------Sekunde und Minuten = Null setzen ---------------------------------
If Pinc.4 = 0 And Tccr1b = 0 And Pinc.5 = 0 Then

Taste4 = 0

Zeit(1) = 0
Zeit(2) = 0
Zeit(3) = 0
Zeit(4) = 0
End If

If Pinc.4 = 1 And Pinc.5 = 1 Then

End If

Next Z

'************************************************* *****************************









'----------------- Sekunden um 1 erhöhen Taster --------------------------------

If Pinc.5 = 0 And Taste1 = 0 And Tccr1b = 0 Then

Taste1 = 1
Taste4 = 0
Incr Zeit(4)
If Zeit(4) = 10 Then
Zeit(4) = 0
Incr Zeit(3)
If Zeit(3) = 6 Then Zeit(3) = 0
End If
End If

If Pinc.5 = 1 Then
Taste1 = 0
End If



Goto Main
'************************************************* *****************************

Ontimer1:

Timer1 = Timer1 + Timerpreset
Decr Zeit(4)

Sek_blink = 1
I = 0

If Zeit(1) = 0 And Zeit(2) = 0 And Zeit(3) = 0 And Zeit(4) = 0 Then
Stop Timer1
Call Zeiteinstellung
I = 0
Portc.1 = 0
Call Sound


End If
If Zeit(4) = 255 Then
Zeit(4) = 9
Decr Zeit(3)
If Zeit(3) = 255 Then
Zeit(3) = 5
Decr Zeit(2)
If Zeit(2) = 255 Then
Zeit(2) = 9
Decr Zeit(1)
End If
End If
End If
Return

'----------- gespeicherte Timerwerte aus EEPROM laden --------------------------
Sub Zeiteinstellung
Zeit(1) = Eezeit(1) 'Minuten Zehner
Zeit(2) = Eezeit(2) 'Minuten Einer
Zeit(3) = Eezeit(3) 'Sekunden zehner
Zeit(4) = Eezeit(4) 'Sekunden Einer

End Sub
Sub Sound
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1
Sound Portc.0 , 400 , 100
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Portb.4 = 0
Waitms 100


Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1
Sound Portc.0 , 400 , 100
Waitms 100
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Portb.4 = 0
Sound Portc.0 , 400 , 100
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1
End Sub

PicNick
28.05.2008, 13:31
Gut, Ich schau' mir das an. Etwas Geduld

PicNick
28.05.2008, 14:40
Versuch mal, Irrtum vorbehalten.

Ein paar Sachen würde ich anders machen, aber eigentlich könnte das gehen. Ist der Code von dir oder wo hast du ihn her ?



$regfile = "m48def.dat"
$crystal = 4000000


Config Timer1 = Timer , Prescale = 64 ' 1 sec
Const Timerpreset = 3036 ' 1 sec

On Timer1 Ontimer1

Config Portd.0 = Output 'A
Config Portd.1 = Output 'B
Config Portd.2 = Output 'C
Config Portd.3 = Output 'D
Config Portd.4 = Output 'E
Config Portd.5 = Output 'F
Config Portd.6 = Output 'G

Config Portb.1 = Output 'Digi 1
Config Portb.2 = Output 'Digi 2
Config Portb.3 = Output 'Digi 3
Config Portb.4 = Output 'Digi 4

Config Portc.2 = Output 'Dezimalpunkt = Sek_blink Gegen +
Config Portc.1 = Output 'Relais
Config Portc.0 = Output 'Peeper Gegen -

Config Portc.3 = Input ' Start/ Stop Taster
Config Portc.4 = Input 'Minuten Taster
Config Portc.5 = Input 'Sekunden Taster


Declare Sub Zeiteinstellung
Declare Sub Soundout

Dim Zeit(4) As Byte

Dim Kontrolle As Eram Byte ' kontrollbyte
Dim Eezeit(4) As Eram Byte

Dim Z As Byte
Dim I As Word
Dim Tmp As Byte

Dim Taste1 As Bit
Dim Taste2 As Bit
Dim Taste3 As Bit
Dim Taste4 As Bit


Portd = &H7F
Portb = &H1E
Portc = &H3C

Taste4 = 1


'--- Sekunden-Punkt darf in diesem Fall nicht in der Multiplexroutine stehen ---
Dezimalpunkt Alias Portc.2 'dezimalpunkt blinkt im halbsekunden takt
Dim Sek_blink As Bit

'Zeit Voreinstellung laden aus EEProm

Call Zeiteinstellung

Enable Timer1
Stop Timer1
Timer1 = Timerpreset
Enable Interrupts
'************************************************* ******************************
Main:
Tmp = 1
For Z = 1 To 4
Dezimalpunkt = Sek_blink
I = I + 1
If I = 600 Then
Sek_blink = 0
I = 0
End If

Portd = Lookup(zeit(z) , Led_table) 'zahl aus Variable in 7segment anzeigen
Portb = Tmp
If Tccr1b = 0 Then 'wenn timer gestoppt, ist Relais aus
Portb.5 = 1 'einzelnen segmente ansteuern
End If
Shift Tmp , Left , 1
Waitms 1

'----------------- Start/Stop und wenn geändert EEPROM-werte Schreiben ---------
If Pinc.3 = 0 And Taste4 = 0 Then
Eezeit(1) = Zeit(1)
Eezeit(2) = Zeit(2)
Eezeit(3) = Zeit(3)
Eezeit(4) = Zeit(4)
Kontrolle = 0 ' ERAM Kontrolle
Taste4 = 1 ' reset changed
End If
'----------------- Reine Start/Stop Routien ------------------------------------
If Pinc.3 = 0 And Taste3 = 0 Then
Taste3 = 1 ' disable start/stop
If Tccr1b = 0 Then
Start Timer1
Call Zeiteinstellung
I = 0 ' reset blink-count
Portc.1 = 1 'Relais ON
Else
Stop Timer1
Call Zeiteinstellung
I = 0 ' reset blink-count
Portc.1 = 0 'Relais OFF
End If
End If
If Pinc.3 = 1 Then
Taste3 = 0 ' enable start/stop
End If
'----------------- Minuten um 1 erhöhen Taster ---------------------------------
If Pinc.4 = 0 And Taste2 = 0 And Tccr1b = 0 Then
Taste2 = 1 ' disable up/down MIN
Taste4 = 0 ' set changed
Incr Zeit(2)
If Zeit(2) = 10 Then
Zeit(2) = 0
Incr Zeit(1)
If Zeit(1) = 10 Then Zeit(1) = 0
End If
End If
If Pinc.4 = 1 Then
Taste2 = 0 ' enable up/down MIN
End If
'------------Sekunde und Minuten = Null setzen ---------------------------------
If Pinc.4 = 0 And Tccr1b = 0 And Pinc.5 = 0 Then
Taste4 = 0 ' set changed
Zeit(1) = 0
Zeit(2) = 0
Zeit(3) = 0
Zeit(4) = 0
End If
If Pinc.4 = 1 And Pinc.5 = 1 Then

End If

Next Z

'************************************************* *****************************
'----------------- Sekunden um 1 erhöhen Taster --------------------------------
If Pinc.5 = 0 And Taste1 = 0 And Tccr1b = 0 Then
Taste1 = 1 ' disable up/down SEC
Taste4 = 0 ' set changed
Incr Zeit(4)
If Zeit(4) = 10 Then
Zeit(4) = 0
Incr Zeit(3)
If Zeit(3) = 6 Then Zeit(3) = 0
End If
End If
If Pinc.5 = 1 Then
Taste1 = 0 ' enable up/down SEC
End If


Goto Main


'************************************************* *****************************
Ontimer1:
Timer1 = Timerpreset
Decr Zeit(4)
Sek_blink = 1
I = 0 'blink counter
If Zeit(1) = 0 And Zeit(2) = 0 And Zeit(3) = 0 And Zeit(4) = 0 Then
Stop Timer1
Call Zeiteinstellung
I = 0
Portc.1 = 0 'relais OFF
Call Soundout 'Peep-peep
End If
If Zeit(4) = 255 Then
Zeit(4) = 9
Decr Zeit(3)
If Zeit(3) = 255 Then
Zeit(3) = 5
Decr Zeit(2)
If Zeit(2) = 255 Then
Zeit(2) = 9
Decr Zeit(1)
End If
End If
End If
Return

'----------- gespeicherte Timerwerte aus EEPROM laden --------------------------
Sub Zeiteinstellung
If Kontrolle = &HFF Then ' neu oder gelöschter ERAM
Zeit(1) = 0
Zeit(2) = 0
Zeit(3) = 0
Zeit(4) = 0
Else
Zeit(1) = Eezeit(1) 'Minuten Zehner
Zeit(2) = Eezeit(2) 'Minuten Einer
Zeit(3) = Eezeit(3) 'Sekunden zehner
Zeit(4) = Eezeit(4) 'Sekunden Einer
End If
End Sub

Sub Soundout
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1
Sound Portc.0 , 400 , 100
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Portb.4 = 0
Waitms 100
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1
Sound Portc.0 , 400 , 100
Waitms 100
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Portb.4 = 0
Sound Portc.0 , 400 , 100
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1
End Sub


End

'Parameter für 7Segment um diese Zahl Anzuzeigen über die Ausgänge
Led_table:
' 0 1 2 3 4 5 6 7 8 9
Data &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H02 , &H78 , &H0 , &H10

alf-k
28.05.2008, 21:32
Hallo Robert danke!
Aber leider Geht das letzte Segment nicht,
den Code habe ich irgendwo im Netz gefunden.
MFG Alfons

PicNick
29.05.2008, 07:53
..leider Geht das letzte Segment nicht, .

Du meinst das LED-Segment g ?

alf-k
30.05.2008, 00:46
Hallo nein ich meine das letzte Segment

Jaecko
30.05.2008, 07:46
Was heisst "letztes" Segment?
A? B? C? D? E? F? G? DP?

alf-k
30.05.2008, 07:51
hi sorry ich meinte das letzte display

helimike0705
31.05.2008, 10:52
Hallo Robert danke!
Aber leider Geht das letzte Segment nicht,
den Code habe ich irgendwo im Netz gefunden.
MFG Alfons

irgendwo,kann nicht sein der ist von mir und wurde für einen namens
"manni" im bascom forum geschrieben. hatte mir dafür 3 bis 4 lcd versprochen, die ich nie erhalten habe.
ist schon komisch das es leute gibt die einen alles machen lassen und selbst nicht denken wollen. ist ja einfacher. wird mir nicht mehr passieren
jemanden mit einen kompletten code zu helfen, schnipsel ja ,komplett nein. selber lernen ist halt schwerer als alles sich vorkauen lassen.

gehe lieber heli fliegen und mache meinen kram selbst.

MIKE