Для проекта на 8МГц. Ты решил через CCP1 но это геморный и ненужный путь
Кроме того ты инвертируешь неправильно.
Это утверждение, что 1 не 1. Оно не верно и все.
Вот тахометр с описанием. Используется ТМР0 для замера времени и INT0 прерывания для подсчета импульсов
//Для частоты 8МГц
//PC16F628A
//Переменная хранит счетчик таймера для подсчета точной секунды
unsigned long time;
//Счетчик импульса зажигания
unsigned counter;
//Переменная хранит обороты мотора
unsigned rpm;
//Буфер для ЖКИ
char out1[8];
//4 пробела для быстрой очистки 4 знаков оборотов, например если было 1000
//и стало 999, дабы убрать 0. Вызов LCD_CLEAR гораздо тормознее и будет виден
//как мигание
char clear[8]={" "};
//Инициализируем ЖКИ
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RA0_bit;
sbit LCD_D5 at RA1_bit;
sbit LCD_D6 at RA2_bit;
sbit LCD_D7 at RA3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISA0_bit;
sbit LCD_D5_Direction at TRISA1_bit;
sbit LCD_D6_Direction at TRISA2_bit;
sbit LCD_D7_Direction at TRISA3_bit;
void init()
{
//Запуск прерываний всех
GIE_bit = 1;
/* TMR0 */
TMR0IE_bit = 1;
TMR0IF_bit = 0;
//ТМР0 будет считать 1 секунду, из-за известного ограничения, чтобы считать
//точно, ТМР0 крутится без делителя и без управления сам по себе на полной
//скорости
T0CS_bit = 0;
T0SE_bit = 0;
PSA_bit = 1;
PS2_bit = 0;
PS1_bit = 0;
PS0_bit = 0;
//Единственная начальная установка счетчика
TMR0 = 0;
//Ногу RB0/INT ставим на вход, на неё будет подаваться импульсы тахометра
TRISB.RB0=1;
//Заводим ЖКИ
LCD_init();
//Ждем 0.1сек пока Экран запустится
delay_ms(100);
}
//Прерывания
void interrupt()
{
//На каждом переполнении ТМР0
if(TMR0IF_bit)
{
TMR0IF_bit=0;
//прибавляем значение 256 (8бит)
time+=256;
//Если для частоты 8МГц прошла 1 секунда
if(time >= 1000000)
{
//Вертаем назад, но не обнуляем, тем самым убирая любую ошибку
time -= 1000000;
//Сохраняем обороты
rpm=counter;
//Обнуляем счетчик
counter=0;
}
}
//На каждом импульсе на ноге
if (INTF_bit)
{
INTF_bit = 0;
//Инкрементируем. Для 4-х цилиндров ничего делать не надо
//Тут итак будет F/2
counter++;
}
}
void main()
{
//Собственно, инициализируем всё железо
init();
//Очищаем экран
lcd_cmd(_LCD_CLEAR);
//Выключаем курсор
lcd_cmd(_LCD_CURSOR_OFF);
//Раз и навсегда вывдим на экран RPM:
lcd_out(1,1,"RPM:"

;
//Бесконечный цикл
for(;; )
{
//Обновляем экран раз в секунду
delay_ms(1000);
//Умножаем на 60 и получаем об/мин
rpm*=60;
//Конвертим обороты в строку
IntToStr(rpm,out1);
//Удаляем незначащие пробелы слева
lTrim(out1);
//Убираем старое значение всегда, для простоты
lcd_out(1,5,clear);
//Выводим на экран обороты
lcd_out(1,5,out1);
}
}