Interface PIC16F84A with 7-segmant display
This topic shows how to build a digital counter that counts from 0 to 9999 using PIC16F84A microcontroller and CCS PIC C compiler. The 4-digit 7-segment display uses multiplexing technique which means all the data lines from a to g are connected together for all the four digits. We will see circuit and code for both types of the 7-segment display common anode and common cathode.The following video shows a hardware circuit of the digital counter:
In common anode 7-segment display type all the 7 LED's anodes are connected together.
Interfacing PIC16F84A with common anode 7-segmant display (digital counter circuit) circuit schematic is below.
If the button which is connected to RB7 pressed the displayed number will increment by 1.
4-Digit common anode 7-segment display counter interfacing with PIC16F84A CCS C code:
// 4-Digit digital counter using PIC16F84A
// http://ccspicc.blogspot.com/
// electronnote@gmail.com
#include <16F84A.h>
#fuses HS,NOWDT,PUT,NOPROTECT
#use delay(crystal=8000000)
short s; // Used to know button position
unsigned int digit, digit1, digit10, digit100,digit1000;
unsigned long i;
unsigned int seg(unsigned int num) {
switch (num) {
case 0 : return 0xC0;
case 1 : return 0xF9;
case 2 : return 0xA4;
case 3 : return 0xB0;
case 4 : return 0x99;
case 5 : return 0x92;
case 6 : return 0x82;
case 7 : return 0xF8;
case 8 : return 0x80;
case 9 : return 0x90;
}
}
void main() {
while(TRUE) {
if(input(PIN_B7) == 1)
s = 1;
if(s == 1) {
if(input(PIN_B7) == 0) {
s = 0;
i++;
if(i > 9999)
i = 0;
}
}
digit = i % 10;
digit1 = seg(digit);
output_a(0x0F); // Turn off all displays
output_b(digit1); // Send ones digit
output_a(0x07); // Turn on display for ones
delay_ms(5);
digit = (i / 10) % 10;
digit10 = seg(digit);
output_a(0x0F); // Turn off all displays
output_b(digit10); // Send tens digit
output_a(0x0B); // Turn on display for tens
delay_ms(5);
digit = (i / 100) % 10;
digit100 = seg(digit);
output_a(0x0F); // Turn off all displays
output_b(digit100); // Send hundreds digit
output_a(0x0D); // Turn on display for hundreds
delay_ms(5);
digit = (i / 1000) % 10;
digit1000 = seg(digit);
output_a(0x0F); // Turn off all displays
output_b(digit1000); // Send thousands digit
output_a(0x0E); // Turn on display for thousands
delay_ms(5);
}
}
Interface PIC16F84A with common cathode 7-segmant display:
In common cathode 7-segment display type all the 7 LED's cathodes are connected together.
The following circuit schematic is for 4-digit digital counter counts from 0 to 9999, the number is incremented when button is pressed.
4-Digit common cathode 7-segment display counter interfacing with PIC16F84A CCS C code:
// 4-Digit digital counter using PIC16F84A
// Common cathode 7-segment display
// http://ccspicc.blogspot.com/
// electronnote@gmail.com
#include <16F84A.h>
#fuses HS,NOWDT,PUT,NOPROTECT
#use delay(crystal=8000000)
short s; // Used to know button position
unsigned int digit, digit1, digit10, digit100,digit1000;
unsigned long i;
unsigned int seg(unsigned int num) {
switch (num) {
case 0 : return 0x3F;
case 1 : return 0x06;
case 2 : return 0x5B;
case 3 : return 0x4F;
case 4 : return 0x66;
case 5 : return 0x6D;
case 6 : return 0x7D;
case 7 : return 0x07;
case 8 : return 0x7F;
case 9 : return 0x6F;
}
}
void main() {
while(TRUE) {
if(input(PIN_B7) == 1)
s = 1;
if(s == 1) {
if(input(PIN_B7) == 0) {
s = 0;
i++;
if(i > 9999)
i = 0;
}
}
digit = i % 10;
digit1 = seg(digit);
output_a(0); // Turn off all displays
output_b(digit1); // Send ones digit
output_a(8); // Turn on display for ones
delay_ms(5);
digit = (i / 10) % 10;
digit10 = seg(digit);
output_a(0); // Turn off all displays
output_b(digit10); // Send tens digit
output_a(4); // Turn on display for tens
delay_ms(5);
digit = (i / 100) % 10;
digit100 = seg(digit);
output_a(0); // Turn off all displays
output_b(digit100); // Send hundreds digit
output_a(2); // Turn on display for hundreds
delay_ms(5);
digit = (i / 1000) % 10;
digit1000 = seg(digit);
output_a(0); // Turn off all displays
output_b(digit1000); // Send thousands digit
output_a(1); // Turn on display for thousands
delay_ms(5);
}
}