Forum

Einloggen | Registrieren | RSS  

BCD to 7-Segment Decoder (Elektronik)

verfasst von cterm(R), 19.05.2008, 11:20 Uhr

»
» ----
» hi,
» da wäre ein Vorschlag mit einer Uhr, mit Atmel:
» http://atmel.com/dyn/resources/prod_documents/doc1231.pdf
»
» Die Tasten und Anzeige werden gemultiplexed.
» Für eine Hex- A-F Anzeige musst die Routine entspechend ändern. Die
» LED-Anzeige wäre auch zu tauschen.
» Im Prinzip wäre der Aufbau vielleicht mit deiner Anwendung ähnlich.
»
» gruss
» Gerald

Hmm, gemultiplextes Display und 4 x 4 Keyboard, trickreich die Portpins der 7-Segment-Anzeigen für das Keypad mitzubenutzen. Aber wenn er wirklich nur einen IC-Ersatz für einen BCD-zu-7-Segment(Hex)-Dekodierer sucht ist das Overkill, da würde ich wirklich nur den 7-Segment-"Zeichensatz" von 0-10 und A-F in eine Lookuptable (16 Bytes) schreiben und dann in einer Endlosschleife die Eingangsportpins abfragen und immer das zu einer BCD-Zahl zugehörige Segmentmuster aus der Tabelle auslesen und ausgeben.
Auf http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige, gibts dazu auch Beispiele.

Hier meine vereinfachte und auf 16 Ziffern erweiterte Version, für den ATMega16, (der war halt gerade im Board):

BCD-zu-7-Segment(Hex)-Dekoder:

;***************************************************
.cseg
.org 0x0000
L0000:
rjmp Start
reti

Start:
ldi r16,0x04
out 0x3E,r16
ldi r16,0x5F
out 0x3D,r16
ldi r16,0xFF
out 0x17,r16
ldi r16,0xFF
out 0x18,r16
clr r16
out 0x1A,r16
ldi r16,0x00
mov r1,r16
Loop1:
ldi r30,0x30
ldi r31,0x00
in r17,0x19
com r17
add r30,r17
adc r31,r1
lpm r19,Z
com r19
out 0x18,r19
rjmp Loop1

.db 0b00111111, 0b00000110
.db 0b01011011, 0b01001111
.db 0b01100110, 0b01101101
.db 0b01111101, 0b00000111
.db 0b01111111, 0b01101111
.db 0b01110111, 0b01111100
.db 0b00111001, 0b01011110

;***************************************************



;Und hier noch mal mit ausführlicher Dokumentation:

;***************************************************
.include "m16def.inc"

.ORG $000 ;RESET External Pin, Power-on Reset, Brown-out, Reset, Watchdog Reset, and JTAG AVR Reset
rjmp Start ;Springe nach einem Reset oder Stromausfall wieder zu Start:
reti

Start:
;Stack initialisieren
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,low(RAMEND)
out SPL,r16


ser r16 ;setze alle Bits in r16
out DDRB,r16 ;PortB als Ausgang

ldi r16,0xff ;lade r16 mit 0xff = 255
out PORTB,r16 ;gebe den Inhalt von r16 über PortB aus->Alle Segmente aus

clr r16 ;lösche alle Bits in r16
out DDRA,r16 ;PortA als Eingang

ldi r16,0 ;lade r16 mit 0
;r1 ist ein "Billigregister" und kann nicht direkt geladen werden
mov r1,r16 ;kopiere die 0 aus r16 nach r1

InfiniteLoop:

;Pointer Z auf Led7SegLookuptable Startadresse Led7SegLookuptable setzen
;(*2 weil der Assembler die Startadresse von Led7SegLookuptable im Flashspeicher
;in WORDs angibt und Pointer Z eine Angabe in BYTES benötigt)
ldi ZL,LOW(Led7SegLookuptable*2)
ldi ZH,HIGH(Led7SegLookuptable*2)

in r17,PINA ;Eingang lesen (BCD)
com r17 ;Eingang invertieren (nötig für Stk500-Board Taster)

;Eingangswert zu Pointer Z (Lowbyte) addieren
add ZL,r17
;möglichen Übertrag der vorherigen Addition zu Z (Highbyte) addieren
;r1 ist 0, es wird also nur der Übertrag addiert
;(ja so sind sie halt die RISC-CPUs, da reichts nicht mal für ne extra Null)
adc ZH,r1

;In Pointer Z steht jetzt die Startadresse der Led7SegLookuptable + der BCD-Wert
;der vom Eingang gelesen wurde
lpm r19,z ;kopiere einen Eintrag aus der Lookuptable nach r19
;invertiere r19 (nötig für die Open-Kollektor Ausgänge, geschaltet wird mit Low)
com r19

out PORTB,r19 ;gebe den Inhalt von r16 über PortB aus

rjmp InfiniteLoop ;springe wieder zum Anfang der Endlosschleife


Led7SegLookuptable:

; 0:XXfedcba 1:XXXXXcbX
.db 0b00111111, 0b00000110

; 2:XgXedXba 3:XgXXdcba
.db 0b01011011, 0b01001111

; 4:XgfXXcbX, 5:XgfXdcXa
.db 0b01100110, 0b01101101

; 6:XgfedcXa 7:XXXXXcba
.db 0b01111101, 0b00000111

; 8:Xgfedcba 9:XgfXdcba
.db 0b01111111, 0b01101111

; A:XgfeXcba b:XgfedcXX
.db 0b01110111, 0b01111100

; C:XXfedXXa d:XgXedcbX
.db 0b00111001, 0b01011110

; E:XgfedXXa, F:XgfeXXXa
.db 0b01111001, 0b01110001



;***************************************************



Gesamter Thread:

BCD to 7-Segment Decoder - Winkler Thomas(R), 17.05.2008, 16:33 (Elektronik)
BCD to 7-Segment Decoder - heinlöt, 17.05.2008, 17:05
BCD to 7-Segment Decoder - x y, 17.05.2008, 17:06
BCD to 7-Segment Decoder - Björn(R), 17.05.2008, 19:02
BCD to 7-Segment Decoder - cterm(R), 18.05.2008, 14:30
BCD to 7-Segment Decoder - geralds(R), 18.05.2008, 14:36
BCD to 7-Segment Decoder - cterm(R), 18.05.2008, 15:16
BCD to 7-Segment Decoder - geralds(R), 18.05.2008, 16:09
BCD to 7-Segment Decoder - cterm(R), 19.05.2008, 11:20
BCD to 7-Segment Decoder - geralds(R), 19.05.2008, 21:39
BCD to 7-Segment Decoder - cterm(R), 20.05.2008, 15:53
BCD to 7-Segment Decoder - erikl(R), 19.05.2008, 19:17
BCD to 7-Segment Decoder - Winkler Thomas(R), 21.05.2008, 20:15
BCD to 7-Segment Decoder - geralds(R), 21.05.2008, 20:32