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

          Đang tải...
          X