Thông báo

Collapse
No announcement yet.

help me: ngắt định thời và nút nhấn

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • help me: ngắt định thời và nút nhấn

    xin chào các a chị trong diễn đàn. e có vấn đề cần nhờ mọi người giúp em ạ. e định dùng 6 nút nhấn nối với các chân b0,b1,b2,b3,b4,b5 port b (pic16f877a) và kết hợp chế độ định thời của timer1 để xuất tín hiệu ra port c là chân C0, C1,C2. chân b0 nhấn thì xuất ra c0 chân này không dùng ngắt int_timer1. chân b0 e làm dc rồi. chân b1 xuất ra chân c1 không dùng ngắt thì e cũng làm đươc. chỉ còn 3 chân b2,b3,b4, là chưa kết hợp với chế độ định thời của timer 1 để xuất ra chân c2. chân b5 là chân stop cho các chân còn lại. vấn đề của e đã dùng ngắt int_timer1 nhưng nó chạy ngắt trước khi e nhấn các nút b2,b3,b4 ở portb. nhờ a chị giúp đỡ e ạ
    đây là code của e:

    #include <16F877A.h>
    #device ADC=16
    #bit TMR1IF=0X0C.0 // dinh nghia bit tran thanh ghi

    #FUSES NOWDT //No Watch Dog Timer
    #FUSES NOBROWNOUT //No brownout reset
    #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES HS
    //!#FUSES NOWDT //No Watch Dog Timer
    //!#FUSES NOBROWNOUT //No brownout reset
    //!#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    //!#FUSES XT
    //!#FUSES NOPUT
    //!#FUSES NOPROTECT
    //!#FUSES NODEBUG
    //!#FUSES NOCPD

    #use delay(crystal=8000000)// thach anh 8Mhz
    /* dinh nghia lcd
    #define LCD_ENABLE_PIN PIN_E0
    #define LCD_RS_PIN PIN_E1
    #define LCD_RW_PIN PIN_E2
    #define LCD_DATA4 PIN_D4
    #define LCD_DATA5 PIN_D5
    #define LCD_DATA6 PIN_D6
    #define LCD_DATA7 PIN_D7
    #include<LCD.C>
    */
    ///////////////////////////////////////////
    #define button_0 input(pin_b0)
    #define button_1 input(pin_b1)
    #define button_2 input(pin_b2)
    #define button_3 input(pin_b3)
    #define button_4 input(pin_b4)
    #define button_5 input(pin_b5)

    #define output_bit(c0)
    #define output_bit(c1)
    #define output_bit(c2)
    /////////////////////////////////////////
    unsigned long bdt = 0 ;
    unsigned char mode = 0 ;
    int1 t0;
    int1 t1;
    //int1 t2;
    //int1 t3;
    //int1 t4;

    #int_timer1 // ngat timer 1
    void timer1_isr()
    {
    set_timer1(0);// set gia tri ban dau cho timer 1 la 0
    bdt++;//tang bien dem tran
    for(mode=0;mode<=4;mode++)// vong lap cho bien mode

    {
    if(MODE==1)
    {
    if(bdt == 45)
    {
    output_high(pin_c2);// xuat tin hieu sau 3s
    }
    if(bdt == 122)
    {
    output_low(pin_c2);// tat tin hieu sau 5s
    bdt=0;//xoa co tran
    set_timer1(0);// set gia tri ban dau cho timer 1 la 0
    }
    }
    }
    }
    //! if(MODE==2) // tuong tu MODE 1
    //! {
    //! if(bdt == 45)
    //! {
    //! output_high(pin_c2);
    //! }
    //! if(bdt == 106)
    //! {
    //! output_low(pin_c2);
    //! bdt=0;
    //! }
    //! set_timer1(0);
    //! }
    //! if(MODE==3) // cach viet tuong tu MODE 1
    //! {
    //! if(bdt == 45)
    //! {
    //! output_high(pin_c2);
    //! }
    //! if(bdt == 91)
    //! {
    //! output_low(pin_c2);
    //! bdt=0;
    //! }
    //! set_timer1(0);
    //! }
    //!
    //! if(MODE==4) // cach viet tuong tu MODE 1
    //! {
    //! output_c(0x00);
    //! bdt=0;
    //! set_timer1(0);
    //! }
    //! }
    //!}

    void ktrr()
    {
    if((button_0)==0)
    delay_ms(20);
    {
    if((button_0)==0)
    {
    t0=1;
    lcd_putc("\f");
    lcd_gotoxy(1,1);
    lcd_putc(" JSC ");
    delay_ms(20);
    lcd_gotoxy(1,2);
    lcd_putc(" DANG CAP KHI ");
    delay_ms(20);
    }
    }
    }
    void tatkhi()
    {
    if((button_5)==0)
    delay_ms(20);
    {
    if((button_5)==0)
    {
    t0=0;
    lcd_putc("\f");
    lcd_gotoxy(1,1);
    lcd_putc(" JSC ");
    delay_ms(20);
    lcd_gotoxy(1,2);
    lcd_putc(" STOP ");
    delay_ms(20);
    }
    }
    }

    void batbom()
    {
    if((button_1)==0)
    delay_ms(20);
    {
    if((button_1)==0)
    {
    t1=1;
    lcd_putc("\f");
    lcd_gotoxy(1,1);
    lcd_putc(" JSC ");
    delay_ms(20);
    lcd_gotoxy(1,2);
    lcd_putc(" DANG CAP NUOC ");
    delay_ms(20);
    }
    }
    }
    void tatbom()
    {
    if((button_5)==0)
    delay_ms(20);
    {
    if((button_5)==0)
    {
    t1=0;
    lcd_putc("\f");
    lcd_gotoxy(1,1);
    lcd_putc(" JSC ");
    delay_ms(20);
    lcd_gotoxy(1,2);
    lcd_putc(" STOP ");
    delay_ms(20);
    }
    }
    }

    void xungthap()
    {
    if((button_2)==0)
    delay_ms(20);
    {
    if((button_2)==0)
    {
    bdt++;
    mode=1;
    if(mode==1)
    {
    timer1_isr();
    //enable_interrupts(int_timer1);
    //enable_interrupts(global);
    lcd_putc("\f");
    lcd_gotoxy(1,1);
    lcd_putc(" JSC ");
    delay_ms(20);
    lcd_gotoxy(1,2);
    lcd_putc(" XUNG THAP ");
    delay_ms(20);
    }
    //bdt=0;
    //set_timer1(0);
    }
    }
    }
    void tatxung()
    {
    if((button_5)==0)
    delay_ms(20);
    {
    if((button_5)==0)
    {
    mode=4;
    if(mode==4)
    {
    output_c(0x00);
    lcd_putc("\f");
    lcd_gotoxy(1,1);
    lcd_putc(" HUNG PHAT JSC ");
    delay_ms(20);
    lcd_gotoxy(1,2);
    lcd_putc(" STOP XUNG ");
    delay_ms(20);
    }
    }
    }
    }
    void main()
    {
    t0=t1=0;
    bdt=0;
    output_c(0x00);
    set_tris_e(0x00);
    set_tris_d(0x00);
    set_tris_b(0xff);
    set_tris_c(0x00);

    lcd_init();
    delay_ms(20);

    lcd_gotoxy(1,1);
    lcd_putc(" JSC ");
    delay_ms(200);
    lcd_gotoxy(1,2);
    lcd_putc(" ");
    delay_ms(200);
    setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_2 );
    set_timer1(0);
    //disable_interrupts(int_timer1);
    //disable_interrupts(global);
    enable_interrupts(int_timer1);
    enable_interrupts(global);
    /*
    cach tinh chu ki may voi F=8Mhz va bo chia tan là 2:
    Tcyl= 4 x (1/Fosc) x (prescale: là he so chia)
    = 4 x (1/8Mhz) x
    = 1 us
    ==> Tmax cua timer1 dem het 65536 gia tri la 65536x1=65536us
    muon tao thoi gian tre 1s=1000ms=1000000us
    vay so làn xay ra ngat la 1000000/65536=15.2 lan
    */

    while(TRUE)
    {
    ktrr(); if(t0==1) {output_high(pin_c0);}
    batbom(); if(t1==1) {output_high(pin_c1);}

    tatkhi(); if(t0==0) {output_low(pin_c0);}
    tatbom(); if(t1==0) {output_low(pin_c1);}
    xungthap();

    tatxung();
    }

Về tác giả

Collapse

nguyenbinh08 Tìm hiểu thêm về nguyenbinh08

Bài viết mới nhất

Collapse

Đang tải...
X