Zähler von 00 bis 99 in Assembler
Grundsätzlich meine Aufgabe ist es, den counter auf einer micro-controller-board count von 00-99 kontinuierlich mit Assembler.
weil es nicht möglich ist, zeigen zwei 7-Seg-Anzeige in der gleichen Zeit, meine Lösung ist die Darstellung der tens(0), Anzeige(0), Anzeige tens(0), Anzeige(1), Zehner - (0), Anzeige(2), tens(0), display(3), etc. mein Ansatz, dies zu tun ist, um zwei Schleifen (eine für die Zehner-Ziffer, eine für diejenigen-stellig) das geht über ein array. einmal diejenigen stellige loop Durchlaufen haben, das gesamte array, die Schleife bricht und geht zurück auf die Zehner-Ziffer Schleife, bewegen Sie die zehnerstellen zum nächsten element, und dann zurück zu denen stellige loop
MSB_Display equ $0B ; display on 'tens' digit/second most right of 7-Seg
LSB_Display equ $07 ; display on 'ones' digit/most right of 7-Seg
D_1MS equ 24000 /6
DelayVal equ 35 ; 35 ms delay simulates both Hex Displays on at once
org $1000
; Lookup table for LED segments
array db $3F,$06,$5B,$4F,$66,$6D,$7C,$07,$7F,$6F
; 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
; Memory Reserved for Delay Routine
DCount ds 1
Counter ds 1
countones db 0
counttens db 0
org $2000 ; Program starts here
lds #$2000 ; Initalize the stack
; Configure Hardware
ldaa #$FF
staa DDRB ; Make PORTB output
staa DDRP ; PTP as Output
start
clr countones ; clear count back to 0
clr counttens
ldx #array
MSB
ldaa 1,x+
staa PORTB
ldaa #MSB_Display
staa PTP ; turn off 7-segment display
bsr Delay_ms
inc counttens
ldaa counttens
cmpa #10
bne LSB
LSB
ldy #array
ldab 1,y+
stab PORTB
ldab #LSB_Display
stab PTP
bsr Delay_ms
inc countones
ldaa countones
cmpa #10
bne LSB
bra MSB
Delay_ms
psha
pshy
ldaa #DelayVal ; Number of msec to delay
staa DCount ; store delay counter
ldaa DCount ; delay Dcount ms
staa Counter
Delay1 ldy #D_1MS ; 6000 x 4 = 24,000 cycles = 1ms
Delay2 dey ; this instruction takes 1 cycle
bne Delay2 ; this instruction takes 3 cycles
dec Counter
bne Delay1 ; not Dcount ms yet, delay again
pula ; Restore contents of ACC A before returning
puly
rts
end
jetzt scheint es, wie das Programm in der diejenigen stellige loop (LSB) und sitzt da, es nicht zu beenden, dass die Schleife noch gibt es reloop selbst. Ich kann nicht scheinen, um herauszufinden, was falsch in der Logik meines Programms
...Ich bin ein Alter timer, das sieht aus wie eine 6800 cpu, aber ich glaube nicht, dass der ldab 1,x+' - Anweisung. Was tut es? (Ich denke an pshy dey puly problemlos).
die hardware weiß zu Leuchten, durch diese beiden Linien MSB_Display equ $0B LSB_Display equ $07 LSB macht es wählen in der rechten 7-seg, MSB ermöglicht es, wählen Sie die 2. rechts die meisten 7-seg ldab 1,x+ im Grunde macht es Durchlaufen das array/look-up-Tabelle
welcher Prozessor ist das?
Sie schob dann y in der delay-Funktion, aber nach dem Ausgang zog dann ein y, ist, dass ein Prozessor bestimmte Sache oder sind die in Ordnung?
InformationsquelleAutor livelaughlove | 2011-12-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ziehen vom Stapel getan werden sollte, in umgekehrter Reihenfolge ab, auf Stapel.
Als Ira wies darauf hin, Sie habe Ihre Zähler Durcheinander...
Sollten Sie denken, 'Anzeige zweistellige Zahl" als ein separates Ding aus der Erhöhung einige Zähler in einer Schleife.
Die Anzeige ist simple switching "aktiv" - Ausgang mit einer Verzögerungszeit und Einstellung korrigieren-stellige Wert für jedes display-Zyklus.
Hier ist ein Weg, dies zu tun (anpassen der delay-Wert - 35ms sieht zu schnell...):
Wäre es sogar besser, den Anzeige-code in eine separate routine und wechseln der aktiven Anzeige mehr als einmal pro Zähler erhöhen. Das könnte eine schöne übung für Euch 🙂
InformationsquelleAutor PopMilo