Thông báo

Collapse
No announcement yet.

điều khiển chương trình con dùng ngắt ngoài

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

  • điều khiển chương trình con dùng ngắt ngoài

    ai biết giúp mình chương trình này với, mình đọc qua nhiều luồng nói về cái này rồi nhưng mà chẳng làm đc.

    Ở đây mình muốn nhấn nút lần 1 thì led D1 sáng, ấn nút lần 2 thì led D2 sáng..
    (cụ thể hơn đó là nhấn lần 1 thì chương trình con 1 chạy, nhấn lần 2 thì chương trình con 2 chạy.)
    Click image for larger version

Name:	Capture.JPG
Views:	2
Size:	103.7 KB
ID:	1414483

  • #2
    cám ơn bạn chjpchjp, bạn hiểu rồi thì viết lại code C cho mình xem với hj, chương trình con của mình viết theo C hết cả rồi.!

    Comment


    • #3
      bạn tham khảo nhé
      Code:
      #include <regx51.h>
      #define led1 P1_0
      #define led2 P1_1
      char mode;
      void init();
      void EX1_ISR();
      
      void proc1();
      void proc2();
      
      void main() {
      	init();
      	while(1);
      }
      
      void init() {
      	mode=0;
      	EA=1;//cho phep ngat
      	EX1=1;//ngat ngoai 1
      	IT1=1;//ngat theo suon
      }
      
      void EX1_ISR() interrupt IE1_VECTOR {
      	if(!mode) {
      		mode=1;
      		proc1();
      	} else {
      		mode=0;
      		proc2();
      	}
      }
      
      void proc1() {
      	led2=1;
      	led1=0;
      }
      
      void proc2() {
      	led1=1;
      	led2=0;
      }

      Comment


      • #4
        Nguyên văn bởi chjpchjp1991
        Bạn Kidteam viết hàm này mình thấy khó hiểu void EX1_ISR() interrupt IE1_VECTOR { hic hic
        đó là hàm ngắt đó bạn
        @chip: mình mới hoàn thành cái compiler asm đó
        bạn tham khảo test giúp mình
        có lỗi gì mình fix luôn

        Comment


        • #5
          #include "reg52.h"
          #define led1 P1_0
          #define led2 P1_1
          int k=0;
          main()
          {
          IE=0x81;
          while(1)
          {
          if(k%2) {led1=1; led2=0;}
          else {led1=0; led2=1;}
          }
          }
          void ngat0() interrupt 0
          {
          //if(k=100) k=0; ///cai nay viet them cho khoi bi tran bien k
          while(P3==0xfb);
          k++;
          }
          cậu xem cái này nhá.
          mình viết luôn chưa test đâu.. nhưng chắc k sai
          Last edited by tan0710; 08-10-2012, 09:34.

          Comment


          • #6
            Nguyên văn bởi chjpchjp1991
            Bạn Kidteam viết hàm này mình thấy khó hiểu void EX1_ISR() interrupt IE1_VECTOR { hic hic
            ko khó hiểu đâu bạn. cái này chỉ là biến đã được định nghĩa giá trị thôi. bạn open file.h của 8051 lên tìm tới mục các vecto ngắt sẽ tìm thấy giá trị của ie_vector
            #define IE1_VECTOR 2 /* 0x13 External Interrupt 1 */ //được định nghĩa sẵn
            @kidteam: void EX1_ISR(); đoạn khai báo chương trình con này k cần thiết, các hàm ngắt ko cần khai báo trước main.
            Website chính thức đổi địa chỉ website thành
            Mời các bạn ghé thăm !!!

            Comment


            • #7
              Nguyên văn bởi mast090 Xem bài viết
              ko khó hiểu đâu bạn. cái này chỉ là biến đã được định nghĩa giá trị thôi. bạn open file.h của 8051 lên tìm tới mục các vecto ngắt sẽ tìm thấy giá trị của ie_vector
              #define IE1_VECTOR 2 /* 0x13 External Interrupt 1 */ //được định nghĩa sẵn
              @kidteam: void EX1_ISR(); đoạn khai báo chương trình con này k cần thiết, các hàm ngắt ko cần khai báo trước main.
              cảm ơn bạn
              chỉ là do thói quen thôi bạn à (mình quen trước khi sử dụng cái gì thì khai báo cái đó mặc dù biết là trường hợp này là không cần khai báo)

              Comment


              • #8
                Nguyên văn bởi kidteam Xem bài viết
                bạn tham khảo nhé
                Code:
                #include <regx51.h>
                #define led1 P1_0
                #define led2 P1_1
                char mode;
                void init();
                void EX1_ISR();
                
                void proc1();
                void proc2();
                
                void main() {
                	init();
                	while(1);
                }
                
                void init() {
                	mode=0;
                	EA=1;//cho phep ngat
                	EX1=1;//ngat ngoai 1
                	IT1=1;//ngat theo suon
                }
                
                void EX1_ISR() interrupt IE1_VECTOR {
                	if(!mode) {
                		mode=1;
                		proc1();
                	} else {
                		mode=0;
                		proc2();
                	}
                }
                
                void proc1() {
                	led2=1;
                	led1=0;
                }
                
                void proc2() {
                	led1=1;
                	led2=0;
                }
                bạn cho mình hỏi, với cái code của bạn thì mình thấy khi proc1 chạy xong, nhấn nút thì mới chuyển qua proc2.
                Ở đây mình đặt 1 vòng lặp cho proc1 lặp vô hạn, nếu khi nào nhấn nút thfi chuyển qua proc2 cũng lặp vô hạn...cứ như thế proc2-->proc1-->proc2...
                bạn sửa lại code giúp mình đc k.?
                ví dụ ở đây proc1 là 2 led nháy xem kẽ, proc2 là 2 led nháy tắt đồng thời.!

                Comment


                • #9
                  Code:
                  #include <regx51.h>
                  
                  #define led1 P1_0
                  #define led2 P1_1
                  
                  unsigned char mode;
                  
                  void proc1();
                  void proc2();
                  void init();
                  void EX1_ISR();
                  void Delay_Ms(unsigned char uMs);
                  
                  void main() {
                  	init();
                  	while(1) {
                  		if(!mode)
                  			proc1();
                  		else
                  			proc2();
                  	}
                  }
                  
                  void init() {
                  	mode=0;
                  	EA=1;
                  	EX1=1;
                  	IT1=1;	
                  }
                  
                  void EX1_ISR() interrupt IE1_VECTOR {
                  	if(mode)
                  		mode=0;
                  	else
                  		mode=1;
                  }
                  
                  void proc1() {
                  	led1=1;
                  	led2=0;
                  	Delay_Ms(100);
                  	led1=0;
                  	led2=1;
                  	Delay_Ms(100);
                  }
                  
                  void proc2() {
                  	led1=led2=0;
                  	Delay_Ms(100);
                  	led1=led2=1;
                  	Delay_Ms(100);
                  }
                  
                  void Delay_Ms(unsigned char uMs) {
                  	//lam gi do
                  }

                  Comment


                  • #10
                    thanks bạn kidteam nhiều.!

                    Comment


                    • #11
                      Nguyên văn bởi kidteam Xem bài viết
                      Code:
                      #include <regx51.h>
                      
                      #define led1 P1_0
                      #define led2 P1_1
                      
                      unsigned char mode;
                      
                      void proc1();
                      void proc2();
                      void init();
                      void EX1_ISR();
                      void Delay_Ms(unsigned char uMs);
                      
                      void main() {
                      	init();
                      	while(1) {
                      		if(!mode)
                      			proc1();
                      		else
                      			proc2();
                      	}
                      }
                      
                      void init() {
                      	mode=0;
                      	EA=1;
                      	EX1=1;
                      	IT1=1;	
                      }
                      
                      void EX1_ISR() interrupt IE1_VECTOR {
                      	if(mode)
                      		mode=0;
                      	else
                      		mode=1;
                      }
                      
                      void proc1() {
                      	led1=1;
                      	led2=0;
                      	Delay_Ms(100);
                      	led1=0;
                      	led2=1;
                      	Delay_Ms(100);
                      }
                      
                      void proc2() {
                      	led1=led2=0;
                      	Delay_Ms(100);
                      	led1=led2=1;
                      	Delay_Ms(100);
                      }
                      
                      void Delay_Ms(unsigned char uMs) {
                      	//lam gi do
                      }
                      bạn có thể mở rộng cho mình lên 3 hoặc 4 chương trình con k.?

                      Comment


                      • #12
                        Code:
                        #include <regx51.h>
                        
                        #define led1 P1_0
                        #define led2 P1_1
                        
                        unsigned char mode;
                        
                        void proc1();
                        void proc2();
                        void proc3();
                        void proc4();
                        //================================
                        //co the dat nhieu hon nua v.v.
                        void init();
                        void EX1_ISR();
                        void Delay_Ms(unsigned char uMs);
                        
                        void main() {
                        	init();
                        	while(1) {
                        		switch(mode) {
                        		case 0:
                        			proc1();
                        			break;
                        		case 1:
                        			proc2();
                        			break;
                        		case 2:
                        			proc3();
                        			break;
                        		case 3:
                        			proc4();
                        			break;
                        		}
                        	}
                        }
                        
                        void init() {
                        	mode=0;
                        	EA=1;
                        	EX1=1;
                        	IT1=1;	
                        }
                        
                        void EX1_ISR() interrupt IE1_VECTOR {
                        	++mode;
                        	if(mode==4)
                        		mode=0;
                        }
                        
                        void proc1() {
                        	led1=1;
                        	led2=0;
                        	Delay_Ms(100);
                        	led1=0;
                        	led2=1;
                        	Delay_Ms(100);
                        }
                        
                        void proc2() {
                        	led1=led2=0;
                        	Delay_Ms(100);
                        	led1=led2=1;
                        	Delay_Ms(100);
                        }
                        
                        void proc3() {
                        	//lam gi do tuy ban
                        }
                        
                        void proc4() {
                        	//lam gi la tuy o ban
                        }
                        void Delay_Ms(unsigned char uMs) {
                        	//lam gi do do ban nhe
                        }

                        Comment


                        • #13
                          Nguyên văn bởi kidteam Xem bài viết
                          Code:
                          #include <regx51.h>
                          
                          #define led1 P1_0
                          #define led2 P1_1
                          
                          unsigned char mode;
                          
                          void proc1();
                          void proc2();
                          void proc3();
                          void proc4();
                          //================================
                          //co the dat nhieu hon nua v.v.
                          void init();
                          void EX1_ISR();
                          void Delay_Ms(unsigned char uMs);
                          
                          void main() {
                          	init();
                          	while(1) {
                          		switch(mode) {
                          		case 0:
                          			proc1();
                          			break;
                          		case 1:
                          			proc2();
                          			break;
                          		case 2:
                          			proc3();
                          			break;
                          		case 3:
                          			proc4();
                          			break;
                          		}
                          	}
                          }
                          
                          void init() {
                          	mode=0;
                          	EA=1;
                          	EX1=1;
                          	IT1=1;	
                          }
                          
                          void EX1_ISR() interrupt IE1_VECTOR {
                          	++mode;
                          	if(mode==4)
                          		mode=0;
                          }
                          
                          void proc1() {
                          	led1=1;
                          	led2=0;
                          	Delay_Ms(100);
                          	led1=0;
                          	led2=1;
                          	Delay_Ms(100);
                          }
                          
                          void proc2() {
                          	led1=led2=0;
                          	Delay_Ms(100);
                          	led1=led2=1;
                          	Delay_Ms(100);
                          }
                          
                          void proc3() {
                          	//lam gi do tuy ban
                          }
                          
                          void proc4() {
                          	//lam gi la tuy o ban
                          }
                          void Delay_Ms(unsigned char uMs) {
                          	//lam gi do do ban nhe
                          }
                          sao mình viết chương trình con dài thì khi bấm không quay lại liền được bạn,,,bạn có thể giúp mình đựuoc không

                          Comment

                          Về tác giả

                          Collapse

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

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

                          Collapse

                          • mèomướp
                            Trả lời cho Công thức điện tử
                            bởi mèomướp
                            Dạ thời thế giờ thay đổi theo hướng tích cực hơn rồi chú trung sĩ ạ. Kiến thức được chia sẻ ngày càng nhìu nên làm ăn gian dối ko còn dễ dàng như trước đâu ạ. Những thợ nhỏ rồi sẽ thành công nhân sản xuất đồ mới hết thay vì sửa chữa lặt vặt...
                            Hôm qua, 21:21
                          • mèomướp
                            Trả lời cho Xin hỏi về màn hình laptop
                            bởi mèomướp
                            Dạ cùng chuẩn tín hiệu thì chắc chắn là nhận ạ. Vì bản chất oled hay lcd thì đều phải có mạch chuyển đổi trên thanh gỗ rồi chuyển sang những chip xử lý hàng nghìn chân gắn trên những tab mỏng dính rồi mới ra các điểm ảnh theo hàng...
                            Hôm qua, 20:31
                          • yname11
                            Trả lời cho Xin hỏi về màn hình laptop
                            bởi yname11
                            Ok , thanks bác đã chỉ...
                            Hôm qua, 15:06
                          • nguyendinhvan
                            Công thức điện tử
                            bởi nguyendinhvan
                            Sau bao năm nghiên cứu cái dtvn. Tôi phát hiện công thức này. Các anh em xem đúng bao nhiêu phần trăm nhé !

                            Chập thì thay. Cháy thì tháo
                            Làm thì láo. Báo thì hay
                            May thì khoe. Rủi thì bỏ
                            Thành tích nhỏ. Báo thành to
                            Làm cho có. Báo chi li
                            Sai cả li. Báo
                            ...
                            Hôm qua, 00:35
                          • yname11
                            Trả lời cho Xin hỏi về màn hình laptop
                            bởi yname11
                            có chắc ko b, màn lcd phải có cao áp mới sáng, màn led thì ko có, ko có cáp chuyển đổi thì lắp thế nào đc ??...
                            25-11-2024, 22:31
                          • mèomướp
                            Trả lời cho Xin hỏi về màn hình laptop
                            bởi mèomướp
                            Dạ ý chú là màn oled ấy ạ. Cùng chuẩn lvds cùng độ phân giải thì cắm được ạ. Còn nó mà khác thì hơi khó vì oled các điểm ảnh nó tự phát sáng chứ ko dùng đèn nền như lcd. Cháu chỉ biết đến vậy thôi ạ. Chú muốn nghịch phải tự tìm hiểu kỹ trước khi mua thôi, khó mà ông thợ nào tư vấn vụ này...
                            25-11-2024, 22:14
                          • bactho
                            Trả lời cho Tự làm máy đo Cuộn cảm
                            bởi bactho
                            Hay đấy bạn ạ. Đây có thể hiểu là máy đo cuộn dây. Tiện đây xin cho hỏi bạn có hiểu rõ về máy nạp rôm pcb 45 của hãng thiên minh không giúp mình cách cài fw của nó với vì mình vừa được anh bạn cho nhưng lại không biết cài fw nên chưa dùng được. Nếu có thể thì bạn giúp mình với...
                            25-11-2024, 21:48
                          • yname11
                            Trả lời cho Xin hỏi về màn hình laptop
                            bởi yname11
                            màn của mình là LCD , giờ m muốn mua màn LED để thay thế (ko muốn dùng màn LCD nữa) , lên muốn hỏi xem có cáp chuyển đổi nào có thể cắm đc màn LED vào ko , tất nhiên phải có cùng số chân pin với màn cũ rồi . VD: màn cũ là lcd mỏng , 40 pin...
                            25-11-2024, 21:43
                          • bactho
                            Trả lời cho các bạn giúp mình về file HEX với!!!
                            bởi bactho
                            Bạn vào trang phuclanshop.com ,tìm đến góc kỹ thuật. Tác giả vương khánh hưng nói rất rõ về điều bạn tìm...
                            25-11-2024, 21:21
                          • mèomướp
                            Trả lời cho Xin hỏi về màn hình laptop
                            bởi mèomướp
                            Dạ màn hình lcd đều có thể lai cấy cho nhau được hết ạ. Các loại cáp, bo mạch chuyển đổi lvds rất nhìu, với dòng sony còn phải nhổ cả chip nhớ của main cũ đưa lên gỗ thì mới lắp sang máy khác đc, chưa kể các bệnh về màu... ngay cả...
                            25-11-2024, 20:43
                          Đang tải...
                          X