PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dezimalzahl in ihre Ziffern zerteilen



IchKG
04.05.2008, 15:45
Hallo
Ich muss für die ausgabe einer dezimalzahl an einer 7seg. Anzeige eine Variable mit dem nahmen Zahl die einen wert von 0-255 hat in ihre 3 ziffern zerlegen und in den variablen zein zzwei zdrei speichern nur weiß ich nicht wie ich die zahl zerlegen kann. ich benutzte einen PIC16F690

mfG
IchKG

PICture
04.05.2008, 16:08
Hallo IchKG!

Aus deiner Beschreibung vermute ich, dass deine Variable "Zahl" eine 8-bit hexadezimal (binär) Zahl ist. Die musst du zuerst in eine dezimale Zahl umwandeln und erst danach die 3-stellige Dezimalzahl ausgeben. Über hexadezimal zu dezimal Wandlung sind schon mehrere Beiträge in diesem Forum zu finden.

MfG

PicNick
04.05.2008, 16:18
Wenn es mit dividieren nix is, kannst du:

zein = wie oft kann ich 100 abziehen

zzwei = wie oft kann ich (vom Rest) 10 abziehen

zdrei = Rest

IchKG
04.05.2008, 16:21
so versuch ichs mal PicNICK

PICture
04.05.2008, 16:37
Du kannst dir auch das anschauen:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=37867&highlight=hex+wandlung

MfG

IchKG
04.05.2008, 17:12
Du kannst dir auch das anschauen:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=37867&highlight=hex+wandlung

MfG

ich will keine hex umwandlung machen sondern so wie das PICNick geschrieben hat
einfach nur eine Dezimalzahl in ihre stellen zerteilen

PICture
04.05.2008, 17:22
Sorry, dann vergiss, bitte, meine Aussagen! :)

MfG

PICVB
04.05.2008, 17:43
Hey,
also ich mache es mit zwei Unterprogrammen:

1. Zerlegen in 3 Dezimalzahlen


; ----------------------------------------------------------------
; Variablen im RAM
; ----------------------------------------------------------------
cblock
bcdE ; Einerstellen
bcdZ ; Zehnerstellen
bcdH ; Hunderterstellen
endc

; ----------------------------------------------------------------
; Funktion zum Wandeln einer 8 Bit Binaerzahl in 3 Stellen bcd
; Uebergabe ist w Register
; Ergebnisse in bcdE, bcdZ, bcdH
; ----------------------------------------------------------------
binbcd: clrf bcdH ; bcdH loeschen
clrf bcdZ ; bcdZ loeschen
movwf bcdE ; w nach bcdE
bcd1: movlw 0x0a ; lade w mit 10
subwf bcdE,w ; bcdE - 10 in w
btfss STATUS,C ; bcdE < 10 ?
goto bcd2 ; ja -> bcd2
movwf bcdE ; nein -> bcdE - 10
incf bcdZ,f ; bcdZ + 1
movlw 0x0a ; lade w mit 10
subwf bcdZ,w ; bcdZ - 10 in w
btfss STATUS,C ; bcdZ = 10 ?
goto bcd1 ; nein -> bcd1
clrf bcdZ ; ja -> bcdZ = 0
incf bcdH,f ; bcdH + 1
goto bcd1 ; gehe zu bcd1

bcd2: return


2. Umwandeln in 7-Segment Code


;************************************************* ************************************************** *********************************
; Tabelle der Siebensegmentcodes von 0 bis 9 an RB1...RB7
;************************************************* ************************************************** *********************************
tab addwf PCL,1 ; Addiert W und PCL. Ergebnis steht in PCL,was Sprung zum entsprechenden Ausgabewert ergibt
retlw 0x7E ; 0
retlw 0xC ; 1
retlw 0xB6 ; 2
retlw 0x9E ; 3
retlw 0xCC ; 4
retlw 0xDA ; 5
retlw 0xFA ; 6
retlw 0xE ; 7
retlw 0xFE ; 8
retlw 0xDE ; 9



Hoffe es hilft dir.

Gruß Carsten

IchKG
04.05.2008, 19:19
danke carsten genau sowas hab ich gesucht
mfG

PICVB
04.05.2008, 22:09
Dacht ich mir, deswegen habe ich es gepostet. Ich habe es damals wo ich es gesucht habe über google gefunden bzw. selbst erstellt. Also den ersten Code findest du in Google unter der bezeichnung binbcd Wandlung und den zweiten habe ich selbst erstellt.

IchKG
05.05.2008, 20:24
subwf bcdZ,w ; bcdZ - 10 in w
btfss STATUS,C ; bcdZ = 10 ?
goto bcd1 ; nein -> bcd1

in Komentar steht = 10? du überprüfst hier ja das C bit aber für einen == Vergleich muss man ja das Z bit prüfen

PICVB
05.05.2008, 20:32
Das Z-Bit überprüfst du bei einem Vergleich von =0 .
Ich habe diesen Code nicht geschrieben, sondern einfach übernommen.

IchKG
05.05.2008, 20:47
ja eh
du willst prüfen ob die variable = 10 ist
indem du variable-10 rechnest und wen das dan 0 ergiebt also das Z bit gesetzt ist das stimmt die aussage = 10