Frequency counter with PIC16F628A




This is a frequency counter based on PIC16F628A. The original idea came from this project:LCD frequency counter. As you can see – very simple and yet elegant schematic. But I wanted to use 7-segment LED display, not LCD, so I found a second useful project: Simple 100MHz frequency counter which uses 6 digit LED display.


Combining two projects into one wasn’t very easy. First of all I wanted a PIC microcontroller to do the whole job without any additional ICs. Also I wanted to use the the familiar 16F628A, but because one of the portA pins (RA5) can be used only as input I was short of outputs to do the job. Driving 6 digit 7-segment multiplexed display requires 7 + 6 = 13 outputs. The 16F628A has 16 IO pins, two of which are used for the crystal oscillator, one is for the signal input and other one can be used only for input, that leaves us with only 12 useful IO pins. The solution was to drive one of the common cathodes with a transistor, which opens when all other digits are switched off.


7-segment displays used here are 3 digit multiplexed common cathode type (BC56-12SRWA). Digits 2..5 are switched on when respective pins are set low. When all these pins are high, the transistor Q1 opens and switches on the first digit. The current for each segment is about 6-7mA.

I must mention that pins connected to common cathodes theoretically may sink up to 50mA if all segments are light up (7x7mA). This is way above max specifications of the microcontroller. But as every digit is switched on for very brief moment I think it is safe. The whole schematic consumes around 30-40mA in average and the microcontroller is not heating at all, so everything seems OK.

The microcontroller uses its internal 4MHz oscillator for the CPU clock. Timer1 uses external crystal oscillator with frequency 32768Hz for setting the 1 second time interval. Timer0 is used to count the input signal at pin RA4. And finally, Timer2 is used for cycling and refreshing the digits. As the input signal will be 5Vpp square wave there isn’t any preamp or buffer in the front.

The counter can measure up to 920-930kHz which is more than enough for my project. The reason why it can’t go higher is because driving all these digits consumes lots of CPU cycles. I suppose, the program code can be optimized or even written in assembler and then the counter can reach 999999 Hz.

The crystals for 32768Hz are sold in two sizes : 2x6mm and 3x8mm. I recommend 2x6mm because it fits perfectly below the left display. The other size also can be used but it will lift a little the left display.








4 Response on “Frequency counter with PIC16F628A

    1. To do this you have to re-arrange the 7-segment driving pins of 16F628A to free pin 7 and 8 that are used for serial communication and modify the code of PIC mcu to send serial data on your Arduino RX/TX.

Leave a Reply