View Single Post
Old 05-01-2007, 03:54 PM   #19
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
Quét led7 thanh.

Sau đây mình copy một số bài bên dientuvietnam.net sang đây và trả lời từng câu hỏi mà các bạn hỏi nhé.

Rảnh rỗi ngồi viết chương trình hiển thị led7 thanh chơi chơi. Ở đây em chỉ dùng 1 led thôi cho đơn giản. Còn việc quét led đã viết ở các bài trước rùi .

Đây là sơ đồ nguyên lý:

Tiếp theo là chương trình bằng HTPIC:

Code:
#include<pic.h>
__CONFIG(HS & PWRTEN & BOREN & LVPDIS & WDTDIS );

// bộ font cho led7 
const unsigned char Font[]={ 0b00000011, 0b10011111, 0b00100101, 0b00001101, 0b10011001,\
							0b01001001, 0b01000001, 0b00011111, 0b00000001, 0b00001001};
void init(void)
	{
		//-------------------------init for PORTs
		OPTION = 0b00000000; // dùng Prescaler với k= 1:2
		TRISD	= 0b00000000;
		TRISE	= 0b11111111;
		PORTD = Font[0] ; // ban đầu cho hiển thị số 0
		//-------------------------init for interrupt vầ timer0
		GIE	= 1; // cho phép ngắt toàn cục
		T0IE    = 1;  // cho phép ngắt timer0
		TMR0    = 6;  // đặt giá trị đầu cho TMR0
	}

void interrupt MyInt(void){
	static int counter;  // biến đếm sự kiện ngắt timer
	static unsigned char i;  // biến đếm số đang hiển thị trên led
	if (T0IF  &  T0IE){  // nếu có ngắt
		T0IF = 0 ;
		TMR0 = 6;
		++ counter;
		if( counter == 1000){  // cứ 1s thì hiển thị hiển thị tiếp
			counter = 0 ;  // reset lại bộ đếm
			PORTD = Font[i++];
			if( i ==10) i = 0;
		};
	};
}

void main(){
	init();
	while(1);
}
Chương trình trên cực kỳ đơn giản song chỉ có một câu lệnh cần chú ý là:
Code:
if (T0IF  &  T0IE){
vì timer0 tự chạy nên cờ T0IF liên tục set lên khi đó nếu không phải là ngắt timer0 mà là một ngắt khác xảy ra. Khi đó trong hàm ngắt chương trình sẽ thử điều kiện T0IF = = 1 sẽ đúng. Nếu chúng ta chỉ dùng là
Code:
 if (T0IF)
thì tất nhiên là điều kiện thử đúng và sẽ thực hiện chương trình trong if .

Nếu lúc đó ta đã disable ngắt timer0 mà giờ nó lại thực hiện chương trình trong timer0 thì chương trình chạy quá sai rùi. Đây là chú ý của anh BA . Nếu không nhận ra thì có khi sai nhiều đó . Khi chúng ta viết chương trình ngắt trong ngắt thì sẽ thấy điều này .

Chúc các bạn thành công.

thay đổi nội dung bởi: ngohaibac, 05-01-2007 lúc 04:00 PM.
ngohaibac vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn