View Single Post
Old 12-03-2006, 04:18 PM   #2
ngohaibac
Đệ tử 9 túi
 
ngohaibac's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: BKHN
Bài gửi: 231
:
Send a message via Yahoo to ngohaibac
Đâ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?
ngohaibac vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn