
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
Hallo, ich habe das Display ursprünglich für meinen Robby RP5 angeschafft und programmiert um Sensorwerte einafch darstellen zu können. Der Robby ist ja nichts anderes als eine C-Control 1 mit einem Subsystem für die Sensoren. Daher läuft der Code auch auf jeder C-Control. Ich ahbe hier eine BeispielCode für eine Uhr hinzugefügt. Die Ansteuerung des TMS1637 (gibt es mit 2 4 oder auch 6 Digits) erfolgt in Assembler. In reinem Basic hatte ich etwas Probleme, sodass ich dann auf Assembler umgestiegen bin. Den Code habe ich dokumentiert, sodass keien Fragen offen bleiben sollten. Ansonsten einfach eine Email senden. Die Ansteuerung ist ganz ähnlich eines i2C Busses allerdings ohne Adressierung und ACK bzw. NACK. Ein ausführliches Datenblatt ist im Internet zu finden. Der TMS kann noch mehr: eine Tastenmatrix abfragen. Das habe ich allerdings nicht implementiert. Wenn es jemanden interessiert baue ich das ein. Hier mein Versuchsaufbau: ![]() CCbasic Code: '*********************************************************** ' ' ' C-Control/basic TMS1637.BAS ' ' Ausgabe / Steuerung 7-Segment Anzeige mit TMS1637 ' benötigt Assemblerfile TMS1637.asm ' 2 Einsprungsadressen: ' sys &H101 : Display löshcne , Bus initialisieren ' sys &H012b : Zeichen schreiben ' Der TMS1637 hängt an Port B Pin 1,2 (Assembler 0,1) ' 3 Byte Register werden vom Assembler genutzt ' char: Das Zeichen, eine Position aus der LookupTabelle 0-9, A-F ' Es sind auch andere Zeichen möglich, dazu in das Datenblatt des TMS1637 schauen ' position: Postition auf dem Display 1-4 ' Brightness: steuert die Helligkeit 0-8, default 3 ' point: 0 oder 1 steuert ob der Doppelpunkt oder der Punkt je nach Ausfühtrung ' gezeigt wird, default 0 ' Hier im Beispiel ist ein Uhr realisiert, die über DCF-77 snchronisiert wird ' ' '*********************************************************** define char byte ' Kommandos, Steuerbytes und Zeichen aus Lookup Tabelle define position byte ' Positiona auf dem Display define brightness byte ' Helligkeit define point byte ' Punkt anzeigen define daten byte ' Hilfsregister define countMinute byte ' Hilfsregister für das Update der Anzeige hour = 0 ' default init minute = 0 ' default init sys &H101 ' Initialisieren und alle Zeichen löschen point = 1 ' Punkt an brightness = 0 ' Helligkeit setzen 0...7, default 3 countMinute = minute ' Testregister initialisieren #Loop ' Schleife position = 1 ' erste Position daten = hour / 10 ' Pointer für Tabelle vorbereiten looktab zeichen, daten, char ' Zeichen laden aus Mapping Tabelle HEX 0..F Löschen mit 0 sys &H012b ' Zeichen schreiben position = 2 ' zweite Position daten = hour mod 10 ' Pointer für Tabelle vorbereiten looktab zeichen, daten, char sys &H012b ' Einsprung für Assembler Routine writChar daten = minute / 10 position = 3 ' Position bestimmen looktab zeichen, daten, char sys &H012b daten = minute mod 10 looktab zeichen, daten, char position = 4 sys &H012b #loop2 if countMinute = minute then goto loop2 ' Update Display, nur wenn sich die Minute ändert countMinute = minute goto Loop ' zurück zur Loop end syscode "tms1637.s19" ' nur einmal laden, dann auskommentieren table zeichen &H3f &H06 &H5b &H4f ' Lookup Tabelle für die zeichenkodierung 0-9, A-F entspricht 0-15 &H66 &H6d &H7d &H07 &H7f &H6f &H77 &H7c &H39 &H5e &H79 &H71 tabend Assembler Code: ;*********************************************************** ; ; M6805 Assembler TMS1637.ASM ; Processor 4Mhz ; Control TMS1637 display driver ; Uses 3 byte of user variables starting at $A1 ; Returns nothing ; $A1 returns char ; $A2 returns postion ; $A3 returns brightness ; $A4 point toggle point ; ;*********************************************************** ; definitions portb equ 1 ; port b register pbdir equ 5 ; port b direction register CLK equ 0 ; PIN CLK Port B,0 (Basic 1) DIO equ 1 ; PIN DIO Port B,1 (Basic 2) ; user variables char equ $A1 ; uservariable char position equ $A2 ; uservariable position brightness equ $A3 ; uservariable brightness point equ $A4 ; uservariable point org $101 initTMS1637: bset CLK,pbdir ; PIN CLK direction Output bclr CLK, portb ; port high bset DIO,pbdir ; PIN DIO direction Output bclr DIO, portb ; DIO low jsr clrScr ; clear display rts ; return to basic clrScr: clra ; clear accu sta char ; clear char sta point ; clear point sta position ; clear position inc position ; position 1 in basic is 0 in assembler jsr writeChar ; write 0 to position 1 inc position ; next position jsr writeChar ; write 0 to position 2 inc position ; next position jsr writeChar ; write 0 to position 3 sta brightness ; stor3 3 to brightness = default inc position ; next position jsr writeChar ; write 0 to position 4 rts ; return to basic writeChar: clra ; clear accu cmp point ; is point 0? beq outputChar ; yes branch to output lda char ; no, load char to accu add #$80 ; add 0x80 to char sta char ; store to char outputChar: sei ; disable interrupt jsr display ; call display => output char cli ; enable interrupt rts ; return to basic display: lda #$44 ; load accu with constant 0x44 see TMS1637 doc jsr start_seq ; call start seq jsr writeByte ; output 8 bits lda position ; get postion deca ; dec postion, in basic 1 is 0 in assembler ora #$c0 ; or postion with constant 0xc0 see TMS1637 doc jsr stop_seq ; call stop seq jsr start_seq ; call start seq jsr writeByte ; output 8 bits lda char ; get char jsr writeByte ; output 8 bits lda #$88 ; load accu with conatant 0x88 see TMS1637 doc add brightness ; add accu with brightness jsr stop_seq ; call stop seq jsr start_seq ; call start seq jsr writeByte ; output 8 bits jsr stop_seq ; call stop seq rts ; return to basic writeByte: ldx #8 ; load x with constant 8, count of bits per databyte = 8 nextBitOut: bclr CLK, portb ; pull CLK down to low, init data transfer rora ; byte is in accu, rotate right through carry bcs highBit ; bit was 1? we have a 1 branch to highbit bclr DIO, portb ; pull DIO down Bit is 0 jmp goOn ; next bit highBit: bset DIO, portb ; pull DIO up Bit is 1 goOn: bset CLK, portb ; pull CLK high decx ; dec bit counter bne nextBitOut ; all bits done? no then branch to nextBitout bclr CLK, portb ; all bits send end seq, pull CLK down bset DIO, portb ; pull DIO high bset CLK, portb ; pull CLK high bclr DIO,pbdir ; PIN DIO input (add some nops here, check DIO for HIGH set from TMS1637) bset DIO,pbdir ; PIN DIO output rts ; return start_seq: bset CLK, portb ; pull CLK high bset DIO, portb ; pull DIO high bclr DIO, portb ; pull DIO low bclr CLK, portb ; pull CLK low rts ; return stop_seq: bclr CLK, portb ; pull CLK low bclr DIO, portb ; pull DIO low bset CLK, portb ; pull CLK high bset DIO, portb ; pull DIO high rts ; return |
| Antwort schreiben |