Die Software zum Unser kleiner Computer '-------------------------------------------------------------------------------- 'name : computer.bas 'copyright : (c)bernd Grupe, DF8ZR 'micro : Mega8 ' Das Programm darf nur für den privaten Gebrauch(Schulen) kopiert werden 'ACHTUNG: Der Chip hat die Ports B,C und D! '-------------------------------------------------------------------------------- $regfile = "m8adef.dat" $crystal = 1000000 'ohne Quarz ist die interne Osz.-Frequenz = 1 MHz $hwstack = 40 $swstack = 16 $framesize = 32 '--------------------------------------------------------------------------- Defint W 'Berechnungswert = Ergebnis W = 0 Defint E E = 0 'Einerstelle = Wert Defint Z Z = 0 'Zehnerstelle = Wert Config Portb = Input Config Portc = Input Config Portd = Output 'Die Ports B und C sind als Eingänge gesetzt 'Für die BCD-Ausgabe diese Pins setzen: Config Portb.4 = Output Config Portb.5 = Output Config Portb.6 = Output
Config Portb.7 = Output 'Pins von C und D werden auch als Abfrage für Anweisungen genutzt 'erst nach dem Einlesen einer Anweisung erfolgt die Umschaltung auf 'die Ausgabe des Ergebnisses, wobei die 7Segment-Anzeige jeweils mit einem IC 'BCD-nach 7Segmentwandler CD4511 gemacht wird 'TASTER1 = + Zeichen für Addition an PB4 T1 Alias Pinc.4 Config T1 = Input 'TASTER2 = - Zeichen für Subtraktion an PB5 T2 Alias Pinc.5 Config T2 = Input 'TASTER3 = C Zeichen für Clear an PD7 T3 Alias Pind.7 Config T3 = Input 'Definitionen fertig '----------------------------------------------------------------------------- 'hier beginnt die Loop: '-------------------------------------Beginn Do 'Abfrage der Taster in der Schleife If T1 = 0 Then Gosub Berechnen W = Z + E 'Addition Gosub Ausgabe 'Berechnen von E und Z If T2 = 0 Then Gosub Berechnen W = Z - E 'Subtraktion
Gosub Ausgabe If T3 = 0 Then Portd = 0 Portb.4 = 0 Portb.5 = 0 Portb.6 = 0 Portb.7 = 0 W = 0 'Clear If W <= 0 Then Portd = 0 ' bringt auch die BCD-Ziffern auf 0, da Portd.5 und.6 0 sind Portb.4 = 0 Portb.5 = 0 Portb.6 = 0 Portb.7 = 0 'der Anschluss für T3 darf nicht dauerhaft 0 sein! 'denn sonst läuft der Rechner nicht und es wird dauerhaft 0 angezeigt Loop End 'es folgen die Unterprogramme-------------------------------------------------- Berechnen: E = 0 'PortB ist der rechte Wert = Zahl = E; Input an PortB 0...3 'Wandlung der Datentypen: Byte=Port; Nibble nach Integer! 'Bildung des Intergerwertes durch Abfrage der Pins
If Pinb.0 = 0 Then E = 0 If Pinb.0 = 1 Then E = 1 'PortC ist der rechte Wert = Einer If Pinb.1 = 1 Then E = E + 2 If Pinb.2 = 1 Then E = E + 4 If Pinb.3 = 1 Then E = E + 8 'E ist maximal 15 '--------------------------------------------------------------------------- Z = 0 'Zehnerstelle linke Anzeige der 4 LEDs; Input an PortC 0...3 'Z = PortC If Pinc.0 = 0 Then Z = 0 If Pinc.0 = 1 Then Z = 1 'PortC ist der linke Wert = Zehner If Pinc.1 = 1 Then Z = Z + 2 If Pinc.2 = 1 Then Z = Z + 4
If Pinc.3 = 1 Then Z = Z + 8 ' Z ist maximal 15 'Werteeinlesen abgeschlossen; jetzt LEDs und Ziffern ausgeben Return '------------------------------------------------------------------- 'hier erfolgt die Ausgabe 'der Wert der Berechnung wird auch durch die 5 LEDs angezeigt 'zurechtbasteln für die BCD-Ziffern 'die Bits 5 und 6 vom Port D werden für die BCD-Zehneranzeige verwendet, 'die Ausgabe-LEDs sind daran nicht angeschlossen! Ausgabe: 'Die Pins von PortB (oberes Nibble) werden für die BCD-Ausgabe der Einerziffer 'verwendet 'BB4 = A 'PB5 = B 'PB6 = C 'PB7 = D Portd.5 = 0 Portd.6 = 0 'Bit A 'Bit B für die Zehnerziffern 'es folgen die BCD-Codes für die Einerziffer Portb.4 = 0 Portb.5 = 0 Portb.6 = 0 Portb.7 = 0 If W = 0 Then Portb.4 = 0
Portb.5 = 0 Portb.6 = 0 Portb.7 = 0 If W = 1 Then If W = 2 Then If W = 3 Then If W = 4 Then If W = 5 Then If W = 6 Then If W = 7 Then If W = 8 Then Portb.7 = 1 If W = 9 Then
Portb.7 = 1 If W = 10 Then 'die A,B,C und D für die Einerziffer wurden ' ganz oben auf 0 gesetzt! If W = 11 Then If W = 12 Then If W = 13 Then If W = 14 Then If W = 15 Then If W = 16 Then
If W = 17 Then If W = 18 Then Portb.7 = 1 If W = 19 Then Portb.7 = 1 If W = 20 Then 'die 2 an der Zehnerziffer If W = 21 Then If W = 22 Then If W = 23 Then
If W = 24 Then If W = 25 Then If W = 26 Then If W = 27 Then If W = 28 Then Portb.7 = 1 If W = 29 Then
Portb.7 = 1 If W = 30 Then '30wird angezeigt 'die Summe der beiden Zahlen kann nie grösser als 30 werden! 'bei allen anderen Werten bleiben die Ports = 0 '--------------------------------------------------------------------------- 'Binaer-Ausgabe 'zunächst alle LEDs dunkel schalten; PORTD ist auf Output gesetzt Portd.4 = 0 If W = 1 Then If W = 2 Then If W = 3 Then If W = 4 Then
If W = 5 Then If W = 6 Then If W = 7 Then If W = 8 Then If W = 9 Then If W = 10 Then If W = 11 Then If W = 12 Then
If W = 13 Then If W = 14 Then If W = 15 Then If W = 16 Then If W = 17 Then
If W = 18 Then If W = 19 Then If W = 20 Then If W = 21 Then If W = 22 Then
If W = 23 Then If W = 24 Then If W = 25 Then If W = 26 Then If W = 27 Then
If W = 28 Then If W = 29 Then If W = 30 Then If W = 31 Then Return '====================================================================== ======