More than two decades ago Nokia created their first digital satellite receivers. People were willing to pay handsomely for those machines back then. That's why Nokia could afford to put a relatively expensive display in their DVB-9200, DVB-9500 and DVB-9600 receivers.
The Siemens SDA5708-24 display is a beautiful 8 character 7x5 dot matrix LED display with bright green light.
Its serial interface can control every individual LED of the display, which allows any desirable dot pattern to be displayed.
Needless to say that this is quite a nice display to be used in many a hobby project.
If only you know how to control it........
Well, here is the description.
SDA5708-24 Rear view (not to any scale)
Pin 1 is connected to the Vcc supply (+5V).
The Load pin is an active low input used to enable data transfer into the display.
When Load is low, data is clocked into the 8 bit serial data register.
When Load goes high, the contents of the 8 bit serial data register are evaluated by the display controller.
While Load remains high the Data and SDCLK pins may be used to control other serial devices on the same bus.
The Data pin holds the bits to be clocked into the serial data register whenever the SDCLK line goes high. The least significant bit D0 is loaded first.
SDCLK is the serial clock line.
Data is accepted by the display's serial data register when the SDCLK line goes high.
The Load pin must be low for the serial data register to accept any data.
The minimum clock period is 200ns.
Setup time, the time between a stable Data line and a rising SDCLK signal, should be a minimum of 50ns.
When the Reset pin is held low, the display will be reset.
The multiplex counter, the address register, the control word and the display bit patterns are all cleared.
This means that the display will be blank and the display is set to 100% brightness and maximum peak current.
During normal operation the Reset pin is only made low for a short period when power is applied to the circuit and is left at high level from then on.
This is simply the ground connection.
Typical waveform of serial input signals
PS: For what it's worth, the connector to be used to plug into the back of the display is a Molex type 51065-0600. The complete wire should be known as Molex part number SM1277.
The SDA5708 is controlled by sending a series of bytes to it. All these bytes are written in registers. Three different types of registers are defined:
The Control register is used to set general display properties.
The Control register is addressed whenever the two most significant bits of a byte are both "1".
Writing a "0" to D5 will erase the entire display at once. You'll have to write "1" to D5 in order to use the display normally.
The bits D4 to D0 control the brightness of the LEDs. It is best to experiment with the possible settings to get the result you like best.
The Address register selects one of the 8 digits to be written to.
After writing a value to the Address register all subsequent Column Data is written to that particular digit.
Writing to the Address register also resets the Column Data pointer (see below).
The Address register is selected whenever D7 and D5 of the byte are "1" and D6 is "0".
The Column Data register is used to write the actual bit patterns to the display RAM. Writing starts at the top row of the digit (after writing to the Address register). The whole digit is transferred by writing 7 bytes to the Column Data register.
The Column Data register is selected by leaving the three most significant bits of the byte "0". All other bits are treated as bit pattern for a single display row as indicated by the diagram on the left.
Below you'll find a sample program written for my 6802 Nano Computer.
Needless to say that the program was written using my SB-Assembler, which is free B.T.W.
I think the program should explain itself.
;--------------------------------------------------------------------------- ; ; Demo program to interface with the SDA5708-24 alpha numeric display ; Designed to run on the 6802 Nano computer ; ; Author: San Bergmans ; www.sbprojects.net ; ;--------------------------------------------------------------------------- .CR 6800 .OR $F000 .TF SDA5708.S19,S19,32 ;--------------------------------------------------------------------------- ; Declarations ;--------------------------------------------------------------------------- PIA_A .EQ $80 PIA Port A data register PIA_B .EQ $81 PIA Port B data register CON_A .EQ $82 PIA Port A control register CON_B .EQ $83 PIA Port B control register ; PIA_A.0 = Display's -Reset line Output ; PIA_A.1 = Display's -Load line Output ; PIA_A.2 = Display's Clock line Output ; PIA_A.3 = Display's Data line Output TEMP .EQ $00,$01 Used as temporary data register SHIFT_DATA .EQ $00 Data to be shifted out BIT_COUNT .EQ $01 Data bit counter SAVE_X .EQ $02,$03 Location to save the X register CURSOR .EQ $04 Character pointer (0..7) SDA_BRIGHT .EQ %1110.0000 Control word value for brightness ;--------------------------------------------------------------------------- ; ROUTINE : RESET ; FUNCTION : Get started ;--------------------------------------------------------------------------- RESET LDS #$007F Initialize the stack LDAA #%0000.0100 PIA_A bits 0..3 are going to be STAA CON_A outputs. But before we switch mode LDAB #%0000.1111 we must ensure that the data STAB PIA_A register holds 1's to avoid spikes CLRA Now it's save to switch from inputs STAA CON_A STAB PIA_A LDAA #%0000.0100 Finally select data register again STAA CON_A LDAA #%1111.1110 Send a -Reset signal to the display STAA PIA_A LDAA #%1111.1111 STAA PIA_A LDAA #SDA_BRIGHT Set preselected display brightness JSR WRITE_DSP CLRA Reset cursor to 0 STAA CURSOR ;--------------------------------------------------------------------------- ; ROUTINE : MAIN ; FUNCTION : Main program loop ;--------------------------------------------------------------------------- MAIN LDX #TEXT Load text pointer in index register LDAA 0,X Print 1st character JSR ASCII_2_DSP LDAA 1,X Print 2nd character JSR ASCII_2_DSP LDAA 2,X Print 3rd character JSR ASCII_2_DSP LDAA 3,X Print 4th character JSR ASCII_2_DSP LDAA 4,X Print 5th character JSR ASCII_2_DSP LDAA 5,X Print 6th character JSR ASCII_2_DSP LDAA 6,X Print 7th character JSR ASCII_2_DSP LDAA 7,X Print last character JSR ASCII_2_DSP .4EVER JMP .4EVER TEXT .AS "SDA-5708" This text is displayed! ;--------------------------------------------------------------------------- ; ROUTINE : WRITE_DSP ; FUNCTION : Write 8 bit data in A to display controller ;--------------------------------------------------------------------------- WRITE_DSP PSHA Save affected registers PSHB STAA SHIFT_DATA LDAB #8 Setup bit counter STAB BIT_COUNT LDAB PIA_A Get a copy of current PIA lines ANDB #%1111.1011 Make Clock line low STAB PIA_A ANDB #%1111.1101 Make LOAD line low STAB PIA_A .LOOP ORAB #%0000.1000 In case data must be high LSRA SHIFT_DATA Get data bit BCS .BIT_HIGH Data must be high! ANDB #%1111.0111 Make data bit low .BIT_HIGH STAB PIA_A ORAB #%0000.0100 Pulse clock line high/low STAB PIA_A ANDB #%1111.1011 STAB PIA_A DEC BIT_COUNT Do all bits BNE .LOOP ORAB #%0000.0010 Make LOAD line high again which STAB PIA_A copies shift register to display ORAB #%0000.1100 Finally make clock+data high STAB PIA_A PULB Restore affected registers PULA RTS ;--------------------------------------------------------------------------- ; ROUTINE : ASCII_2_DSP ; FUNCTION : Send ASCII to current digit ; A = ASCII character ; CURSOR = Digit to print to ; CURSOR is incremented afterwards (wraps to 0 after 7) ;--------------------------------------------------------------------------- ASCII_2_DSP PSHA Save affected registers PSHB STX SAVE_X TAB Save ASCII character in B LDAA CURSOR Setup display pointer ORAA #%1010.0000 Make it a digit selector JSR WRITE_DSP Send digit address to display SUBB #' ' Table starts at space, skipping the CLRA control characters STAB TEMP+1 Save Character-" " ASLB Each table entry is 7 bytes long ROLA so we must multiply the character ASLB by 7 before we can use it as index ROLA ASLB ROLA SUBB TEMP+1 We multiplied by 8 instead of 7, so SBCA #0 we'll have to subtract once ADDB #ASCII_TABLE Add ASCII table offset to the index ADCA /ASCII_TABLE STAA TEMP Then use it as an index STAB TEMP+1 LDX TEMP LDAB #7 Count the number of display rows .LOOP LDAA 0,X Get bit pattern JSR WRITE_DSP and write it to the display INX Increment table index DECB Decrement row pointer BNE .LOOP Continue until all rows are done LDAA CURSOR Increment the display's cursor INCA but limit range from 0 to 7 ANDA #%0000.0111 STAA CURSOR LDX SAVE_X Restore the affected registers PULB again PULA RTS ;--------------------------------------------------------------------------- ; ASCII TABLE ;--------------------------------------------------------------------------- ASCII_TABLE .DA #%00000 Space $20 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%00100 ! $21 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%00000 .DA #%00100 .DA #%01010 " $22 .DA #%01010 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%01010 # $23 .DA #%01010 .DA #%11111 .DA #%01010 .DA #%11111 .DA #%01010 .DA #%01010 .DA #%00100 $ $24 .DA #%01111 .DA #%10100 .DA #%01110 .DA #%00101 .DA #%11110 .DA #%00100 .DA #%11000 % $25 .DA #%11001 .DA #%00010 .DA #%00100 .DA #%01000 .DA #%10011 .DA #%00011 .DA #%00000 & $26 .DA #%01000 .DA #%10100 .DA #%01000 .DA #%10101 .DA #%10010 .DA #%01101 .DA #%00100 ' $27 .DA #%00100 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%00010 ( $28 .DA #%00100 .DA #%01000 .DA #%01000 .DA #%01000 .DA #%00100 .DA #%00010 .DA #%01000 ) $29 .DA #%00100 .DA #%00010 .DA #%00010 .DA #%00010 .DA #%00100 .DA #%01000 .DA #%00000 * $2A .DA #%10101 .DA #%01110 .DA #%00100 .DA #%01110 .DA #%10101 .DA #%00000 .DA #%00000 + $2B .DA #%00100 .DA #%00100 .DA #%11111 .DA #%00100 .DA #%00100 .DA #%00000 .DA #%00000 , $2C .DA #%00000 .DA #%00000 .DA #%00000 .DA #%01100 .DA #%00100 .DA #%01000 .DA #%00000 - $2D .DA #%00000 .DA #%00000 .DA #%11111 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%00000 . $2E .DA #%00000 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%01100 .DA #%01100 .DA #%00000 / $2F .DA #%00001 .DA #%00010 .DA #%00100 .DA #%01000 .DA #%10000 .DA #%00000 .DA #%00100 0 $30 .DA #%01010 .DA #%10001 .DA #%10001 .DA #%10001 .DA #%01010 .DA #%00100 .DA #%00100 1 $31 .DA #%01100 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%01110 .DA #%01110 2 $32 .DA #%10001 .DA #%00010 .DA #%00100 .DA #%01000 .DA #%10000 .DA #%11111 .DA #%11111 3 $33 .DA #%00001 .DA #%00010 .DA #%00110 .DA #%00001 .DA #%10001 .DA #%01110 .DA #%00010 4 $34 .DA #%00110 .DA #%01010 .DA #%10010 .DA #%11111 .DA #%00010 .DA #%00010 .DA #%11111 5 $35 .DA #%10000 .DA #%10000 .DA #%11110 .DA #%00001 .DA #%10001 .DA #%01110 .DA #%01111 6 $36 .DA #%10000 .DA #%10000 .DA #%11110 .DA #%10001 .DA #%10001 .DA #%01110 .DA #%11111 7 $37 .DA #%00001 .DA #%00010 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%01110 8 $38 .DA #%10001 .DA #%10001 .DA #%01110 .DA #%10001 .DA #%10001 .DA #%01110 .DA #%01110 9 $39 .DA #%10001 .DA #%10001 .DA #%01111 .DA #%00001 .DA #%00001 .DA #%11110 .DA #%00000 : $3A .DA #%01100 .DA #%01100 .DA #%00000 .DA #%01100 .DA #%01100 .DA #%00000 .DA #%00000 ; $3B .DA #%01100 .DA #%01100 .DA #%00000 .DA #%01100 .DA #%00100 .DA #%01000 .DA #%00010 < $3C .DA #%00100 .DA #%01000 .DA #%10000 .DA #%01000 .DA #%00100 .DA #%00010 .DA #%00000 = $3D .DA #%00000 .DA #%11111 .DA #%00000 .DA #%11111 .DA #%00000 .DA #%00000 .DA #%01000 > $3E .DA #%00100 .DA #%00010 .DA #%00001 .DA #%00010 .DA #%00100 .DA #%01000 .DA #%01110 ? $3F .DA #%10001 .DA #%00010 .DA #%00100 .DA #%00100 .DA #%00000 .DA #%00100 .DA #%01110 @ $40 .DA #%10001 .DA #%10101 .DA #%10111 .DA #%10000 .DA #%10001 .DA #%01110 .DA #%00100 A $41 .DA #%01010 .DA #%10001 .DA #%11111 .DA #%10001 .DA #%10001 .DA #%10001 .DA #%11110 B $42 .DA #%01001 .DA #%01001 .DA #%01110 .DA #%01001 .DA #%01001 .DA #%11110 .DA #%01110 C $43 .DA #%10001 .DA #%10000 .DA #%10000 .DA #%10000 .DA #%10001 .DA #%01110 .DA #%11110 D $44 .DA #%01001 .DA #%01001 .DA #%01001 .DA #%01001 .DA #%01001 .DA #%11110 .DA #%11111 E $45 .DA #%10000 .DA #%10000 .DA #%11100 .DA #%10000 .DA #%10000 .DA #%11111 .DA #%11111 F $46 .DA #%10000 .DA #%10000 .DA #%11100 .DA #%10000 .DA #%10000 .DA #%10000 .DA #%01111 G $47 .DA #%10000 .DA #%10000 .DA #%10000 .DA #%10111 .DA #%10001 .DA #%01110 .DA #%10001 H $48 .DA #%10001 .DA #%10001 .DA #%11111 .DA #%10001 .DA #%10001 .DA #%10001 .DA #%01110 I $49 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%01110 .DA #%01110 J $4A .DA #%00100 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%10100 .DA #%01000 .DA #%10001 K $4B .DA #%10010 .DA #%10100 .DA #%11000 .DA #%10100 .DA #%10010 .DA #%10001 .DA #%10000 L $4C .DA #%10000 .DA #%10000 .DA #%10000 .DA #%10000 .DA #%10000 .DA #%11111 .DA #%10001 M $4D .DA #%11011 .DA #%10101 .DA #%10101 .DA #%10001 .DA #%10001 .DA #%10001 .DA #%10001 N $4E .DA #%10001 .DA #%11001 .DA #%10101 .DA #%10011 .DA #%10001 .DA #%10001 .DA #%01110 O $4F .DA #%10001 .DA #%10001 .DA #%10001 .DA #%10001 .DA #%10001 .DA #%01110 .DA #%11110 P $50 .DA #%10001 .DA #%10001 .DA #%11110 .DA #%10000 .DA #%10000 .DA #%10000 .DA #%01110 Q $51 .DA #%10001 .DA #%10001 .DA #%10001 .DA #%10101 .DA #%10010 .DA #%01101 .DA #%11110 R $52 .DA #%10001 .DA #%10001 .DA #%11110 .DA #%10100 .DA #%10010 .DA #%10001 .DA #%01110 S $53 .DA #%10001 .DA #%10000 .DA #%01110 .DA #%00001 .DA #%10001 .DA #%01110 .DA #%11111 T $54 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%10001 U $55 .DA #%10001 .DA #%10001 .DA #%10001 .DA #%10001 .DA #%10001 .DA #%01110 .DA #%10001 V $56 .DA #%10001 .DA #%10001 .DA #%10001 .DA #%01010 .DA #%01010 .DA #%00100 .DA #%10001 W $57 .DA #%10001 .DA #%10001 .DA #%10001 .DA #%10101 .DA #%10101 .DA #%01010 .DA #%10001 X $58 .DA #%10001 .DA #%01010 .DA #%00100 .DA #%01010 .DA #%10001 .DA #%10001 .DA #%10001 Y $59 .DA #%10001 .DA #%01010 .DA #%01010 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%11111 Z $5A .DA #%00001 .DA #%00010 .DA #%00100 .DA #%01000 .DA #%10000 .DA #%11111 .DA #%01111 [ $5B .DA #%01000 .DA #%01000 .DA #%01000 .DA #%01000 .DA #%01000 .DA #%01111 .DA #%00000 \ $5C .DA #%10000 .DA #%01000 .DA #%00100 .DA #%00010 .DA #%00001 .DA #%00000 .DA #%11110 ] $5D .DA #%00010 .DA #%00010 .DA #%00010 .DA #%00010 .DA #%00010 .DA #%11110 .DA #%00100 ^ $5E .DA #%01010 .DA #%10001 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%00000 _ $5F .DA #%00000 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%11111 .DA #%00100 ' $60 .DA #%01000 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%00000 a $61 .DA #%01110 .DA #%00001 .DA #%01101 .DA #%10011 .DA #%10001 .DA #%01111 .DA #%10000 b $62 .DA #%10000 .DA #%10000 .DA #%10110 .DA #%11001 .DA #%10001 .DA #%11110 .DA #%00000 c $63 .DA #%00000 .DA #%01111 .DA #%10000 .DA #%10000 .DA #%10000 .DA #%01111 .DA #%00001 d $64 .DA #%00001 .DA #%00001 .DA #%01101 .DA #%10011 .DA #%10001 .DA #%01111 .DA #%00000 e $65 .DA #%00000 .DA #%01110 .DA #%10001 .DA #%11110 .DA #%10000 .DA #%01110 .DA #%00110 f $66 .DA #%01001 .DA #%01000 .DA #%11100 .DA #%01000 .DA #%01000 .DA #%01000 .DA #%00000 g $67 .DA #%01111 .DA #%10001 .DA #%10011 .DA #%01101 .DA #%00001 .DA #%01110 .DA #%10000 h $68 .DA #%10000 .DA #%10000 .DA #%10110 .DA #%11001 .DA #%10001 .DA #%10001 .DA #%00000 i $69 .DA #%00100 .DA #%00000 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%00000 j $6A .DA #%00010 .DA #%00000 .DA #%00010 .DA #%00010 .DA #%10010 .DA #%01100 .DA #%10000 k $6B .DA #%10000 .DA #%10001 .DA #%10010 .DA #%11100 .DA #%10010 .DA #%10001 .DA #%01100 l $6C .DA #%00100 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%01110 .DA #%00000 m $6D .DA #%00000 .DA #%11010 .DA #%10101 .DA #%10101 .DA #%10101 .DA #%10101 .DA #%00000 n $6E .DA #%00000 .DA #%10110 .DA #%11001 .DA #%10001 .DA #%10001 .DA #%10001 .DA #%00000 o $6F .DA #%00000 .DA #%01110 .DA #%10001 .DA #%10001 .DA #%10001 .DA #%01110 .DA #%00000 p $70 .DA #%11110 .DA #%10001 .DA #%11001 .DA #%10110 .DA #%10000 .DA #%10000 .DA #%00000 q $71 .DA #%01111 .DA #%10001 .DA #%10011 .DA #%01101 .DA #%00001 .DA #%00001 .DA #%00000 r $72 .DA #%00000 .DA #%10110 .DA #%11001 .DA #%10000 .DA #%10000 .DA #%10000 .DA #%00000 s $73 .DA #%00000 .DA #%01111 .DA #%10000 .DA #%01110 .DA #%00001 .DA #%11110 .DA #%00100 t $74 .DA #%00100 .DA #%01110 .DA #%00100 .DA #%00100 .DA #%00101 .DA #%00010 .DA #%00000 u $75 .DA #%00000 .DA #%10001 .DA #%10001 .DA #%10001 .DA #%10011 .DA #%01101 .DA #%00000 v $76 .DA #%00000 .DA #%10001 .DA #%10001 .DA #%10001 .DA #%01010 .DA #%00100 .DA #%00000 w $77 .DA #%00000 .DA #%10001 .DA #%10001 .DA #%10101 .DA #%10101 .DA #%01010 .DA #%00000 x $78 .DA #%00000 .DA #%10001 .DA #%01010 .DA #%00100 .DA #%01010 .DA #%10001 .DA #%00000 y $79 .DA #%00000 .DA #%10001 .DA #%10001 .DA #%01111 .DA #%00010 .DA #%01100 .DA #%00000 z $7A .DA #%00000 .DA #%11111 .DA #%00010 .DA #%00100 .DA #%01000 .DA #%11111 .DA #%00011 { $7B .DA #%00100 .DA #%00100 .DA #%01000 .DA #%00100 .DA #%00100 .DA #%00011 .DA #%00100 | $7C .DA #%00100 .DA #%00100 .DA #%00000 .DA #%00100 .DA #%00100 .DA #%00100 .DA #%11000 } $7D .DA #%00100 .DA #%00100 .DA #%00010 .DA #%00100 .DA #%00100 .DA #%11000 .DA #%01000 ~ $7E .DA #%10101 .DA #%00010 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%00000 .DA #%11111 sqaure $7F .DA #%11111 .DA #%11111 .DA #%11111 .DA #%11111 .DA #%11111 .DA #%11111 ;--------------------------------------------------------------------------- ; Vectors ;--------------------------------------------------------------------------- .OR $FFF8 .DA RESET IRQ (Not used) .DA RESET SWI (Not used) .DA RESET NMI (Not used) .DA RESET Reset .LI OFF
You can download the sda5708.asm program by right clicking on this link or you can copy it from the listing. If you run the program you should be able to see the following message on the display. You could show just about anything on the display with this program, by changing the string on the line starting with the lable TEXT.