BÀI 18 : ĐẾM TỪ 0 ĐẾN 9 SỬ DỤNG NGẮT RB0 PIC16F887 XC8

5:18:00 AM
Chào các bạn trong bài đăng trước mình đã hướng dẫn các bạn về ngắt RB0/INT của Vi Điều Khiển PIC16F887 và trong bài đăng này mình sẽ hướng dẫn các bạn ứng dụng Ngắt RB0 để thực hiện 1 bài tập đơn giản như sau : Đếm từ 0 đến 9 sử dụng ngắt RB0. Bài này rất đơn giản không có gì phức tạp cả và trước khi đi vào bài thì mình sẽ nhắc lại 1 tý kiến thức bài trước :
1. Cấu hình ngắt RB0/INT.
    INTCONbits.GIE = 1;
    INTCONbits.INTE = 1;
    OPTION_REGbits.INTEDG = 1;
    ANSELHbits.ANS12 = 0;
Trước khi Ngắt thì chúng ta phải cấu hình các thanh ghi liên quan đến ngắt RB0 như trên còn chức năng các thanh ghi thì các bạn lên Datasheet tra nha !
Sau khi khai báo ngắt rồi thì chúc ta sẽ đi viết và sử lý chương trình ngắt để thực hiện bài tập trên :
void interrupt ISR(void)
{
        if(INTCONbits.INTF==1)
        {
            {
                count++;
                INTCONbits.INTF=0;
            }
        }
}
Trên là chương trình ngắt của chúng ta ý tưởng giải thuật ở đây là gì : Là khi if(INTCONbits.INTF==1) thì  ngắt xảy ra biến count++ của chúng ta sẽ tăng lên 1 đơn vị và lập tức xóa cờ ngắt cứ như vậy cho đến 9 và điều kiện đếm tới 9 thì quay lại 0 mình sẽ để trong vòng lặp while(1) như sau :
    while(1)
    {
        PORTD = Code7Seg[count];
        if(count==10)
        {
            count=0;
        }
    }
2. Ảnh mô phỏng trên phần mềm protues.

đếm từ 0 đến 9 sử dụng ngắt rb0

3. Code chương trình đầy đủ.
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <string.h>
#define _XTAL_FREQ 8000000
// CONFIG1
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF        // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)

// CONFIG2
#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)
const unsigned char Code7Seg[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
unsigned int count=0;
void interrupt ISR(void);
void main (void)
{
    TRISD = 0x00;
    PORTD = 0X00;
    TRISBbits.TRISB0 = 1;
    ANSELHbits.ANS12 = 0;
    INTCONbits.GIE = 1;
    INTCONbits.INTE = 1;
    OPTION_REGbits.INTEDG = 1;
    while(1)
    {
        PORTD = Code7Seg[count];
        if(count==10)
        {
            count=0;
        }
    } 
}
void interrupt ISR(void)
{
        if(INTCONbits.INTF==1)
        {
            {
                count++;
                INTCONbits.INTF=0;
            }
        } 
}
- Link download project  Click here

Share this

Related Posts

Previous
Next Post »