Saturday, December 08, 2012

EMBEDDED SYSTEMS TUTORIAL6- INTERFACING 7 SEGMENT DISPLAY WITH AVR



Hii… friends its our next AVR tutorial this time we are going to discuss about interfacing of 7 segment display with a AVR. You must have seen 7 segment display in you house hold inverters, in a zerox machine or even on your microwave oven. So in this tutorial , We will discuss about 7 segment display  , its types and its interfacing with AVR along with source code so have a look…J

INTROUCTION
A seven segment display is the most basic electronic display device that can display digits from 0-9. They find wide application in devices that display numeric information like digital clocks, radio, microwave ovens, electronic meters etc. The most common configuration has an array of eight LEDs arranged in a special pattern to display these digits. They are laid out as a squared-off figure ‘8’. Every LED is assigned a name from 'a' to 'g'  and 'dp'and is identified by its name. Seven LEDs 'a' to 'g' are used to display the numerals while eighth LED 'dp' is used to display the dot/decimal. 
       

 PACKAGE AND TYPES

A seven segment is generally available in ten pin package. While eight pins correspond to the eight LEDs, the remaining two pins (at middle) are common and internally shorted. These segments come in two configurations, namely, Common cathode (CC) and Common anode (CA). In CC configuration, the negative terminals of all LEDs are connected to the common pins. The common is connected to ground and a particular LED glows when its corresponding pin is given high. In CA arrangement, the common pin is given a high logic and the LED pins are given low to display a number.



HOW IT WORKS

Now let us suppose a digit is to be displayed on the 7 segment. Suppose the digit is 1 in such case LEDS corresponding b and c should glow, so we can say foe each and every digit a specific set of LEDs has to glow . the LEDs to be golw with corresponding digits
Are as shown.

     

INTERFACING WITH AVR MICROCONTROLLER

Here is step wise process for inTERfacing a 7 segment display with AVR microcontroller( ATMEGA 16)

SETP 1
CICUIT CONNECTION
Here we are using a common anode 7 segment display.
Connect your 7 segment display with the atmega 16 as per the connections shown in the diagram below



STEP 2

SOURCE CODE

Create the new project in AVR STUDIO4 and compile the code written below-



/*

A simple program for interfacing common anode seven segment display with AVR microcontroller



a->PD7
b->PD6
c->PD5
d->PD4

e->PD3
f->PD2
g->PD1
DP->PD0

Written by: ABHILASH DIXIT
            TECH_STRONG

*/

#include <avr/io.h>
#include <util/delay.h>

// You can change the 7 segement display port just by changing the port in this macro

#define SEVEN_SEGMENT_PORT PORTC
#define SEVEN_SEGMENT_DDR DDRC


void Seven_Segment_display(uint8_t n,uint8_t dp)
{
/*
This function writes a digit given by n to the display

the decimal point is displayed if dp=1

Note:
n must be less than 9
*/
   if(n<10)
   {
      switch (n)
      {
         case 0:
         SEVEN_SEGMENT_PORT=0b00000011;
         break;

         case 1:
         SEVEN_SEGMENT_PORT=0b10011111;
         break;

         case 2:
         SEVEN_SEGMENT_PORT=0b00100101;
         break;

         case 3:
         SEVEN_SEGMENT_PORT=0b00001101;
         break;

         case 4:
         SEVEN_SEGMENT_PORT=0b10011001;
         break;

         case 5:
         SEVEN_SEGMENT_PORT=0b01001001;
         break;

         case 6:
         SEVEN_SEGMENT_PORT=0b01000001;
         break;

         case 7:
         SEVEN_SEGMENT_PORT=0b00011111;
         break;

         case 8:
         SEVEN_SEGMENT_PORT=0b00000001;
         break;

         case 9:
         SEVEN_SEGMENT_PORT=0b00001001;
         break;
      }
      if(dp)
      {
         //if decimal point should be displayed

         //make 0th bit Low
         SEVEN_SEGMENT_PORT&=0b11111110;
      }
   }
   else
   {
      //This symbol on display tells that n was greater than 9
      //so display can't handle it

      SEVEN_SEGMENT_PORT=0b11111101;
   }
}


void Wait()
{
// An approx one second delay for   1Mhz CPU clock
   uint8_t i;
   for(i=0;i<1302;i++)
   {
      _delay_loop_2(0);
   }
}


void main()
{
   //Setup
   SEVEN_SEGMENT_DDR=0xFF;    //All output
   SEVEN_SEGMENT_PORT=0xFF;   //All segments off

   uint8_t count=0;


   while(1)
   {
   Seven_Segment_display(count,0);
       count=count+1;
      if(count>9)
      {
         count=0;
      }

     _delay_ms(300);
     }
   
}
 
     
In this program first we have created a function to display digits named seven_segment_display, then we have passed two argument first to display numbers and other to display decimal point if we want. We are going to connect our 7 segment at PORT C, so we will make it output port and after that the corresponding pins connected to 7 segment pins are set to high or low according to number to be displayed. This program will display the no from 0 t0 9 and as it reaches to 9 , it will be reset to 0.   You can change numbering sequence or display only odd or odd number or whatever you want just by some small changes in the source code according to your task.

               Now burn the microcontroller with the hex file generated and power up your circuit , you will see numbers displaying from 0 to 9.


So we have learnt the basics of 7 segment display interfacing, we can more 7 seven segment display with a AVR but for that we will need multiplexing technique, we will discuss multiplexing in upcoming tutorials but before that we have to discuss about TIMER in AVR so in next tutorial we will discuss about TIMER s.
    I hope you found this article useful , in case of any doubt, question or critical view , just leave a comment.

    THNX..:)

No comments:

Post a Comment