Đây là chương trình điều chế xung PWM trên chân RC2/CCP1 và đếm xung từ chân RC1/T1OSI/CCP2 hiển thị lên 4led7 thanh. Mình dùng Encoder 100 lỗ mượn của bạn

.
Code:
#include<pic.h>
__CONFIG(HS & PWRTEN & BOREN & LVPDIS & WDTDIS );
const unsigned char Font[]={ 0b00000011, 0b10011111, 0b00100101, 0b00001101, 0b10011001,\
0b01001001, 0b01000001, 0b00011111, 0b00000001, 0b00001001};
// Chuyen doi
void Convert(unsigned char *a,unsigned char index, unsigned int number){
unsigned char i;
for(i=0;i< index; i++){
*(a+i) = number%10;
number = number/10;
};
}
//===== Ham khoi tao
void interrupt MyInt(void){
static volatile unsigned int counter1, counter2, counter3;//, counterTimer1;
unsigned int temp;
// counter1 dem so lan Timer0 tran
// counter2 dem so lan ca 4 led7 thanh duoc quet
static volatile unsigned int number;
static volatile unsigned char a[4]={0,0,0,0};
static volatile unsigned char j,k; // bien dem kiem tra xem led nao duoc quet
if(T0IF & T0IE){
TMR0 = 6;
T0IF = 0 ;// xoa co ngat
++counter1;
if( counter1 == 5){
counter1 = 0;
PORTD = 0xFF;
PORTA = 0xFF - (1<<(5- j)) ;
PORTD = Font[a[j]];
if( j==2) RD0= 0;
if(++j==4) j=0;
};
if(++counter2 == 200){
number = (TMR1H << 8) | TMR1L;
// gia tri toc do trong 1s = number * 1000/(100 * counter2 ) (vong/s)
number = number * 5 ; //= number *0.0 5 vong/s => * 5vong/s de hien thi len 4led
TMR1ON = 0 ; // ngung Timer1
TMR1H = TMR1L = 0;
TMR1ON = 1 ; // bat lai Timer1
if(number>9999) number= 0;
counter2 = 0;
Convert(a, 4, number);
};
if(++counter3 == 1000){
k = 70;
counter3 = 0;
temp = 4* (PR2 + 1) * k/100;
CCPR1L = temp>>2;
CCP1Y = temp - ((temp>>1)<<1);//temp%2;
CCP1X = (temp>>1)%2;
//k += 10; // tang 10%
//if( k > 100) k=0;
};
};
}
//------------------------------------init
void init(void){
//===== init for PWM
// PWM Period = [ PR2 +1 ] x 4 x Tosc x (TMR2 Prescaler Value)
PR2 = 82; // Tan so = 15 KHz, TMR2 Prescaler Value = 4
// PWM Duty Cycle = [ CCPR1L : CCP1CON<5:4>) x Tosc x (TMR2 Prescaler Value)
// => CCPR1L : CCP1CON<5:4> = k% x (TMR2 + 1 ) x 4;
CCPR1L = 0;
TRISC2 = 0; // RC2 la output
RC2 = 1;
T2CON = 0b00000101; // Timer2 on, TMR2 Prescaler Value = 4
CCP1CON = 0b00001100; // CCP1 hoat dong trong che do PWM
//================= init for PORTs
OPTION = 0b00000000;
ADCON1 = 0b00000111;
TRISA = 0b00000000;
TRISD = 0b00000000;
PORTD = Font[0];
//================ Khoi tao cho Timer0
GIE = 1;
T0IE = 1;
TMR0 = 6;
// ========= Khoi tao cho dem Timer1
TMR1CS = 1; // Timer1 hoat dong o che do Counter Mode
T1SYNC = 1; // TMR1 hoat dong o che do dem khong dong bo
T1OSCEN = 1; // Dem xung tu chan RC1/T1OSI/CCP2
T1CKPS1 = T1CKPS0 = 0; // Chon Prescaler = 1:1
TMR1H = TMR1L = 0;
TMR1IE = 0 ; // Khong dung ngat Timer1
TMR1ON = 1; // Bat Timer1
}
//------------------------------------MAIN
void main(){
init();
while(1);
}
// == Kết thúc
Chúc các bạn thành công.