Digital counter using PIC18F4550 and CCS PIC C compiler
This is a small topic shows the interfacing of the microcontroller PIC18F4550 with 7-segment display and make a 4-digit counter with pushbutton.Related topics:
4-Digit 7-segmant display counter using PIC16F84A and CCS PIC C compiler
4-Digit digital counter using PIC16F877A and CCS C compiler
Interfacing PIC18F4550 with 7-segment display circuit:
The digital counter circuit schematic is shown below where the internal oscillator of PIC18F4550 is used at 8MHz and MCLR pin function is disabled.
The 7-segment display is common anode.
Interfacing PIC18F4550 with 7-segment display CCS C code:
// Interfacing PIC18F4550 with 7-segment display
// Common anode 7-segment display used
// http://ccspicc.blogspot.com/
// electronnote@gmail.com
#include <18F4550.h>
#fuses NOMCLR INTRC_IO
#use delay(clock=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(){
setup_oscillator(OSC_8MHZ);
while(TRUE){
if(input(PIN_D4) == 1)
s = 1;
if(s == 1) {
if(input(PIN_D4) == 0) {
s = 0;
i++;
if(i > 9999)
i = 0;
}
}
digit = i % 10;
digit1 = seg(digit);
output_d(0x0F); // Turn off all displays
output_b(digit1); // Send ones digit
output_d(0x07); // Turn on display for ones
delay_ms(2);
digit = (i / 10) % 10;
digit10 = seg(digit);
output_d(0x0F); // Turn off all displays
output_b(digit10); // Send tens digit
output_d(0x0B); // Turn on display for tens
delay_ms(2);
digit = (i / 100) % 10;
digit100 = seg(digit);
output_d(0x0F); // Turn off all displays
output_b(digit100); // Send hundreds digit
output_d(0x0D); // Turn on display for hundreds
delay_ms(2);
digit = (i / 1000) % 10;
digit1000 = seg(digit);
output_d(0x0F); // Turn off all displays
output_b(digit1000); // Send thousands digit
output_d(0x0E); // Turn on display for thousands
delay_ms(2);
}
}
The following video shows this project in a hardware circuit.