PDA

View Full Version : Xin hỏi về cờ ngắt trong interrupt


boy_legend
20-06-2012, 06:55 PM
Mình có 3 đoạn code CCS cho PIC6F877A trong ,ví dụ sau:
Đoạn code thứ 1:
#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
{
//Kiem tra sw1
{
if(RB4==0)
{
led=0b00000001; //led1 sang
speed=250;
}
}
//Kiem tra sw2
.
.
.
//Kiem tra sw4

}
RBIF=0; //Xoa co ngat RB
}
}

Đoạn code thứ 2:
#int_ext
void ngat_RB0()
{
int i;
if(i<9)
{
portd=digital[i];
++i;
}
if(i==9)
{
i=0;
}
}
Đoạn code thứ 3:
#INT_RB
void RB_handler() {
int8 i, digit;
char key;

key = kbd_getc();
if (digit_key_pressed(key)) {
digit = char_to_digit(key);
for (i = 0; i < 200; i++) // repeat the display for human eyes
display(digit);
}
}

Câu hỏi của mình là:
1. Ở ví dụ 1 và 3, code 1 thì mình phải kiểm tra cờ ngắt RB, và kết thúc phải set lại cờ ngắt của B, nhưng trong đoạn code 3 mình lại ko thấy thực hiện điều này.Và ở đoạn code 1 nếu mình ko set và ko xóa cờ ngắt ( tức xóa mấy cái kiểm tra cờ ngắt , set cờ ngắt đi) thì trong giả lập thấy vẫn chạy bình thường.Không biết là có cần thiết phải set và xóa cờ ngắt ko hay CCS đã làm điều này cho mình rồi?
2.Trong đoạn code 2 mình muốn sửa thành RB0 nhấn thì tăng i, RB1 nhấn thì giảm i,nhưng khi dùng #int_ext thì chỉ dùng được RB0 , không dùng được RB1. Còn nếu dùng như #int_RB thì chỉ dùng RB4-RB7, nhưng bất cứ thay đổi nào của 4 port này đều làm chạy ngắt, thành ra kết quả mình nhất 1 cái là nó tăng, thả button ra nó tăng tiếp.Có cách nào xử lí được chỗ này ko ( mình thử dùng cái ext_int_edge mà ko thấy có tác dụng).
Cảm ơn