Thông báo

Collapse
No announcement yet.

Lỗi khi quét phím ma trận 4x4 ở PORTB PIC16f877a

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

  • Lỗi khi quét phím ma trận 4x4 ở PORTB PIC16f877a

    Code:
    #include <16f887.h>
    #fuses HS,NOWDT,NOPROTECT,NOLVP
    #use delay(clock=4000000)	//su dung thach anh 4Mhz
    #use fast_io(a)
    #use fast_io(b)
    #use fast_io(c)
    #use fast_io(d)
    
    #byte PORTA=0x05
    #byte PORTB=0x06
    #byte PORTC=0x07
    #byte PORTD=0x08
    #byte PORTE=0x09
    #byte intcon=0x000b
    
    #bit RA0=PORTA.0
    #bit RA1=PORTA.1
    #bit RA2=PORTA.2
    #bit RA3=PORTA.3
    
    #bit RB0=PORTB.0
    #bit RB1=PORTB.1
    #bit RB2=PORTB.2
    #bit RB3=PORTB.3
    #bit RB4=PORTB.4
    #bit RB5=PORTB.5
    #bit RB6=PORTB.6
    #bit RB7=PORTB.7
    
    #bit RC0=PORTC.0
    #bit RC1=PORTC.1
    #bit RC2=PORTC.2
    
    #bit RD0=PORTD.0
    #bit RD1=PORTD.1
    #bit RD2=PORTD.2
    #bit RD3=PORTD.3
    #bit RD4=PORTD.4
    #bit RD5=PORTD.5
    #bit RD6=PORTD.6
    #bit RD7=PORTD.7
    
    
    #bit RBIF=intcon.0	//dinh nghia co ngat RB
    #bit RBIE=intcon.3	//dinh nghia bit cho phep ngat RB
    
    unsigned char so[10]={0b00000000, 0b00000001, 0b00000010, 0b00000011, 0b00000100, 0b00000101, 0b00000110, 0b00000111, 0b00001000, 0b00001001};
    int o=0;
    int m=0;
    int n=0;
    int k;
    int z, t, i;
    int ON=0;
    int RESET=0;
    int START=0;
    int OFF=0;
    int MACDINH=0;
    int DIEUCHINH=0;
    void dem()
    {
    	if(n==10)
    	{
    		n=0;
    		m++;
    		if(m==10)
    		{
    			m=0;
    			o++;
    			if(o==10) o=0;
    		}
    	}
    }
    void xuly()
    {
    	RC0=1;RC1=0;RC2=0;
    	PORTD=so[n];
    	delay_ms(10);
    	RC0=0;RC1=1;RC2=0;
    	PORTD=so[m];
    	delay_ms(10);
    	RC0=0;RC1=0;RC2=1;
    	PORTD=so[o];
    	delay_ms(10);
    }
    
    
    #int_RB
    void ngat_RB()
    {
    	if((RBIF)&&(RBIE))
    	{	
    		
    		if(RB4&&RB0) k=0;
    		if(RB4&&RB1) k=1;
    		if(RB4&&RB2) k=2;
    		if(RB4&&RB3) k=3;
    		if(RB5&&RB0) k=4;
    		if(RB5&&RB1) k=5;
    		if(RB5&&RB2) k=6;
    		if(RB5&&RB3) k=7;
    		if(RB6&&RB0) k=8;
    		if(RB6&&RB1) k=9;
    		if(RB6&&RB2) {START=1;RESET=0;}
    		if(RB6&&RB3) {RESET=1; START=0;}
    		if(RB7&&RB0) {ON=1;OFF=0;}
    		if(RB7&&RB1) {OFF=1;ON=0;}
    		if(RB7&&RB2) MACDINH=1;
    		if(RB7&&RB3) DIEUCHINH=1;
    		
    		
    		
    
    		
    		RBIF=0;				//Xoa co ngat RB
    	}
    	
    }
    
    
    void main()
    {
    	set_tris_a(0b0);
    	set_tris_b(0b11110000);
    	set_tris_c(0b0);
    	set_tris_d(0b00000000);
    	set_tris_e(0b11111111);
    	enable_interrupts(global);
    	enable_interrupts(int_RB);
    	ext_int_edge(H_to_L);
    	//RC0=1;RC1=1;RC2=1;
    	//PORTD=so[0];
    	//delay_ms(10);
    	while(true)
    	{
    		PORTB=0b1110;
    		PORTB=0b1101;
    		PORTB=0b1011;
    		PORTB=0b0111;
    		
    		
    	
    		
    		
    		
    			xuly();
    		
    
    
    	}
    }
    Em học pic16f877a nhưng lỡ làm die con đó rồi nên xài tạm con này, không biết cấu hình giữa 2 con đó có khác nhau nhiều không vì code đó em viết cho 877a. Nếu có khác nhau các bác sửa giúp em với
    Vô vấn đề chính. Em quét phím sử dụng ngắt RB. Nếu bỏ phần gọi hàm ở trong while(1) thì quét bình thường, còn nếu đặt hàm quét led trong while(1) thì không quét phím được.
    Hình minh họa không quét phím được thì gọi hàm trong while(1)

    Khi có gọi hàm trong while(1) thì nó quét phím bị treo ở chân RB3
    Em mới thử gọi 1 hàm mà không được thì làm sao code tiếp được.
    Vừa dùng hàm delay vừa interrupt thì k sử dụng hàm xuly() trong hàm interrupt phải không các bác.
    Code em có phải sửa ở chỗ nào không, nếu sửa lại thì sửa lại như thế nào, phần code xử lý xuất led khi quét phím nằm ở hàm interrupt hay nằm trong while(1) hả các bác

  • #2
    box này vắng quá

    Comment


    • #3
      cái này minh cũng đa làm khá lâu... vừa dây mình vừa mang ra làm lại... khá là dể dàng bạn àh.....
      về quét phím 4x4... thì ta cần 8 chân của pỏt như bạn đã làm

      portb=0b1110;
      portb=0b1101;
      portb=0b1011;
      portb=0b0111;

      nếu bạn đã làm như thế này thi bạn củng ko cần dùng ngắt timer chị, để dành cái timer đó làm việc khác..

      mình viết cho bạn khái niệm này nhé.

      Code:
      //--------- khai bao cho portB ----------//
      void main()
      {
      INT8 KEY;
      	trisB=0x11110000; //-- tu bit0 -> bit3 ba 4bit indata, tu bit4 -> bit7 la outdata---//
      
      
      //========================== so thu tu bo key co1 16 key ==================================//
      	RB4	RB5	RB6	RB7
      
      RB0	1	2	3	4
      	
      RB1	5	6	7	8
      
      RB2	9	10	11	12
      	
      RB3	13	14	15	16
      //==================================================================================//
      while(true)
      {
      //-------- ghi o day ta quet cot, lan luot tao gia tri thap tu RB4 den RB7
      
      	//---------------- quet cot 1 -----------//
      portb=0b1110;
      
      	// --------------- cot 1 co1 4 phim tu ( key1, key5, key9, key13);--------------//
      	IF(RB0==0)
      {	
      	DO{}
      	WHILE(RB0==0);
      
      KEY=1;// CODE MUC DICH CUA BAN//
      }
      	IF(RB1==0)
      {	
      	DO{}
      	WHILE(RB1==0);
      KEY=5;// CODE MUC DICH CUA BAN//
      }
      
      	IF(RB2==0)
      {	
      	DO{}
      	WHILE(RB2==0);
      KEY=9;// CODE MUC DICH CUA BAN//
      }
      
      	IF(RB3==0)
      {	
      	DO{}
      	WHILE(RB3==0);
      KEY=13;// CODE MUC DICH CUA BAN//
      }
      
      	//---------------- quet cot 2 -----------//
      portb=0b1101;
      	// --------------- cot 1 co1 4 phim tu ( key2, key6, key10, key14);--------------//
      	IF(RB0==0)
      {	
      	DO{}
      	WHILE(RB0==0);
      
      KEY=2;// CODE MUC DICH CUA BAN//
      }
      	IF(RB1==0)
      {	
      	DO{}
      	WHILE(RB1==0);
      KEY=6;// CODE MUC DICH CUA BAN//
      }
      
      	IF(RB2==0)
      {	
      	DO{}
      	WHILE(RB2==0);
      KEY=10;// CODE MUC DICH CUA BAN//
      }
      
      	IF(RB3==0)
      {	
      	DO{}
      	WHILE(RB3==0);
      KEY=14;// CODE MUC DICH CUA BAN//
      }
      	//---------------- quet cot 3 -----------//
      
      portb=0b1011;
      	// --------------- cot 1 co1 4 phim tu ( key3, key7, key11, key15);--------------//
      
      // CODE TUONG TU NHU TREN////
      	//---------------- quet cot 4 -----------//
      portb=0b0111;
      	// --------------- cot 1 co1 4 phim tu ( key4, key8, key12, key16);--------------//
      
      // CODE TUONG TU NHU TREN////
      }
      
      // XUAT RA MANG HINH LCD ///
      
      HIENTHI();
      
      
      }
      
      
      
      }//================ AND MAIN ====================//
      
      
      VOID HIENTHI()
      {
      LUC NAY MINH CHO HIEN THI GIA TRI CUA BIEN KEY RA MANG HINH LCD, HOAC LED7 TUY BAN,
      LCD_PUTCMD(0X80);
      PRINTF(LCD_PUTCHAR," VALUE %u",KEY);
      
      }
      Nên nhớ là phải để 4 con điện trở treo ( 10k ) ở các chân RB0 đến RB3 nhé.
      CHÚC BAN THÀNH CÔNG...

      Vì minh đang đi xa ko mang theo máy tính cuẩ mình nên minh ko viết cho bạn mạch mổ phỏng protues dc.

      nếu có gì ko hiểu có thể gỏi mail cho minh : lambaotrungdt@gmai.com

      Comment


      • #4
        bạn ơi cho mình hỏi cách viết mã nhị phân như portb=0b1110; tức là tác động vào 4 bit đầu của portB còn 4 bit sau bằng 0 hay ko tác động vào

        Comment


        • #5
          Nguyên văn bởi tungoanh Xem bài viết
          bạn ơi cho mình hỏi cách viết mã nhị phân như portb=0b1110; tức là tác động vào 4 bit đầu của portB còn 4 bit sau bằng 0 hay ko tác động vào
          4 bit sau bằng 0 đó bạn, nếu bạn muốn chỉ tác động 4 bit đầu thì POTRB = (PORTB & 0b11110000) | 0b1110;
          Computer Science major - Vietnamese-German University
          Sponsored by

          Comment

          Về tác giả

          Collapse

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

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

          Collapse

          • tuyennhan
            Trả lời cho Tiếng Anh cho người Việt
            bởi tuyennhan
            Cái thư sai ngay câu chào Dear sir mới đúng Hi chỉ dùng cho người quen , các vấn đề về kỹ thuật nó không trả lời hoặc nói loanh quanh tránh ảnh hưởng đến công ty .
            Giup1 người cần không giúp người không cần với lại văn mình vợ người nha đừng quên .
            hôm nay, 07:44
          • vi van pham
            Trả lời cho Tiếng Anh cho người Việt
            bởi vi van pham
            Cám ơn những lời chúc tốt đẹp của em.

            Việc em làm giống như chê sếp dốt, chẳng những không có miếng xôi nào để ăn mà còn chịu nhiều trù dập lên bờ , xuống ruộng.

            Hãy tránh vết xe đổ của tui đi. Dành thời gian lo cho gia đình....
            hôm nay, 02:00
          • nhathung1101
            Trả lời cho Tiếng Anh cho người Việt
            bởi nhathung1101
            Ngoại ngữ là không thể thiếu, nhất là làm việc với công nghệ.

            Nhưng học để tán gái hay để đọc datasheet, manual là chuyện cần quan tâm.

            Và đọc ở nguồn nào đáng tin cậy, chứ cứ lên tictok hay facebook học lỏm thì...
            Hôm qua, 22:18
          • dinhthuong80
            Trả lời cho Tiếng Anh cho người Việt
            bởi dinhthuong80
            Bác nói rất khách quan và chính xác. Ngoại ngữ là chìa khóa thăng tiến dù làm gì. Chả thế mà nay nước mình dạy tiếng Anh từ tiểu học.

            Nhớ hồi năm 2006 em ra Hải Phòng, Hải Dương tìm việc, thời đó ở Bình Dương lương công...
            Hôm qua, 14:51
          • dinhthuong80
            Trả lời cho Tiếng Anh cho người Việt
            bởi dinhthuong80
            Cảm ơn bạn, ĐT cũng có ý nghĩ như vậy.

            Thực ra, lỗi của hãng đó ( gọi là hãng vì không chỉ một model sản phẩm) là về phần cứng, ĐT tuy không biết về lập trình phần mềm nhưng cũng thấy rằng sẽ chẳng khó khăn gì đáng...
            Hôm qua, 14:39
          • dinhthuong80
            Trả lời cho Tiếng Anh cho người Việt
            bởi dinhthuong80
            Dạ, bác bảy mấy tuổi đời rồi cũng không kém bố cháu bao nhiêu. Tuổi nghề thì bác cũng đáng tuổi cha chú.

            Nhưng 2 điều trên thì chưa hẳn đã đáng quí và đáng tôn trọng bằng việc bác rất nhiệt tình chia sẻ kinh nghiệm chuyên...
            Hôm qua, 14:28
          • bqviet
            Trả lời cho Tiếng Anh cho người Việt
            bởi bqviet
            Đúng, nếu chú tâm thì chỉ cần mỗi tiếng Việt là đã khá đủ để làm đa số công việc thông thường, ở thời đại ngày nay khi tài liệu sách vở phương tiện thông tin liên lạc đã nhiều. Nhưng cũng chính ở thời nay giao lưu các nước nhiều...
            21-02-2025, 20:26
          • mèomướp
            Trả lời cho Tiếng Anh cho người Việt
            bởi mèomướp
            Dạ cháu nghĩ chú dinh... cứ mạnh dạn gửi thư đi ạ, chú có thể gửi bằng văn bản in chuyển phát nhanh sẽ có giá trị hơn. Vấn đề chưa hẳn là cần hãng làm gì đó, mà chỉ đơn giản là mình cảm thấy nhẹ lòng vì đã làm những việc bản...
            21-02-2025, 12:32
          • vi van pham
            Trả lời cho Tiếng Anh cho người Việt
            bởi vi van pham
            Những lần hắt hơi sổ mũi làm tôi mệt lã, phải dùng rượu uống để ngũ. Tôi cũng đang uống rượu 1 mình, viết vài dòng này cho em ( có lẽ dt chỉ bằng tuổi em tôi).

            Dinh thuong dang đi vào vết xe đổ của tôi. Càng chứng minh, có...
            20-02-2025, 21:31
          • bqviet
            Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )
            bởi bqviet
            Thiết nghĩ thi thoảng bác lên đây chia xẻ ít kinh nghiệm cũng vui rồi. Còn chuyện con người sinh lão bệnh tử là thường, sống cùng với quy luật đó thôi. Bqv nhớ trước đây bác từng kể về chuyện rang chì ô-xít bằng chảo để phục hồi bình điện, đấy cũng là thành quả đáng nể phục ở thời kỳ thiếu thốn đó.
            20-02-2025, 17:22
          Đang tải...
          X