7 segments can be driven using many different techniques in conjunction with software and hardware. Multiplexing is one of the most popular methods used to drive a 7 segment display when there are limited no of I/O pins.It uses the concept of POV(persistence of vision) where the human brain cannot detect the flickering of display when the refresh rate is very high(~50Hz).In this method the fundamental logic is to enable or disable the segment blocks at a very high speed at precise time slices.
In case of Raspberry Pi there are limited no of I/O pins, hence we will use multiplexing. WiringPi is perfect for this job as it uses Arduino like code and the code executes at a higher priority. Display used in this example is of common cathode type.Make sure you have the right 7 segment display,else you will end up getting random segments turned on.For pin mapping check the code below:-
Compile the code as...
gcc -o display segment.c -L/usr/local/lib -lwiringPi
Now execute it...
sudo ./display
In case of Raspberry Pi there are limited no of I/O pins, hence we will use multiplexing. WiringPi is perfect for this job as it uses Arduino like code and the code executes at a higher priority. Display used in this example is of common cathode type.Make sure you have the right 7 segment display,else you will end up getting random segments turned on.For pin mapping check the code below:-
Code:-
#include <wiringPi.h>
#include <stdio.h>
#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
#define SEGMENT_ON LOW
#define SEGMENT_OFF HIGH
int SEGMENT_1=7;
int SEGMENT_2=11;
int SEGMENT_3=13;
int SEGMENT_4=15;
int SEGMENT_A=3;
int SEGMENT_B=5;
int SEGMENT_C=18;
int SEGMENT_D=19;
int SEGMENT_E=23;
int SEGMENT_F=24;
int SEGMENT_G=25;
void display_number(int num)
{
pinMode(SEGMENT_1,OUTPUT);
pinMode(SEGMENT_2,OUTPUT);
pinMode(SEGMENT_3,OUTPUT);
pinMode(SEGMENT_4,OUTPUT);
long start=millis();
for(int i=4;i>0;i--)
{
switch(i)
{
case 1:
digitalWrite(SEGMENT_1,DIGIT_ON);
break;
case 2:
digitalWrite(SEGMENT_2,DIGIT_ON);
break;
case 3:
digitalWrite(SEGMENT_3,DIGIT_ON);
break;
case 4:
digitalWrite(SEGMENT_4,DIGIT_ON);
break;
}
print_number(num%10);
num/=10;
delayMicroseconds(DISPLAY_BRIGHTNESS);
print_number(10);
digitalWrite(SEGMENT_1,DIGIT_OFF);
digitalWrite(SEGMENT_2,DIGIT_OFF);
digitalWrite(SEGMENT_3,DIGIT_OFF);
digitalWrite(SEGMENT_4,DIGIT_OFF);
}
while((millis()-start)<10);
}
void print_number(int num)
{
pinMode(SEGMENT_A,OUTPUT);
pinMode(SEGMENT_B,OUTPUT);
pinMode(SEGMENT_C,OUTPUT);
pinMode(SEGMENT_D,OUTPUT);
pinMode(SEGMENT_E,OUTPUT);
pinMode(SEGMENT_F,OUTPUT);
pinMode(SEGMENT_G,OUTPUT);
switch(num)
{
case 0:
digitalWrite(SEGMENT_A,SEGMENT_ON);
digitalWrite(SEGMENT_B,SEGMENT_ON);
digitalWrite(SEGMENT_C,SEGMENT_ON);
digitalWrite(SEGMENT_D,SEGMENT_ON);
digitalWrite(SEGMENT_E,SEGMENT_ON);
digitalWrite(SEGMENT_F,SEGMENT_ON);
digitalWrite(SEGMENT_G,SEGMENT_OFF);
break;
case 1:
digitalWrite(SEGMENT_A,SEGMENT_OFF);
digitalWrite(SEGMENT_B,SEGMENT_ON);
digitalWrite(SEGMENT_C,SEGMENT_ON);
digitalWrite(SEGMENT_D,SEGMENT_OFF);
digitalWrite(SEGMENT_E,SEGMENT_OFF);
digitalWrite(SEGMENT_F,SEGMENT_OFF);
digitalWrite(SEGMENT_G,SEGMENT_OFF);
break;
case 2:
digitalWrite(SEGMENT_A,SEGMENT_ON);
digitalWrite(SEGMENT_B,SEGMENT_ON);
digitalWrite(SEGMENT_C,SEGMENT_OFF);
digitalWrite(SEGMENT_D,SEGMENT_ON);
digitalWrite(SEGMENT_E,SEGMENT_ON);
digitalWrite(SEGMENT_F,SEGMENT_OFF);
digitalWrite(SEGMENT_G,SEGMENT_ON);
break;
case 3:
digitalWrite(SEGMENT_A,SEGMENT_ON);
digitalWrite(SEGMENT_B,SEGMENT_ON);
digitalWrite(SEGMENT_C,SEGMENT_ON);
digitalWrite(SEGMENT_D,SEGMENT_ON);
digitalWrite(SEGMENT_E,SEGMENT_OFF);
digitalWrite(SEGMENT_F,SEGMENT_OFF);
digitalWrite(SEGMENT_G,SEGMENT_ON);
break;
case 4:
digitalWrite(SEGMENT_A,SEGMENT_OFF);
digitalWrite(SEGMENT_B,SEGMENT_ON);
digitalWrite(SEGMENT_C,SEGMENT_ON);
digitalWrite(SEGMENT_D,SEGMENT_OFF);
digitalWrite(SEGMENT_E,SEGMENT_OFF);
digitalWrite(SEGMENT_F,SEGMENT_ON);
digitalWrite(SEGMENT_G,SEGMENT_ON);
break;
case 5:
digitalWrite(SEGMENT_A,SEGMENT_ON);
digitalWrite(SEGMENT_B,SEGMENT_OFF);
digitalWrite(SEGMENT_C,SEGMENT_ON);
digitalWrite(SEGMENT_D,SEGMENT_ON);
digitalWrite(SEGMENT_E,SEGMENT_OFF);
digitalWrite(SEGMENT_F,SEGMENT_ON);
digitalWrite(SEGMENT_G,SEGMENT_ON);
break;
case 6:
digitalWrite(SEGMENT_A,SEGMENT_ON);
digitalWrite(SEGMENT_B,SEGMENT_OFF);
digitalWrite(SEGMENT_C,SEGMENT_ON);
digitalWrite(SEGMENT_D,SEGMENT_ON);
digitalWrite(SEGMENT_E,SEGMENT_ON);
digitalWrite(SEGMENT_F,SEGMENT_ON);
digitalWrite(SEGMENT_G,SEGMENT_ON);
break;
case 7:
digitalWrite(SEGMENT_A,SEGMENT_ON);
digitalWrite(SEGMENT_B,SEGMENT_ON);
digitalWrite(SEGMENT_C,SEGMENT_ON);
digitalWrite(SEGMENT_D,SEGMENT_OFF);
digitalWrite(SEGMENT_E,SEGMENT_OFF);
digitalWrite(SEGMENT_F,SEGMENT_OFF);
digitalWrite(SEGMENT_G,SEGMENT_OFF);
break;
case 8:
digitalWrite(SEGMENT_A,SEGMENT_ON);
digitalWrite(SEGMENT_B,SEGMENT_ON);
digitalWrite(SEGMENT_C,SEGMENT_ON);
digitalWrite(SEGMENT_D,SEGMENT_ON);
digitalWrite(SEGMENT_E,SEGMENT_ON);
digitalWrite(SEGMENT_F,SEGMENT_ON);
digitalWrite(SEGMENT_G,SEGMENT_ON);
break;
case 9:
digitalWrite(SEGMENT_A,SEGMENT_ON);
digitalWrite(SEGMENT_B,SEGMENT_ON);
digitalWrite(SEGMENT_C,SEGMENT_ON);
digitalWrite(SEGMENT_D,SEGMENT_ON);
digitalWrite(SEGMENT_E,SEGMENT_OFF);
digitalWrite(SEGMENT_F,SEGMENT_ON);
digitalWrite(SEGMENT_G,SEGMENT_ON);
break;
case 10:
digitalWrite(SEGMENT_A,SEGMENT_OFF);
digitalWrite(SEGMENT_B,SEGMENT_OFF);
digitalWrite(SEGMENT_C,SEGMENT_OFF);
digitalWrite(SEGMENT_D,SEGMENT_OFF);
digitalWrite(SEGMENT_E,SEGMENT_OFF);
digitalWrite(SEGMENT_F,SEGMENT_OFF);
digitalWrite(SEGMENT_G,SEGMENT_OFF);
break;
}
}
int main(void)
{
printf("7 Segment Multiplexing using Raspberry Pi\n") ;
if(getuid()!=0) //wiringPi requires root privileges
{
printf("Error:wiringPi must be run as root.\n");
return 1;
}
if(wiringPiSetup()==-1)
{
printf("Error:wiringPi setup failed!\n");
return 1;
}
int counter=0;
for(;;)
{
display_number(counter++);
delay(1000);
if(counter>9999)
counter=0;
}
return 0;
}
Compile the code as...
gcc -o display segment.c -L/usr/local/lib -lwiringPi
Now execute it...
sudo ./display

You don't happen to have a wiring diagram for this setup?
ReplyDeleteWiring is very simple...Go through the code and you will get it...If you need help PM me
Delete