Mấy anh cho em hỏi về ngắt và nút nhấn

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • halinh12sinh
    Đệ tử 1 túi
    • Jun 2011
    • 14

    #1

    Mấy anh cho em hỏi về ngắt và nút nhấn

    số là em đang tập tành về pic.em đang làm thử gia tiếp nút nhấn và ngắt.em làm mô phỏng thôi,viết thử chương trình,thậm chí y sao bản chính của mấy anh đã viết.nhưng khi nạp vào chíp nó cứ đơ ra.bấm cũng k có tác dụng ji cả.mong cấc anh giúp đỡ,kiểm tra lỗi giùm em.em xin chân thành cảm ơn! (em có đính kèm cả mạch mô phỏng vá file chuong trinh ccs,mấy anh chịu khó tải về test jum em với).
    Attached Files
  • tdm
    Đệ tử 7 túi
    • May 2005
    • 258

    #2
    Nguyên văn bởi halinh12sinh View Post
    số là em đang tập tành về pic.em đang làm thử gia tiếp nút nhấn và ngắt.em làm mô phỏng thôi,viết thử chương trình,thậm chí y sao bản chính của mấy anh đã viết.nhưng khi nạp vào chíp nó cứ đơ ra.bấm cũng k có tác dụng ji cả.mong cấc anh giúp đỡ,kiểm tra lỗi giùm em.em xin chân thành cảm ơn! (em có đính kèm cả mạch mô phỏng vá file chuong trinh ccs,mấy anh chịu khó tải về test jum em với).
    em thiết kế như vậy thì nhấn nút nó chập nguồn còn đâu.
    Attached Files
    viết chương trình cho vdk chạy ổn định là cả một vấn đề.

    Comment

    • tdm
      Đệ tử 7 túi
      • May 2005
      • 258

      #3
      sửa lại như hình gửi kèm thì nó chạy thôi.
      code của em chạy cũng được ,nhưng có nhược điểm khi chuyển chế độ khác nó phải làm hết chế độ cũ rồi mới chuyển.
      Code:
      #include <16F877A.h>
      
      #FUSES NOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,NOCPD,NOWRT
      #use delay(clock=4000000)
      int8 mode,i;
      byte temp;
      #byte portb=0x06
      #byte portd=0x08
      #byte trisb=0x86
      #byte trisd=0x88
      //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      #INT_EXT
      EXT_ISR(){
      mode++;
      if(mode==5) mode=0;
      }
      
      void pro1();
      void pro2();
      void pro3();
      void pro4();
      
      void main(){
      trisd=0x00;
      trisb=0b00000001;
      portd=0xff;
      enable_interrupts(INT_EXT);
      ext_int_edge(H_TO_L);
      enable_interrupts(GLOBAL);
      mode=0;
      while(1)
      { switch(mode){
       case 0:
        portd=0xff;
        break;
        case 1:pro1();break;
        case 2:pro2();break;
        case 3:pro3();break;
        case 4:pro4();break;
      }}
      }
      //+++++++++++++++++++++++++++++++++++
      void pro1(){
      
      portd=0b11111111;
      delay_ms(200);
      portd=0b00000000;
      delay_ms(200);
      }
      //+++++++++++++++++++++++++++++++++
      void pro2(){
      temp=0xFF;
      for(i=0;i<=8;i++)
      { portd=temp;
      delay_ms(50);//chèn thêm lệnh này cho dễ quan sát
        temp>>=1;
      }
      }
      //+++++++++++++
      void pro3(){
      temp=0xFF;
      for(i=0;i<=8;i++)
      { portd=temp;
      delay_ms(50);//chèn thêm lệnh này cho dễ quan sát
      temp<<=1;
      }}
      //++++++++++++++++++
      void pro4(){
      portd=0b11110000;
      delay_ms(200);
      portd=0b00001111;
      delay_ms(200);
      }
      Attached Files
      Last edited by tdm; 16-06-2011, 01:55 PM.
      viết chương trình cho vdk chạy ổn định là cả một vấn đề.

      Comment

      • pstin
        Đệ tử 7 túi
        • Jul 2010
        • 190

        #4
        Chiêu trong nút nhấn.

        - Chiêu 1: Là khi nhấn phím thì phải chờ cho nó nhả rồi mới thực hiện lệnh. Đoạn dưới là khi phím mode được nhấn thì set thời gian cho DS1307, sau đó qua tiếp trang 3.

        If (mode==1)
        {
        while(mode==1)
        {output_high(PIN_B1);
        delay_ms(10);
        }
        output_low(PIN_B1);
        ds1307_set_date_time(day,mth,year,dow,hr,min,sec);
        delay_us(10);
        lcd_refresh();
        ttmode=3;
        count=0;

        }

        - Chiêu 2: Là khi phím nhấn đang được nhấn thì tăng hay giảm giá trị liên tục. Thời gian 250ms là tương đối chuẩn. Đoạn dưới là khi phím "len" được nhấn thì tăng giá trị của giờ hoặc phút. Nhấn rồi thả thì tăng 1 đơn vị, nhấn luôn thì tăng liên tục.
        Biến count là để đêm thời gian thực hiện ngắt timer để thoát khỏi trang hiện tại khi không có ai nhấn phím. Nếu không thì vđk cứ ở hoài trang chỉnh thì "trớt wớt"!!!!!!!!
        if(len==1)

        {
        while(len==1)
        { output_high(PIN_B1);
        count=0;
        if(vitrichinh==0)
        {
        min=min+1;
        if(min==60) min=0;
        delay_ms(250);
        lcd_gotoxy(10,2);
        lcd_putc(min/10+0x30);
        lcd_gotoxy(11,2);
        lcd_putc(min%10+0x30);
        lcd_gotoxy(11,2);
        lcd_send_byte(0,0x0f);
        }
        if(vitrichinh==1)
        {
        hr=hr+1;
        if(hr==24) hr=0;
        delay_ms(250);
        lcd_gotoxy(7,2);
        lcd_putc(hr/10+0x30);
        lcd_gotoxy(8,2);
        lcd_putc(hr%10+0x30);
        lcd_gotoxy(8,2);
        lcd_send_byte(0,0x0f);
        }
        }
        output_low(PIN_B1);
        }

        Nói chung là còn "dấu nghề" do cái bịnh của xứ VN ta từ xưa tới nay, anh em chịu khó thui. Cái chuyện phím nhấn này làm được nhiều thứ đó.
        Last edited by pstin; 16-06-2011, 06:24 PM.

        Comment

        • halinh12sinh
          Đệ tử 1 túi
          • Jun 2011
          • 14

          #5
          hjhj..thanks mấy kaka nhìu!!! em lầm chạy được rùi.em vẽ y sao bản chính từ trong tài liệu tutorial mà...hixxx

          Comment

          • pstin
            Đệ tử 7 túi
            • Jul 2010
            • 190

            #6
            Nên dùng phím nhấn nối "mass" thì hay hơn. Nhấn kéo lên "Vcc" lỡ có chuyện "phóng điện" thì hậu quả "khó mà lường" được!!!!!!!!!
            Các "chiên gia" nước ngoài hay thích nối mass với trước khi vào chân VĐK còn gắn thêm điện trở 1K nữa!!!!!!!! Cái mạch nhấn kiểu này thì nếu VĐK có die là do cái gì đó chứ chẳng thể đổ thừa cho mạch phím nhấn được!!!!!!!!!

            Comment

            • halinh12sinh
              Đệ tử 1 túi
              • Jun 2011
              • 14

              #7
              mấy anh cho em hỏi thêm,cái mạch ngắt khi có thay đổi ở port B,em vẽ như vầy..code viết như vậy..mà sao nó không chạy...mấy anh chịu khó xem giùm em tí...cảm ơn mấy anh nhìu!!!
              Attached Files

              Comment

              • tdm
                Đệ tử 7 túi
                • May 2005
                • 258

                #8
                Nguyên văn bởi pstin View Post
                - Chiêu 1: Là khi nhấn phím thì phải chờ cho nó nhả rồi mới thực hiện lệnh. Đoạn dưới là khi phím mode được nhấn thì set thời gian cho DS1307, sau đó qua tiếp trang 3.

                If (mode==1)
                {
                while(mode==1)
                {output_high(PIN_B1);
                delay_ms(10);
                }
                output_low(PIN_B1);
                ds1307_set_date_time(day,mth,year,dow,hr,min,sec);
                delay_us(10);
                lcd_refresh();
                ttmode=3;
                count=0;

                }

                - Chiêu 2: Là khi phím nhấn đang được nhấn thì tăng hay giảm giá trị liên tục. Thời gian 250ms là tương đối chuẩn. Đoạn dưới là khi phím "len" được nhấn thì tăng giá trị của giờ hoặc phút. Nhấn rồi thả thì tăng 1 đơn vị, nhấn luôn thì tăng liên tục.
                Biến count là để đêm thời gian thực hiện ngắt timer để thoát khỏi trang hiện tại khi không có ai nhấn phím. Nếu không thì vđk cứ ở hoài trang chỉnh thì "trớt wớt"!!!!!!!!
                if(len==1)

                {
                while(len==1)
                { output_high(PIN_B1);
                count=0;
                if(vitrichinh==0)
                {
                min=min+1;
                if(min==60) min=0;
                delay_ms(250);
                lcd_gotoxy(10,2);
                lcd_putc(min/10+0x30);
                lcd_gotoxy(11,2);
                lcd_putc(min%10+0x30);
                lcd_gotoxy(11,2);
                lcd_send_byte(0,0x0f);
                }
                if(vitrichinh==1)
                {
                hr=hr+1;
                if(hr==24) hr=0;
                delay_ms(250);
                lcd_gotoxy(7,2);
                lcd_putc(hr/10+0x30);
                lcd_gotoxy(8,2);
                lcd_putc(hr%10+0x30);
                lcd_gotoxy(8,2);
                lcd_send_byte(0,0x0f);
                }
                }
                output_low(PIN_B1);
                }

                Nói chung là còn "dấu nghề" do cái bịnh của xứ VN ta từ xưa tới nay, anh em chịu khó thui. Cái chuyện phím nhấn này làm được nhiều thứ đó.
                code trên là của 'halinh12sinh' nếu bạn muốn giúp thì hãy sửa thẳng trên code của bạn ấy, để người mới học có cái nhìn trực quan hơn.
                viết chương trình cho vdk chạy ổn định là cả một vấn đề.

                Comment

                • tdm
                  Đệ tử 7 túi
                  • May 2005
                  • 258

                  #9
                  Nguyên văn bởi halinh12sinh View Post
                  mấy anh cho em hỏi thêm,cái mạch ngắt khi có thay đổi ở port B,em vẽ như vầy..code viết như vậy..mà sao nó không chạy...mấy anh chịu khó xem giùm em tí...cảm ơn mấy anh nhìu!!!
                  thêm lệnh này vào hàm main: port_b_pullups(TRUE);//dung r keo len nguon
                  nếu không dùng lệnh này thì tại chân rb4....rb7 mỗi chân nối với r=10k lên nguồn dương.
                  viết chương trình cho vdk chạy ổn định là cả một vấn đề.

                  Comment

                  • halinh12sinh
                    Đệ tử 1 túi
                    • Jun 2011
                    • 14

                    #10
                    Nguyên văn bởi tdm View Post
                    sửa lại như hình gửi kèm thì nó chạy thôi.
                    code của em chạy cũng được ,nhưng có nhược điểm khi chuyển chế độ khác nó phải làm hết chế độ cũ rồi mới chuyển.
                    Code:
                    #include <16F877A.h>
                    
                    #FUSES NOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,NOCPD,NOWRT
                    #use delay(clock=4000000)
                    int8 mode,i;
                    byte temp;
                    #byte portb=0x06
                    #byte portd=0x08
                    #byte trisb=0x86
                    #byte trisd=0x88
                    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                    #INT_EXT
                    EXT_ISR(){
                    mode++;
                    if(mode==5) mode=0;
                    }
                    
                    void pro1();
                    void pro2();
                    void pro3();
                    void pro4();
                    
                    void main(){
                    trisd=0x00;
                    trisb=0b00000001;
                    portd=0xff;
                    enable_interrupts(INT_EXT);
                    ext_int_edge(H_TO_L);
                    enable_interrupts(GLOBAL);
                    mode=0;
                    while(1)
                    { switch(mode){
                     case 0:
                      portd=0xff;
                      break;
                      case 1:pro1();break;
                      case 2:pro2();break;
                      case 3:pro3();break;
                      case 4:pro4();break;
                    }}
                    }
                    //+++++++++++++++++++++++++++++++++++
                    void pro1(){
                    
                    portd=0b11111111;
                    delay_ms(200);
                    portd=0b00000000;
                    delay_ms(200);
                    }
                    //+++++++++++++++++++++++++++++++++
                    void pro2(){
                    temp=0xFF;
                    for(i=0;i<=8;i++)
                    { portd=temp;
                    delay_ms(50);//chèn thêm lệnh này cho dễ quan sát
                      temp>>=1;
                    }
                    }
                    //+++++++++++++
                    void pro3(){
                    temp=0xFF;
                    for(i=0;i<=8;i++)
                    { portd=temp;
                    delay_ms(50);//chèn thêm lệnh này cho dễ quan sát
                    temp<<=1;
                    }}
                    //++++++++++++++++++
                    void pro4(){
                    portd=0b11110000;
                    delay_ms(200);
                    portd=0b00001111;
                    delay_ms(200);
                    }
                    anh có thể chỉ cho em cách khắc phục nhược điểm mà anh nói được không?thanks anh trước hj

                    Comment

                    Working...