Hallo David,
ich hoffe, dass deine Anzeige nicht bis 99 gehen wird, sonst wird das ja ein riesiges Programm.
Du kannst auch einen ganzen Port mit einem Befehl setzen.
Anstelle von:
Portd.0 = 1
Portd.1 = 1
Portd.7 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portd.6 = 0
Portc.1 = 1
Portc.2 = 1
Portc.0 = 0
Portc.5 = 0
Portc.6 = 0
Portc.4 = 0
Portc.3 = 0
wäre das dann für die "10" einfach
Portd=191 'oder auch PortD = &B10111111, damit du die einzelnen Bits noch siehst
Portc=6
Und der nächste Schritt wäre dann, diese Werte in ein Array abspeichern:
Segmente_zehner(1)=6
Segmente_Einer(0)=191 'siehe Bemerkung unten
Damit hättest du dann auch die ganzen Ifs eingespart und dein Programm sähe dann recht übersichtlich aus:
Code:
$regfile = "m8def.dat"
$crystal = 1000000 ' 1MHZ crystal
$sim
Ddrd = &B11111101 'Pind.2 ist ein Eingang
Ddrc = &B11111111
Config Pinb.1 = Input
Portd.2 = 1
Portb.1 = 1
Dim Segmente_einer(10) As Byte , Segmente_zehner(10) As Byte
Dim A As Byte '256 Werte reichen doch
Dim Einer As Byte , Zehner As Byte
Segmente_einer(1) = &B10000011 'bit 2 muss immer gesetzt sein, weil das der Pullup für PORTD.2 ist
Segmente_einer(2) = &B01011111 'bit 2 muss immer gesetzt sein, weil das der Pullup für PORTD.2 ist
'...... 'hier musst du noch die anderen Werte hinschreiben
Segmente_einer(10) = &B10111111 'Arrays fangen leider mt Index 0 an, deshalb nehmen wir die 10 für die 0
Segmente_zehner(1) = &B00000110
'...... 'hier musst du noch die anderen Werte hinschreiben
A = 0
Do
If Pind.2 = 1 Then 'Zähler hochzählen
Incr A
Waitms 50
End If
If Pinb.1 = 1 Then 'Zähler runterzählen
Decr A
Waitms 50
End If
If A > 19 Then '10 als Maximalwert
A = 0
End If
Zehner = A / 10
If Zehner = 0 Then Zehner = 10 'siehe oben
Einer = A Mod 10
If Einer = 0 Then Einer = 10
Portd = Segmente_einer(einer)
Portc = Segmente_zehner(zehner)
Waitms 450
Loop
End
Das wäre alles.
Ich habe den Taster an PINB.1 genauso abgefragt wie den an PIND.2, oder funktioniert der tatsächlich anders herum?
Gruß
Rolf
Lesezeichen