Sunday, March 13, 2016

Interfacing PIC18F4550 with 7-segment display CCS C


Digital counter using PIC18F4550 and CCS PIC C compiler
pic18f4550 projects 7 segment display ccs pic c code 
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.microcontroller pic18f4550 with 7 segment display counter ccs pic c
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.