A Note about 7 segment LED display.

This article is about how to interface a seven segment LED display to an 8051 microcontroller. 7 segment LED display is  very popular and it can display digits from 0 to 9 and quite a few characters like A, b, C, ., H, E, e, F, n, o,t,u,y, etc. Knowledge about how to interface a seven segment display to a micro controller is very essential in designing embedded systems. A seven segment display consists of seven LEDs arranged in the form of a squarish ‘8’ slightly inclined to the right and a single LED as the dot character. Different characters can be displayed by selectively glowing the required LED segments. Seven segment displays are of two types, common cathode and common anode. In common cathode type , the cathode of all LEDs are tied together to a single terminal which is usually labeled as ‘com‘   and the anode of all LEDs are left alone as individual pins labeled as a, b, c, d, e, f, g &  h (or dot) . In common anode type, the anode of all LEDs are tied together as a single terminal and cathodes are left alone as individual pins. The pin out scheme and picture of a typical 7 segment LED display is shown in the image below.

seven segment LED display
7 segment LED display

Digit drive pattern.

Digit drive pattern of a seven segment LED display is simply the different logic combinations of  its  terminals ‘a’ to ‘h‘ in order to display different digits and characters. The common digit drive patterns (0 to 9) of a seven segment display are shown in the table below.

Digit a b c d e f g
0 1 1 1 1 1 1 0
1 0 1 1 0 0 0 0
2 1 1 0 1 1 0 1
3 1 1 1 1 0 0 1
4 0 1 1 0 0 1 1
5 1 0 1 1 0 1 1
6 1 0 1 1 1 1 1
7 1 1 1 0 0 0 0
8 1 1 1 1 1 1 1
9 1 1 1 1 0 1 1

Interfacing seven segment display to 8051.

interfacing 7 segment display to Atmel AT89S51
Interfacing 7 segment display to 8051

The circuit diagram shown above is of an AT89S51 microcontroller based 0 to 9 counter which has a 7 segment LED display interfaced to it in order to display the count.  This simple circuit illustrates two things. How to setup simple 0 to 9 up counter using 8051 and more importantly how to interface a seven segment LED display to  8051 in order to display a particular result. The common cathode seven segment display D1 is connected to the Port 1 of the microcontroller (AT89S51) as shown in the circuit diagram. R3 to R10 are current limiting resistors. S3 is the reset switch and R2,C3 forms a debouncing circuitry. C1, C2 and X1 are related to the clock circuit. The software part of the project has to do the following tasks.

  • Form a 0 to 9 counter with a predetermined delay (around 1/2 second here).
  • Convert the current count into digit drive pattern.
  • Put the current digit drive pattern into a port for displaying.

All the above said tasks are accomplished by the program given below.

Program.

ORG 000H //initial starting address
START: MOV A,#00001001B // initial value of accumulator
MOV B,A
MOV R0,#0AH //Register R0 initialized as counter which counts from 10 to 0
LABEL: MOV A,B
INC A
MOV B,A
MOVC A,@A+PC // adds the byte in A to the program counters address
MOV P1,A
ACALL DELAY // calls the delay of the timer
DEC R0//Counter R0 decremented by 1
MOV A,R0 // R0 moved to accumulator to check if it is zero in next instruction.
JZ START //Checks accumulator for zero and jumps to START. Done to check if counting has been finished.
SJMP LABEL
DB 3FH // digit drive pattern for 0
DB 06H // digit drive pattern for 1
DB 5BH // digit drive pattern for 2
DB 4FH // digit drive pattern for 3
DB 66H // digit drive pattern for 4
DB 6DH // digit drive pattern for 5
DB 7DH // digit drive pattern for 6
DB 07H // digit drive pattern for 7
DB 7FH // digit drive pattern for 8
DB 6FH // digit drive pattern for 9
DELAY: MOV R4,#05H // subroutine for delay
WAIT1: MOV R3,#00H
WAIT2: MOV R2,#00H
WAIT3: DJNZ R2,WAIT3
DJNZ R3,WAIT2
DJNZ R4,WAIT1
RET
END

About the program.

Instruction MOVC A,@A+PC is the instruction that  produces the required digit drive pattern for the display. Execution of this instruction will add the value in the accumulator A with the content of the program counter(address of the next instruction) and will move the data present in the resultant address to A. After this the program resumes from the line after MOVC A,@A+PC.

In the program,  initial value in A is 00001001B. Execution of  MOVC A,@A+PC  will add oooo1001B to the content  in PC ( address of next instruction). The result  will be the address of label DB 3FH (line15) and the data present in this address ie 3FH (digit drive pattern for 0) gets moved into the accumulator. Moving this pattern in the accumulator to Port 1 will display 0 which is the first count.

