Interfacing 7 segment displays with AVR (ATmega32)
Recently, I had the opportunity to give a workshop on AVR microcontroller in American International University of Bangladesh (AIUB). I had prepared some codes for the conference, which I will share here.
7 Segment displays can be readily interfaced to the AVR by applying high or low output to their pins from an AVR. For my circuit I had used a common anode 7 seg display.
This figure shows the basic connection. To increase port usage, multiple 7 segment displays can be time multiplexed and the anode pin is controlled with a seperate pin. (This technique was actually shown to me first by my friend UM Omee)
The same block is copied to form this structure:
For accessing single pins of the portA, the SFR_MEM_ADDR command is used. The given code example uses only two seven segment displays. It is essentially a mod 100 counter.
7 Segment displays can be readily interfaced to the AVR by applying high or low output to their pins from an AVR. For my circuit I had used a common anode 7 seg display.
This figure shows the basic connection. To increase port usage, multiple 7 segment displays can be time multiplexed and the anode pin is controlled with a seperate pin. (This technique was actually shown to me first by my friend UM Omee)
The same block is copied to form this structure:
Finally the 7 segment displays are driven with the help of a ULN2803 IC. The 2803 is a combination of 8 darlington pair ICs, each capable of sinking 1000mA current.
The final circuit is shown as follows:
#include <avr/io.h>
#include <util/delay.h>
/* Code for single pin addressing */
typedef struct
{
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
}io_reg;
#define D0 ((volatile io_reg*)_SFR_MEM_ADDR(PORTA))->bit4
#define D1 ((volatile io_reg*)_SFR_MEM_ADDR(PORTA))->bit5
#define D2 ((volatile io_reg*)_SFR_MEM_ADDR(PORTA))->bit6
#define D3 ((volatile io_reg*)_SFR_MEM_ADDR(PORTA))->bit7
/* Code for 7 seg display */
static unsigned char SEVEN_SEG[] = {
0x3F,
0x06,
0x5B,
0x4F,
0x66,
0x6D,
0x7D,
0x07,
0x7F,
0x6F,
0x77,
0x7C,
0x39,
0x5E,
0x79,
0x71};
int main (void) {
unsigned char num = 0x01;
int i;
DDRB = 0xFF;
DDRA = 0xFF;
while (1) {
num ++;
if (num> 99) num = 0;
for (i=0; i<10; i++) {
D0=0;
D1=0;
PORTB = SEVEN_SEG[num%10];
D0=1;
D1=0;
_delay_ms(10);
D0=0;
D1=0;
PORTB = SEVEN_SEG[num/10];
D0=0;
D1=1;
_delay_ms(10);
}
}
}
So this is how the output looks like in Proteus:




do u help me to burn hex file into AT89C51 uc?
ReplyDeleteexcellent post about seven segment driving. especially the proteus simulation, the way shown is very nice. but i think u shouldn't provide delay of 1 sec
ReplyDeleteThank you very much its working
ReplyDeleteAwesome!
ReplyDeleteSajid, I want to build this project, but what is the value of the crystal and the value of the fuse bits? You you help me on these? Tq
ReplyDeleteIs the Proteus/isis project available. Thank you.
ReplyDeleteThx, nice code.
ReplyDeleteSad that y finish to write your blog, it was pretty useful.
Best regards
Toby, online data room
good night.. I'm useing the Max7221 but I've a question:
ReplyDeleteI put tow ic of max7221 and connect the output of the first one to input of the second and connect ss and clk.. my question is how I chose the second Ic to write data on it... the second 8 7segments
on avr studio - spi
thank you