# Driving 8 or 9 7 segment displays with 8 or 9 io pins (and no extra circuitry)

w. v. ooijen / f. hanneman [wf@xs4all.nl] says:

Actually you can drive 9 [seven segment] displays (of seven segments + point) with 9 pins. [or 8 displays excluding the point with one port of 8 pins]. But this takes a bit more code. The trick is to use both the high, low and input states. Each display has its anode on one of the lines, and all of its cathodes's on the other 8 lines. Now to light one segment you make the pin connected to that displays anode positive, that segments cathode negative [or ground], and (this is the trick) all other lines inputs. Of course you multiplex one display at a time, not one segment.

[Ed: for anyone (like me) who didn't get that on the first reading, maybe this will help: each pin of the uP port is connected to 1 displays anode and to one of the the other 8 or 9 displays segments. e.g. pin1 = disp1anode & disp2a & disp3b & disp4c & disp5d & disp6e & disp7f & disp8g, pin2 = disp1a & disp2anode & disp3b & disp4c & disp5d & disp6e & disp7f & disp8g, etc...]

Mike McLaren's [k8lh@arrl.net] untested 9-pin 8-digit design (19-Jul-04):

The INIT section of the main program will need to initialize BITPOS to b'00000001', set BUFPTR to point at the the eight byte digit buffer, and setup RB0 as an output before turning on the interrupt source (Timer2 in my case)... The main program then simply stuffs the eight byte digit buffer with each digits segment data (bits 6..0 = segments G..A, respectively) and decimal point (bit 7)... Suppress a leading zero by setting that digits buffer to b'00000000' and perform a "lamp test" by setting all eight digit buffers to b'11111111'... The 9-pin design easily supports a 9th digit but the code gets a little bigger when we start manipulating TRISB and PORTB...

``` ; 8-digit 9-pin LED display sample ISR code...
;  (14-bit core instructions)
;
; Vars - BITPOS (float bit & digit position)
;        BUFPTR (buffer pointer)
;        DIGIT1 (start of 8 byte display data buffer)
;               (bit 7=dp, bits 6..0=segments G..A)
;
ISR_LED  bsf   STATUS,RP0   ;Bank 1 (RP1 is clr)     |B1
movlw b'11111111'  ;                        |B1
movwf TRISA        ;turn off display        |B1
bcf   STATUS,RP0   ;Bank 0 (RP1 is clr)     |B0
movf  BITPOS,W     ;example: b'00000001'    |B0
movwf PORTA        ;new output pattern      |B0
;
bsf   PORTB,0      ;turn 'float bit' off    |B0
movf  BUFPTR,W     ;ptr to current digit    |B0
movwf FSR          ;setup indirect address  |B0
movf  INDF,W       ;get digit segment data  |B0
andwf BITPOS,W     ;AND float/column bit    |B0
btfss STATUS,Z     ;need the float bit?     |B0
bcf   PORTB,0      ;yes, 'float' bit on     |B0
iorwf BITPOS,W     ;pickup the BITPOS bit   |B0
iorwf INDF,W       ;get digit segment bits  |B0
xorlw b'11111111'  ;invert all bits         |B0
bsf   STATUS,RP0   ;Bank 1 (RP1 is clr)     |B1
movwf TRISA        ;display new digit       |B1
bcf   STATUS,RP0   ;Bank 0 (RP1 is clr)     |B0
;
incf  BUFPTR,f     ;increment buffer ptr    |B0
bcf   STATUS,C     ;clear carry bit         |B0
rlf   BITPOS,f     ;shift our digit bit     |B0
btfss STATUS,C     ;all 8 digits scanned?   |B0
goto  ISR_NXT      ;no, branch              |B0
;
rlf   BITPOS,f     ;reset to b'00000001'    |B0
movlw DIGIT1       ;get buffer address      |B0
movwf BUFPTR       ;reset the pointer       |B0
;
ISR_NXT
```

Questions:

• KILLspamdawormSPAM at TakeThisOuTcdc.net asks: " Does anyone have a similar setup for 16 segment (plus DP) displays? Maxim 6954's are a tad expensive..." +
It seems that this design idea requires that the seven segment displays do not have common cathods or annodes. I do not seem to be able to find 7 segment modules like this.

James Newton replies: Not so. There are multiple displays and the common cathode from each one is seperated, but the segments in one display are on a common cathode.+

+

• How can I show a voltage of 3.87 Volts in 4 displays for example?+

See:

• KILLspammarco.scheibeSPAM at TakeThisOuTinfineon.com
Good idea instead, but the note is somewhat complicated and has a small error. Simply connect D0 to disp0an + disp[1:7]a, D1 to disp0b + disp1an + disp[2:7]b and so on (the editor connected both pin1 and pin2 to disp3a...)

Drawback is that you need 7 resistors per display (8 when you use the dot as well).

+

Mike McLaren's [k8lh@arrl.net] 9-pin 8-digit display design (29-Nov-04):

The Agilent low current displays eliminate the need for digit driver transistors... The INIT section of your main program will need to initialize BITPOS to b'00000001', set BUFPTR to point at the the beginning of your eight byte digit buffer, turn on Port B weak pull-ups, and setup RA0 as a digital output before turning on the interrupt source (I use TMR2)... The main program then simply stuffs the eight byte digit buffer with each digits segment data (bits 6..0 = segments G..A, respectively) and decimal point (bit 7)... Suppress a leading zero by setting that digits buffer to b'00000000' and perform a "lamp test" by setting all eight digit buffers to b'11111111'... The 9-pin design will support a 9th digit but the code would become a little more complex...

``` ;
; 8-Digit 9-Pin Charlieplexed CC LED ISR Sample Code
;   (14-bit core instructions)
;
; Vars - BITPOS (float bit & digit position)
;        BUFPTR (buffer pointer)
;        DIGIT1 (start of 8 byte display data buffer)
;               (bit 7=dp, bit 6=G...bit 0=A)
;
ISR_LED  bsf   STATUS,RP0   ;Bank 1 (RP1 is clr)     |B1
movlw b'11111111'  ;                        |B1
movwf TRISB        ;turn off display        |B1
bcf   STATUS,RP0   ;Bank 0 (RP1 is clr)     |B0
xorwf BITPOS,W     ;inv float/column bits   |B0
movwf PORTB        ;new output pattern      |B0
;
bcf   PORTA,0      ;turn 'float bit' off    |B0
movf  BUFPTR,W     ;ptr to current digit    |B0
movwf FSR          ;setup indirect address  |B0
movf  INDF,W       ;get digit segment data  |B0
andwf BITPOS,W     ;and float/column bit    |B0
btfss STATUS,Z     ;need the float bit?     |B0
bsf   PORTA,0      ;yes, 'float' bit on     |B0
iorwf BITPOS,W     ;pickup the BITPOS bit   |B0
iorwf INDF,W       ;get digit segment bits  |B0
xorlw b'11111111'  ;invert all bits         |B0
bsf   STATUS,RP0   ;Bank 1 (RP1 is clr)     |B1
movwf TRISB        ;display new digit       |B1
bcf   STATUS,RP0   ;Bank 0 (RP1 is clr)     |B0
;
incf  BUFPTR,f     ;increment buffer ptr    |B0
bcf   STATUS,C     ;clear carry bit         |B0
rlf   BITPOS,f     ;shift our digit bit     |B0
btfss STATUS,C     ;all 8 digits scanned?   |B0
goto  ISR_NXT      ;no, branch              |B0
;
rlf   BITPOS,f     ;reset to b'00000001'    |B0
movlw DIGIT1       ;get buffer address      |B0
movwf BUFPTR       ;reset the pointer       |B0
;
ISR_NXT

;
; 8-Digit 9-Pin Charlieplexed CC LED ISR Sample Code
;   (16-bit core instructions)
;
; Vars - BITPOS (float bit & digit position)
;        BUFPTR (buffer pointer)
;        DIGIT1 (start of 8 byte display data buffer)
;               (bit 7=dp, bit 6=G...bit 0=A)
;
ISR_LED  movlw b'11111111'  ;
movwf TRISB        ;turn off display
comf  BITPOS,W     ;invert for common cathode
movwf PORTB        ;new output pattern
;11111110, 11111101, etc.
bcf   PORTA,0      ;turn 'float bit' off
lfsr  2,BUFPTR     ;ptr to current digit
movf  INDF2,W      ;get digit segment data
andwf BITPOS,W     ;AND float/column bit
btfss STATUS,Z     ;need the float bit?
bsf   PORTA,0      ;yes, 'float' bit on
iorwf BITPOS,W     ;pickup the BITPOS bit
iorwf INDF2,W      ;get digit segment bits
xorlw b'11111111'  ;invert all bits
movwf TRISB        ;display new digit
;
incf  BUFPTR,f     ;increment buffer ptr
rlncf BITPOS,f     ;setup for next digit
decf  BITPOS,W     ;column 00000001?
bnz   ISR_NXT      ;no, branch
;else, reset pointer
movwf BUFPTR       ;reset the pointer
;
ISR_NXT

```

Archive: LEDMPX I do not understand English.
The result was good and was not able to edit it.
Is nine columns of indication good by the following contents?
I reconsidered it well.
I changed it in a direct opening sentence not to do the bit operation of the port.

;By nonnno

list      p=16F648A           ; list directive to define processor
#include <p16F648A.inc>       ; processor specific variable definitions
__CONFIG _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _EXTCLK_OSC
; 9-Digit 9-Pin Charlieplexed AC LED ISR Sample Code
;   (14-bit core instructions)
; Vars - BITPOS (float bit & digit position)
;        BUFPTR (buffer pointer)
;        DIGIT0 (start of 8 byte display data buffer)
;               (bit 7=dp, bit 6=G...bit 0=A)
;LEDMPX coment |B is bank
org    20h
BITPOS    res    1
BUFPTR    res    1
DIGIT0    res    1
DIGIT1    res    1
DIGIT2    res    1
DIGIT3    res    1
DIGIT4    res    1
DIGIT5    res    1
DIGIT6    res    1
DIGIT7    res    1
DIGIT8    res    1
DIGIT9    res    1
WORK    res    1
SDWPA    res    1
SDWPB    res    1
SDWTA    res    1
SDWTB    res    1
;CLOCKFREQ    EQU    12.8        ;  12.8 MHz X-tal used
; dispdata
D0_  equ b'00111111'
D1_  equ b'00000110'
D2_  equ b'01011011'
D3_  equ b'01001111'
D4_  equ b'01100110'
D5_  equ b'01101101'
D6_  equ b'01111101'
D7_  equ b'00000111'
D8_  equ b'01111111'
D9_  equ b'01101111'
Dp_  equ b'10111111'
D0p_ equ b'10111111'
D1p_ equ b'10000110'
D2p_ equ b'11011011'
D3p_ equ b'11001111'
D4p_ equ b'11100110'
D5p_ equ b'11101101'
D6p_ equ b'11111101'
D7p_ equ b'10000111'
D8p_ equ b'11111111'
D9p_ equ b'11101111'
org    0
goto    start
org    4
start    org    5
goto init_
init_;
movlw    D0_
movwf    DIGIT0
movlw    D1_
movwf    DIGIT1
movlw    D2_
movwf    DIGIT2
movlw    D3_
movwf    DIGIT3
movlw    D4_
movwf    DIGIT4
movlw    D5_
movwf    DIGIT5
movlw    D6_
movwf    DIGIT6
movlw    D7_
movwf    DIGIT7
movlw    D8_
movwf    DIGIT8
movlw    D9_
movwf    DIGIT9
movlw    b'00000111'    ;all DIGTAL
movwf    CMCON        ;
goto    isb9
isrled;
movf    BUFPTR,W    ;Z,32~3A
;9dig Hi
movf    BITPOS,W    ;Z,DigData '00000001'    digPOS
bcf    SDWPA,0        ; ,DP9=0      Dig9    9dig Lo
btfsc    STATUS,Z    ; ,DG9 ? 0 1        9dig ?=1
bsf    SDWPA,0        ; ,DP9=1 | *        9dig Hi
;1,2,3,5,6,7,8dig Hi=Com
xorwf    SDWPB,W        ; ,Old Com Data
andlw    b'11110111'    ; ,Not Bit3
xorwf    SDWPB,F        ; ,NeW Com Data
;4dig Hi
bcf    SDWPA,1        ; ,DP4=0      Dig4    4dig Lo
btfsc    BITPOS,3    ; ,PB3 ? 0 1        4dig ?=1
bsf    SDWPA,1        ; ,DP4=1 | *         4dig Hi
;Fbit,9dig on
andwf    INDF,W        ;Z,
bsf    SDWTA,0        ; ,DT9=1      F&D9    Fbit,9dig off
btfsc    STATUS,Z    ; ,Fbt ? 0 1        Fbit ?=0 on
btfsc    SDWPA,0        ; ,DG9 ? | 0 1        9dig ?=1 on
bcf    SDWTA,0        ; ,DT9=0 * | *        Fbit,9dig on
;Seg                ; ,       *
movf    BITPOS,W    ;Z,pickup the BITPOS bit  |B0 * 00000001
iorwf    INDF,W        ;Z,get digit segment bits |B0   00000110 00000111
movwf    WORK        ;
;Dbit,4dig on
bsf    SDWTA,1        ; ,DT4=1      F&D4    Dbit,4dig off
btfsc    WORK,3        ; ,PB3 ? 0 1        Dbit,4dig ?=1
bcf    SDWTA,1        ; ,DT4=0 | *  SegD    Dbit,4dig on
comf    WORK,W        ;Z,     R~>W
xorwf    SDWTB,W        ; ,Old Data
andlw    b'11110111'    ; ,Not Bit3
xorwf    SDWTB,F        ; ,NeW Data
movf    SDWPA,W        ;
movwf PORTA        ;display new digit
movf    SDWPB,W        ;
movwf PORTB        ;display new digit
movf    SDWTA,W        ;
bsf   STATUS,RP0    ;Bank 1 (RP1 is clr)     |B1
movwf TRISA        ;display new digit
bcf   STATUS,RP0    ;Bank 0 (RP1 is clr)     |B0
movf    SDWTB,W        ;
bsf   STATUS,RP0    ;Bank 1 (RP1 is clr)     |B1
movwf TRISB        ;display new digit
bcf   STATUS,RP0    ;Bank 0 (RP1 is clr)     |B0
movf    BITPOS,W    ;DigData '00000001'Z
;                          ;STATUS,Z'xxxxx2xx'
btfss    STATUS,Z    ;Z=          1 0
goto     isbp         ;         | *@
isb9;                ;         |  |
movlw     b'00000001'     ;Digitreset1 *  |
movwf     BITPOS         ;LoDigit write  |
movlw     DIGIT0         ;Segment Data   |
movwf     BUFPTR         ;Pointa Write   |
goto     israll         ;Next Flow      |
isbp;                ;            |
incf     BUFPTR,f     ;DigitPointa +1 *
bcf     STATUS,C     ;cl carry      *
rlf     BITPOS,f     ;Shift Left      |
goto     israll         ;Next Flow   | *@ |
;                ;            |
israll;                ;            |
nop            ;            *
goto     isrled
;next flow is on time & etc prosses
end

 file: /Techref/io/led/8x7s8pin.htm, 23KB, , updated: 2009/12/3 09:57, local time: 2018/9/21 15:45, owner: kan-MMM-UA4, TOP NEW HELP FIND:  54.198.142.121:LOG IN

 ©2018 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions?Please DO link to this page! Digg it! / MAKE! /  Driving 8 or 9 7 segment displays with 8 or 9 io pins (and no extra circuitry)

After you find an appropriate page, you are invited to your to this massmind site! (posts will be visible only to you before review) Just type in the box and press the Post button. (HTML welcomed, but not the <A tag: Instead, use the link box to link to another page. A tutorial is available Members can login to post directly, become page editors, and be credited for their posts.

Attn spammers: All posts are reviewed before being made visible to anyone other than the poster.
 Did you find what you needed? "No. I'm looking for: " "No. Take me to the search page." "No. Take me to the top so I can drill down by catagory" "No. I'm willing to pay for help, please refer me to a qualified consultant" "No. But I'm interested. me at when this page is expanded."

.