At the next count, value in A will advance to 00001010 and after the execution of  MOVC A,@+PC  ,the value in A will be 06H which is the digit drive pattern for 1 and this will display 1 which is the next count  and this cycle gets repeated for subsequent counts.

The reason why accumulator is loaded with 00001001B (9 in decimal) initially  is that the instructions from line 9 to line 15 consumes 9 bytes in total.

The lines 15 to 24 in the program which starts with label DB can be called as a Look Up Table (LUT). label DB is known as Define Byte – which defines a byte. This table defines the digit drive patterns for 7 segment display as bytes (in hex format). MOVC operator fetches the byte from this table based on the result of adding PC and contents in the accumulator.

Register B is used as a temporary storage of the initial value of the accumulator and the subsequent increments made to accumulator to fetch each digit drive pattern one by one from the look up table(LUT).

Note:- In line 6, Accumulator is incremented by 1 each time (each loop iteration) to select the next digit drive pattern. Since MOVC operator uses the value in A to fetch the digit drive pattern from LUT, value in ACC has to be incremented/manipulated accordingly. The digit drive patterns are arranged consecutively in LUT.

Register R0 is used as a counter  which counts from 10 down to 0. This ensures that digits from o to 9 are continuously displayed in the 7 segment LED. You may note lines 4, 11, 12, and 13 in the above program. Line 4 initializes R0 to 10 (OAh). When the program counter reaches line 11 for the first time, 7 segment LED has already displayed 0. So we can reduce one count and that is why we have written DEC Ro. We need to continuously check if R0 has reached full count (that is 0). In order to do that lines 12 and 13 are used. We move R0 to accumulator and then use the Jump if Zero (JZ) instruction to check if accumulator has reached zero. If Acc=0, then we makes the program to jump to START (initial state) and hence we restart the 7 segment LED to display from 0 to 9 again. If Acc not equal to zero, we continue the program to display the next digit (check line 14).

Multiplexing 7 segment display to 8051.

Suppose you need a three digit display connected to the 8051. Each 7 segment display have 8 pins and so a total amount of 24 pins are to the connected to the microcontroller and there will be only 8 pins left with the microcontroller for other input output applications. Also the maximum number of displays that can be connected to the 8051 is limited to 4 because 8051 has only 4 ports. More over three 3 displays will be ON always and this consumes a considerable amount of power. All these problems associated with the straight forward method can be solved by  multiplexing .

In multiplexing all displays are connected in parallel to one port and only one display is allowed to turn ON at a time, for a short period. This cycle is repeated for at a fast rate and due to the persistence of vision of human eye, all digits seems to glow. The main advantages of this method are

  • Fewer number of port pins are required .
  • Consumes less power.
  • More number of display units can be interfaced (maximum 24).

The circuit diagram for multiplexing 2 seven segment displays to the 8051 is shown below.

mutiplexing seven segment display
Multiplexing 7 segement display to 8051

When assembled and powered on, the circuit will display the number ’16’ and let us see how it is done. Initially the first display is activated by making  P3.0 high and then digit drive pattern for “1” is loaded to  the Port 1. This will make the first display to show “1”. In the mean time P3.1 will be low and so do the second display will be OFF. This condition is maintained for around 1ms and then P3.0 is made low. Now both displays will be OFF. Then the second display is activated by making P3.1 high and then the digit drive pattern for “6” is loaded to the port 1. This will make the second display to show “6”. In the mean time P3.0 will be low and so the second display will be OFF.  This condition is maintained for another 1ms and then port 3.1 is made low. This cycle is repeated and due to the persistence of vision you will feel it as “16”.

Transistor Q1 drives the first display (D1) and transistor Q2 drives the second display (D2). R11 and R12 are the base current limiting resistors of Q1 and Q2. The purpose of other components are explained in the first circuit.

Program.

ORG 000H // initial starting address
MOV P1,#00000000B // clears port 1
MOV R6,#1H // stores "1"
MOV R7,#6H // stores "6"
MOV P3,#00000000B // clears port 3
MOV DPTR,#LABEL1 // loads the adress of line 29 to DPTR
MAIN: MOV A,R6 // "1" is moved to accumulator
SETB P3.0 // activates 1st display
ACALL DISPLAY // calls the display sub routine for getting the pattern for "1"
MOV P1,A // moves the pattern for "1" into port 1
ACALL DELAY // calls the 1ms delay
CLR P3.0 // deactivates the 1st display
MOV A,R7 // "2" is moved to accumulator
SETB P3.1 // activates 2nd display
ACALL DISPLAY // calls the display sub routine for getting the pattern for "2"
MOV P1,A // moves the pattern for "2" into port 1
ACALL DELAY // calls the 1ms delay
CLR P3.1 // deactivates the 2nd display
SJMP MAIN // jumps back to main and cycle is repeated
DELAY: MOV R3,#02H
DEL1: MOV R2,#0FAH
DEL2: DJNZ R2,DEL2
DJNZ R3,DEL1
RET
DISPLAY: MOVC A,@A+DPTR // adds the byte in A to the address in DPTR and loads A with data present in the resultant address
RET
LABEL1:DB 3FH
DB 06H
DB 5BH
DB 4FH
DB 66H
DB 6DH
DB 7DH
DB 07H
DB 7FH
DB 6FH

END

Got any doubts/questions? Ask here in comments!

Author

58 Comments

  1. can you post c code for the same with interrupt routine.. please..!!

  2. what is the code to display one digit on 7 segment display and increment in it after delay of 5 seconeds??

  3. shouldn’t we use a transistor for each LED?
    I mean why you only used transistors in common pins not also in other (8) pins?

  4. Lye Heng Foo

    In the article, the part where it says “This will make the second display to show “6”. In the mean time P3.0 will be low and so the second display will be OFF. ” … it should be the first display will be OFF, not second display.

  5. Sharique

    I am interfacing four 7 segment display with microcontroller AT89S52.plz provide program details as you have written for 2 multiplexed 7 segment display I want to apply it for four multiplexed 7 segment display

  6. dinesh nella

    can any one send the program for controlling the numbers from 16 to 27 with 7segment display using 8051 mc

  7. i want to count pulse up to 999 how can i do it ,
    please guide me…
    thanks

  8. I want to interface 16 segment alphanumeric display to display something….so anyone can plz tell me circuit diagram and source code

  9. Eshetu Drissa

    Dear sir,
    I am a college student who is practicing 8051 with assembly language. I am new for both the component and program.
    My problem is as follows
    The program I wrote counts up and down using button. But the button count down after it finishes up counting. I want it to count up when I press up button and down when I press down button.
    My program is as follows. Would you please help me by showing me how to write.
    I used the microcontroller pins
    p2.0-p2.7 for counting and p3.0 for up button and p3.1 for down button.

    AND THE PROGRAM
    ORG 00H
    JMP MAIN
    MAIN:
    MOV A,#00H
    UP: JB P3.0,$
    ADD A,#1
    DA A
    MOV P2,A
    CALL DELAY
    CJNE A,#30H,UP
    JMP DOWN
    DOWN: JB P3.1,$
    MOV P2,A
    ADD A,#99H
    DA A
    MOV P2,A
    CALL DELAY
    CJNE A,#00H,DOWN
    JMP UP
    JMP MAIN
    ; ==============
    DELAY:
    MOV R0,#5
    DL2:
    MOV R1,#200
    DL1:
    MOV R2,#249
    DJNZ R2,$
    DJNZ R1,DL1
    DJNZ R0,DL2
    RET
    END

  10. countdown-timer.net

    Countdown Timer Wallpapers soul always been an titillating countdown-timer.net attempt
    of any event. Investigating backwards to see how untold abstraction is unexpended before an event increases the
    anxiety of the prevision. It would be major if
    you had the chance to create your very own Digital Watch With Countdown Timer.
    A dolabriform to use cure you would like having.
    By but adding a widget you could relish the Countdown Timer
    Led on your covert.

  11. priyanga

    i want to interface apr 33a3 with microcontroller 8051….so im in need of source code….send me code to my mail as soon as possible….help me

  12. Nice one Sir . But do u have a C / C++ Code for the first circuit ( not the multiplexing one ) . Or anybody ??

  13. what is the program of 7 segment display where the 0 to 9 digit will be display in such a way that they display simulteneously in one display where odd no. and in second display where even no. are displays

  14. Mandar Kholgade

    Dear Sir,

    Its very good explanation of the seven segment Display. Pls highlight how the said Programme is Burnt and loaded in the controller 8051 in Hex Code.

  15. Jawad Ahmad

    how can i interface three seven segment to 8051 such that i get digits starting from 000 to 999 with a delay of 0.5 seconds ? plz send me the code

    • @Jawad – You may use multiplexed seven segment display (3 displays)

  16. Vaishali

    Sir,why the subroutine DISPLAY in the actual program is different from the above mentioned program

  17. Akshay N Sorathiya

    i want to make seven segment based digital clock using 8051 microcontroller,i have no program for circuit , can i get that??

  18. What about a code to multiplexed 7 segment display that counts to FF in HEX?

  19. hey,can any one help me to the programming of the 8051 to count up to 5 digit for metal detector circuit

  20. RAJAVARMA

    please write a program to display FIRE and HELP alternatly

  21. forgot ta add….the up and down counting should be on respective keypress.
    thanx!

  22. Hey, can anyone pls help me with a code for 8051 wherein i can count up and down upto 5 digits, and the display is to be on 5 multiplexed seven-segments.

  23. Nagaraj.T

    This was very usefull for me. And i want to know if i want to count down any where when the above program will be running. i will be using external interrupt for this to interrupt the micro controller to do count down task and it will down count up to zero then it should stop counting.

    please any one do help in this

    thanks

  24. can u tell me a embedded c program for realtime clock

  25. thankx alot for your detailed lecture. please sir, how do i cascade or multiplex or interface up to eight displays to one micro-controller to display an “eight-lettered” word, i need the circuit arrangement and program. Thankx and God bless.

  26. sir, how to display the all the 7 segement LED at a time sir…?
    i need to blink all the four 7segment led all of once.

  27. manish kumar

    Hi to all of you,

    I wants to know weather micro controller would be able to drive Seven segment display. It has source current in micro Amp.

  28. samarnath dev

    i use 4094b with common cathod fnd to 8051 #11010010B ;210D d2h for 4h show ,now i want to convert to hex so pleas help me as asm idia .

  29. laxmana rao

    sir,
    how to print 1 to 24 on seven segment display.
    here two switchs are there.
    first one is 1 to 24 print.(when ever this pin is press).
    second is number selection pin(when ever this pin is press).
    if it is 20 number select, clock will must be on . could plese send me source code
    thank you.

  30. thank you sir for great description!

    (Code snippet edited by Administrator)

    while compiling the above program ,error(variable or constant not found)is comming.please tell me how to fix it

    • Hi Suneel,

      I have edited the code snippet due to its length! However the error can be due to a reference to an undefined variable in the program. Just read through you codes twice to spot an undefined variable/constant.

  31. Jaisin jacob

    In interfacing 7 sdgment 8051,there are some one are earthed.what this exactly do?

  32. Ashwani Kumar Sharma

    Thanks sir the way of writting the article is awesome,thinge become pretty much easy after studying the articles.The articles have their practical side of own.

    • Hello Ashwani, Thanks for the nice words. Keep looking for more articles.

  33. dear sir, i dont understand very well the mova a,@a+pc, when the program is in this line, the pc is with value of 0bh, with the acc, will be 0bh+0aH = 15h, the db=3fh is in the 15h position? tks!

  34. i want to make a led display board which shows digits that are pressed on a tv remote .please guide..

    • fr tht u hav to intrface wit the keypad as well as seven segment.

  35. Manjinder

    You use wrong Seven segment display this is not CA this is CC Display

  36. Manjinder

    sir,
    due to the interrupt the brightness of seven segment displays(by using green leds) is decrease any idea to increase brightness of displays
    please help me

  37. namgvaerarak

    hey , thanks for the code , it sure does look like it will work 🙂
    hey i was wondering , i recently read the book 8051 mc and embedded systems and on page no 99 we have another code…
    ORG 0000H
    START : MOV R1,#10
    MOV DPTR,#400H
    BACK : CLR A
    MOVC A,@A+DPTR
    MOV P1,A
    ACALL DELAY
    INC DPTR
    DJNZ R1, BACK
    SJMP START

    ORG 0400H
    DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
    END

    plzz let me know whether this code could also work
    thanks a ton 🙂

    • @namgvaerarak – Logically it should work. I haven’t seen any errors in particular.

    • Sachin Shintre

      Sir
      I have connect the 7segment inter fessing ckt. but connect input as the microcontroller in IR transmeter using ic358 ckt. then how to changes in program

  38. G.Sai Pranav

    I have used edsim51 simulator to learn this module\run the program. But I have a faced a problem,in that simulator the 2’s compliment of the instruction DB 3F i.e DB C0 has to be written for getting the the display for 0.That means for the L.E.D to glow 0 has to be given to the respective pin not 1. Is it the fault of simulator or Is it my fault?

    • admin

      @G.Sai Pranav
      we have tested the circuit in real environment.
      different simulators have different specifications and you have to adjust the code accordingly.

    • That is because the simulator follows a common anode configuration. So a low to the respective pin needs to be provided to make the LED glow

  39. Srihari Rao

    Okay anyway thanks for the response.. 🙂 Waiting for more posts on microcontroller.

  40. Srihari Rao

    Sir i use NI Multisim 11.0 software to built these circuits in my PC. But when i checked this circuit in Multisim software it is not working. The seven segment is not displaying me the numbers. But the assembler results is showing zero errors and zero warnings. I want to know weather it is software fault or the circuit fault. If it is the software fault then please recommend me some software to build circuits like these.

    • @shrihari rao – We tested this circuit in a real environment. We have not used any simulators to test software/circuit. So I cant tell exactly which part is causing the problem.

  41. @shrihari -We have tested this circuit here in our lab. It worked really fine. The program we developed is perfect. Please tell what’s the problem you face??

  42. Srihari Rao

    Thanks for info.. 🙂 Want more posts like this.. 🙂