Archiv verlassen und diese Seite im Standarddesign anzeigen : 7 segment multiplex + DP
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
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 ?
Hallo nein Ich habe nur 4 7 Segment.
Hallo nein Ich habe nur 4 7 Segment. (timer)
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.
Hi und wie mach ich das, hasst du mir ein Beispiel.
mfg alfons
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
Hallo wie und wom setze ich das ein.
danke
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
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
Gut, Ich schau' mir das an. Etwas Geduld
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
Hallo Robert danke!
Aber leider Geht das letzte Segment nicht,
den Code habe ich irgendwo im Netz gefunden.
MFG Alfons
..leider Geht das letzte Segment nicht, .
Du meinst das LED-Segment g ?
Hallo nein ich meine das letzte Segment
Was heisst "letztes" Segment?
A? B? C? D? E? F? G? DP?
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.