Chào các bạn.
Hôm nay mình sẽ hướng dẫn các bạn sử dụng chức năng ngắt ngoài trong PIC16F877A.
1. Ngắt ngoài
- Trong PIC 16F877A có 1 ngõ vào ngắt ngoài tại chân INT (RB0). Khi có một sự kiện trên chân INT (cạnh xuống hoặc cạnh lên) sẽ sinh ra một ngắt (nếu được cho phép).
- Để sử dụng chức năng ngắt ngoài ta phải làm như sau:
· Chọn kiểu ngắt: (cạnh lên hoặc cạnh xuống).
· Kích hoạt ngắt ngoài.
· Kích hoạt ngắt toàn cục.
2. Ví dụ ngắt ngoài
- Trong ví dụ này, mỗi lần có ngắt ngoài sx thực hiện lệnh xóa LCD16x2. Trong chương trình chính tôi sẽ cho hiện từng chữ trong chữ "chiasedientu" lên LCD16x2. Khi có ngắt sẽ xóa LCD, như vậy các dòng chữ "chiasedientu" sẽ không hiển thị hoàn chỉnh. (các bạn load code và mô phỏng bên dưới se hiểu hơn).
- Hàm ngắt ngoài
- Chương trình chính:
#include <16F877A.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
int led=0,time_delay; // default int=int8
#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
{
//Kiem tra sw1
{
if(RB4==0)
{
led=0b00000001; //led1 sang
time_delay=250;
}
}
//Kiem tra sw2
{
if(RB5==0)
{
led=0b00000011; //led1,2 sang
time_delay=200;
}
}
//Kiem tra sw3
{
if(RB6==0)
{
led=0b00000111; //led1,2,3 sang
time_delay=150;
}
}
//Kiem tra sw4
{
if(RB7==0)
{
led=0b00001111; //led1,2,3,4 sang
time_delay=100;
}
}
RBIF=0; //Xoa co ngat RB
}
}
// Chuong trinh chinh
void main(void)
{
TRISB= 0xF0;
PORTB= 0x0F;
enable_interrupts(global);
enable_interrupts(int_RB);
ext_int_edge(H_to_L);
while(true)
{
PORTB=led;
delay_ms(time_delay);
PORTB=0x00;
delay_ms(time_delay);
}
}
Ảnh mô phỏng protues.
Link download project.
http://adf.ly/11512871/ngat-rb0
Hôm nay mình sẽ hướng dẫn các bạn sử dụng chức năng ngắt ngoài trong PIC16F877A.
1. Ngắt ngoài
- Trong PIC 16F877A có 1 ngõ vào ngắt ngoài tại chân INT (RB0). Khi có một sự kiện trên chân INT (cạnh xuống hoặc cạnh lên) sẽ sinh ra một ngắt (nếu được cho phép).
- Để sử dụng chức năng ngắt ngoài ta phải làm như sau:
· Chọn kiểu ngắt: (cạnh lên hoặc cạnh xuống).
· Kích hoạt ngắt ngoài.
· Kích hoạt ngắt toàn cục.
2. Ví dụ ngắt ngoài
- Trong ví dụ này, mỗi lần có ngắt ngoài sx thực hiện lệnh xóa LCD16x2. Trong chương trình chính tôi sẽ cho hiện từng chữ trong chữ "chiasedientu" lên LCD16x2. Khi có ngắt sẽ xóa LCD, như vậy các dòng chữ "chiasedientu" sẽ không hiển thị hoàn chỉnh. (các bạn load code và mô phỏng bên dưới se hiểu hơn).
- Hàm ngắt ngoài
HTML:
#INT_EXT
void ngat_ngoai(void)
{
LCD_Clear();
}
#include <16F877A.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
int led=0,time_delay; // default int=int8
#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
{
//Kiem tra sw1
{
if(RB4==0)
{
led=0b00000001; //led1 sang
time_delay=250;
}
}
//Kiem tra sw2
{
if(RB5==0)
{
led=0b00000011; //led1,2 sang
time_delay=200;
}
}
//Kiem tra sw3
{
if(RB6==0)
{
led=0b00000111; //led1,2,3 sang
time_delay=150;
}
}
//Kiem tra sw4
{
if(RB7==0)
{
led=0b00001111; //led1,2,3,4 sang
time_delay=100;
}
}
RBIF=0; //Xoa co ngat RB
}
}
// Chuong trinh chinh
void main(void)
{
TRISB= 0xF0;
PORTB= 0x0F;
enable_interrupts(global);
enable_interrupts(int_RB);
ext_int_edge(H_to_L);
while(true)
{
PORTB=led;
delay_ms(time_delay);
PORTB=0x00;
delay_ms(time_delay);
}
}
Ảnh mô phỏng protues.
Link download project.
http://adf.ly/11512871/ngat-rb0
EmoticonEmoticon