Using PIC16F877A and 7-segment display we can build a digital counter that counts from 0 to 9999 with a button to increment the displayed number. The same thing as on the following topic where the microcontroller PIC16F84A was used.
PIC16F84A 7-Segment display example – 4-Digit digital counter with CCS
We are going to see circuits and C codes for both 7-segment display types, common anode and common cathode.
Digital counter using common anode 7-segment display:
Circuit schematic for interfacing PIC16F877A with common anode 7-segment display is shown below:
The button is used to increment the displayed number.
The PIC16F877A microcontroller needs +5V between pins VDD (#11) and VSS (#12).
Digital counter using common anode 7-segment display CCS C code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | // 4-Digit digital counter using PIC16F877A // Common anode 7-segment display // http://simple-circuit.com/ #include <16F877A.h> #use delay(crystal=8000000) short s; // Used to know button position unsigned int digit, digit1, digit10, digit100,digit1000; unsigned long i = 0; 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_D0) == 1) s = 1; if(s == 1) { if(input(PIN_D0) == 0) { s = 0; i++; if(i > 9999) i = 0; } } digit = i % 10; digit1 = seg(digit); output_c(0x0F); // Turn off all displays output_b(digit1); // Send ones digit output_c(0x07); // Turn on display for ones delay_ms(2); digit = (i / 10) % 10; digit10 = seg(digit); output_c(0x0F); // Turn off all displays output_b(digit10); // Send tens digit output_c(0x0B); // Turn on display for tens delay_ms(2); digit = (i / 100) % 10; digit100 = seg(digit); output_c(0x0F); // Turn off all displays output_b(digit100); // Send hundreds digit output_c(0x0D); // Turn on display for hundreds delay_ms(2); digit = (i / 1000) % 10; digit1000 = seg(digit); output_c(0x0F); // Turn off all displays output_b(digit1000); // Send thousands digit output_c(0x0E); // Turn on display for thousands delay_ms(2); } } |
Digital counter using common cathode 7-segment display:
Circuit schematic of the common cathode is a little bit different from the common anode one as shown below:
The PIC16F877A microcontroller needs +5V between pins VDD (#11) and VSS (#12).
Digital counter using common cathode 7-segment display CCS C code:
The code is also has some differences from the common anode code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | // 4-Digit digital counter using PIC16F877A // Common cathode 7-segment display // http://simple-circuit.com/ #include <16F877A.h> #use delay(crystal=8000000) short s; // Used to know button position unsigned int digit, digit1, digit10, digit100,digit1000; unsigned long i = 0; 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_D0) == 1) s = 1; if(s == 1) { if(input(PIN_D0) == 0) { s = 0; i++; if(i > 9999) i = 0; } } digit = i % 10; digit1 = seg(digit); output_c(0); // Turn off all displays output_b(digit1); // Send ones digit output_c(8); // Turn on display for ones delay_ms(2); digit = (i / 10) % 10; digit10 = seg(digit); output_c(0); // Turn off all displays output_b(digit10); // Send tens digit output_c(4); // Turn on display for tens delay_ms(2); digit = (i / 100) % 10; digit100 = seg(digit); output_c(0); // Turn off all displays output_b(digit100); // Send hundreds digit output_c(2); // Turn on display for hundreds delay_ms(2); digit = (i / 1000) % 10; digit1000 = seg(digit); output_c(0); // Turn off all displays output_b(digit1000); // Send thousands digit output_c(1); // Turn on display for thousands delay_ms(2); } } |
Digital counter using PIC16F877A and 7-segment display video:
The following video shows a hardware circuit for the discussed counter.
Discover more from Simple Circuit
Subscribe to get the latest posts sent to your email.