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à:
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à
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.