Gast
#325590
Hallo!
Zuerst einmal muss ich sagen was ich habe:
Ich habe ein Mikrocontroller System mit einen 12Mhz Mikrocntroller.
Die Ausgabe der Stoppuhr erfolgt auf der BCD-7-Segment Anzeige (welche
an Port 1 und 2 des Mikrocontrollers angeschlossen ist). Außerdem ist
eine Schalterplatine an Port 0 angeschlossen für Zusatzfunktionen.
Ich habe mittlerweile mit meinen Basis Kenntnissen folgendes Programm
programmiert:
---------------------------------------------------
$include (reg52.inc)
Minutentaster bit P0.0
Stundentaster bit P0.1
org 0000h
LJMP start
;Einsprungadresse Interrupt-Serviceroutine für Timer 0
org 000Bh
LJMP isrTimer0
org 0100h
start: CALL initRegister
CALL initTimer0
loop: LJMP loop ;Endlosschleife
initRegister:
MOV R0,#0 ;bestimmt welche der Anzeigen aktiv ist
MOV R1,#0 ;Zähler von o bis 249 -->4ms*250 = 1 Sec
MOV R2,#0 ;Sekunden Einer
MOV R3,#0 ;Sekunden Zehner
MOV R4,#0 ;für Segment rechts Minuten Einer
MOV R5,#0 ;für Segment Mitte rechts Minuten Zehner
MOV R6,#0 ;für Segment Mitte links Stunden Einer
MOV R7,#0 ;für Segment links Stunden Zehner
RET
initTimer0:
SETB ET0 ;Freigabe Timer0. Bit im Reg IE, Reg.-Adresse
A8h
SETB EA ;Globale INT Freigabe. Bit im Reg IE
MOV TMOD,#00000001b ;Timer0 konfiguieren, Modus1: 16bit Zaehler
MOV TL0,#060h ;Timer0 vorladen
MOV TH0,#0F0h ;65536 - 4000 = 61536 = F060h (4ms)
SETB TR0 ;Start Timer0
RET
;Interrupt-Service-Routine für Timer0
isrTimer0:
MOV TL0,#060h ;Timer0 erneut vorladen
MOV TH0,#0F0h ;65536 - 4000 = 61536 = F060h (4ms)
CALL neueUhrzeit ;neue Uhrzeit berechnen
CALL ausgabe ;Ausgabe auf Anzeige
RETI ;Ende der Interrupt-Service-Routine
neueUhrzeit:
INC R1 ; erhoehe Register 1
CJNE R1,#250d,weiter ;Springe nach weiter wenn der Inhalt
von R1 ungleich 250d ist
MOV R1,#0d ;Lade Register 1 mit dem Wert 0
JB Minutentaster,mSek ;Springe nach mSek wenn Sektaster 1
ist
JB Stundentaster,mMin ;Springe nach mMin wenn Mintaster 1
ist
INC R2 ; erhoehe Register 2
CJNE R2,#10d,weiter ;Springe nach weiter wenn der Inhalt
von
R2 ungleich 10d ist
MOV R2,#0d ;Lade Register 2 mit dem Wert 0
INC R3 ; erhoehe Register 3
CJNE R3,#10d,weiter ;Springe nach weiter wenn der Inhalt
von
R3 ungleich 10d ist
MOV R3,#0d ;Lade Register 3 mit dem Wert 0
mSek: INC R4 ; erhoehe Register 4
CJNE R4,#10d,weiter ;Springe nach weiter wenn der Inhalt
von
R4 ungleich 10d ist
MOV R4,#0d ;Lade Register 4 mit dem Wert 0
INC R5 ; erhoehe Register 5
CJNE R5,#06d,weiter ;Springe nach weiter wenn der Inhalt
von
R5 ungleich 10d ist
MOV R5,#0d ;Lade Register 5 mit dem Wert 0
mMin: INC R6 ; erhoehe Register 6
CJNE R6,#6d,m2 ;Springe nach m2 wenn der Inhalt von R6
ungleich 6d ist
CJNE R7,#10d,m2 ;Springe nach m2 wenn der Inhalt von R7
ungleich 0d ist
MOV R6,#0 ;Lade Register 6 mit dem Wert 0
MOV R7,#0 ;Lade Register 7 mit dem Wert 0
m2: CJNE R6,#10,weiter ;Springe nach weiter wenn der Inhalt
von
R6 ungleich 10 ist
MOV R6,#9 ;Lade Register 6 mit dem Wert 9
INC R7 ; erhoehe Register 7
LJMP weiter ;aufrufen von weiter
weiter: RET ;Rücksprung aus dem Unterprogramm
ausgabe: INC R0
CJNE R0,#04,rechts
MOV R0,#0
rechts: CJNE R0,#0,mire
MOV A,R4
CALL BCD7Seg
MOV P1,A
MOV P2,#00001110b
mire: CJNE R0,#1,mili
MOV A,R5
CALL BCD7Seg
MOV P1,A
MOV P2,#00001101b
mili: CJNE R0,#2,links
MOV A,R6
CALL BCD7Seg
MOV P1,A
MOV P2,#00001011b
links: CJNE R0,#3,m1
MOV A,R7
CALL BCD7Seg
MOV P1,A
MOV P2,#00000111b
m1: RET
;; Wandelt vom BCD-Code in den 7-Segment-Code
BCD7Seg: INC A
MOVC A,@A+PC
RET
DB 3Fh, 06h, 5Bh, 4Fh, 66h, 6Dh, 7Dh, 07h, 7Fh, 6Fh
END
---------------------------------------------------------
Das Programm funktioniert soweit auch einwandfrei....
Ich möchte jetzt nur die Anzeige etwas umwandeln. Die Anzeige soll um
ein Segment nach Rechts gerückt werden, das würde bedeuten:
Segment Rechts: Hundertstel Zehner
Segment Mitte Rechts: Sekunden Einer
Segment Mitte Links: Sekunden Zehner
Segment Links: Minuten
Ich weiß nicht ob ich irgendwie gerade voll auf dem Schlauch stehe oder
was los ist, aber egal was ich tue es funktioniert nicht!
Achso und was ich noch Programmieren möchte ist ein Reset, vielleicht
hat jemand von euch hierfür auch einen Vorschlag?
Ich bin wirklich Anfänger mit Assembler und fände es gut wenn das
Programm weiterhin so verständlich bleibt wie mein jetziges.
Vielen Dank schoneinmal im Voraus für die schnelle Antwort!