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:
Das wäre alles.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
Ich habe den Taster an PINB.1 genauso abgefragt wie den an PIND.2, oder funktioniert der tatsächlich anders herum?
Gruß
Rolf







Zitieren

Lesezeichen