Đây là chương trình dùng ngắt timer0.
Code:
#include<pic.h>
__CONFIG(HS & PWRTEN & BOREN & LVPDIS & WDTDIS );
//================================================================
// Hàm ng?t Timer0
void interrupt inter0(void){
static unsigned char i;
static unsigned int counter; // bien dem su kien ngat timer0
if(T0IF){ // neu co ngat Timer0 xay ra
++ counter;
if(counter == 500){
PORTD = (1<<i) + (1<<(7-i));
++i;
if(i==8) i=0;
counter = 0;
};
TMR0 = 6;
T0IF = 0 ; // xoa co ngat, cong viec khong the thieu sau ham ngat
};
}
// == Ham khoi tao cho chip PIC16F877A
void init(void){
// Khoi tao I/O cho cac port
TRISD = 0x00;// PortD as output
// Khoi tao cho cac thanh ghi
OPTION = 0x00; // dung prescaler cho timer0 voi ti le la 1:2
// Khoi tao cho ngat Timer0
GIE = 1; // cho phep ngat toan cuc
T0IE = 1; // cho phep ngat timer0
T0IF = 0; // xoa co ngat
TMR0 = 6; // khoi tao
}
// Chuong trinh chinh
void main(void){
init();
while(1); // de con tro PC khong nhay lung tung,con lam gi thi lam :D
}
Thuật giải của chương trình dùng ngắt đó là: dùng một biến tĩnh kiểu static để đếm số lần xuất hiện ngắt timer0.
Trong chương trình này mình sau 500 ngắt timer0 thì mới quét led1 lần.
Ngoài ra cũng dùng thêm biến static i để biết được đang quét led nào. Do đó dùng ngắt sẽ tiện hơn nhiều. Và dùng đếm sự kiện ngắt thì ta có thể không cần dùng Prescaler với tỉ lệ quá cao, tránh được sai số nhiều.
Không biết mọi người có ý kiến thế nào?