Thứ Hai, 11 tháng 1, 2016

BÀI 23 : NGẮT PORTB PIC16F877A CCS

Tương tự như ngắt RB0, nhưng dựa vào sự biến đổi trạng thái của 1 trong các chân từ RB4 - RB7. Khi RB4 - RB7 có sự biến đổi trang thái của 1 chân thì cờ ngắt RBIF tích cực mức cao. Để sử dụng ngắt PORTB trong chương trình chính chúng ta cần Set bit RBIE (INTCON<3>) và bit GIE (INTCON<7>). 
Ở phần trên mình đã giới thiệu với các bạn cánh thức hoạt động cũng như là cách cấu hình ngắt PORTB các bạn có thể viết theo cách trên hoạt sử dụng các lệnh được hỗ trợ sẵn trong trình biên dịch CCS. Cả 2 cách đều được các bạn thấy cách nào dễ hơn thì thưc hiện nha ! Và trong bài này chúng ta sẽ sử dụng ngắt PORTB để bật tắt 4 LED đơn từ chân RB0 - RB3 theo tần số khác nhau !
- Đây là ảnh mô phỏng protues.

ngắt portb pic16f877a ccs

- Đây là code chương trình.
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#byte portb=0x06 
#byte intcon=0x000B
#bit RB4=portb.4
#bit RB5=portb.5
#bit RB6=portb.6
#bit RB7=portb.7
#bit RBIF=intcon.0 //dinh nghia co ngat RB
#bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB
int led=0,speed;
// Chuong trinh ngat
#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE)) 

//Kiem tra sw1
{
if(RB4==0)
{
led=0b00000001; //led1 sang
speed=250;

}
//Kiem tra sw2 
{
if(RB5==0)
{
led=0b00000011; //led1,2 sang
speed=200;

}
//Kiem tra sw3
{
if(RB6==0)
{
led=0b00000111; //led1,2,3 sang
speed=150;

}
//Kiem tra sw4
{
if(RB7==0)
{
led=0b00001111; //led1,2,3,4 sang
speed=100;

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

void main()
{
set_tris_b(0b11110000);
portb=0b00001111;
enable_interrupts(global);
enable_interrupts(int_RB);
ext_int_edge(H_to_L);
while(true)
{
portb=led;
delay_ms(speed);
portb=0;
delay_ms(speed); 
}
}
- Link download project Click here


EmoticonEmoticon