Thông báo

Collapse
No announcement yet.

Cách dùng bàn phím ma trận 4x4

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

  • Cách dùng bàn phím ma trận 4x4

    Mặc dù trong phần các vấn đề cơ bản của I/O đã có ví dụ về vấn đề này, nhưng ở đây mình đưa ra riêng một thread để các bác mới ngâm cứu về AVR dễ tham khảo.

    Những điểm khác cơ bản của phần code này so với code ví dụ đã đưa:
    - Ngắn gọn hơn
    - Không tốn Timer
    - Chống rung phím đơn giản, hiệu quả (không dùng delay)
    - Dễ định nghĩa cho các loại bàn phím khác nhau

    File Key4x4.h
    Code:
    #ifndef _KEY4X4_H_
    #define _KEY4X4_H_
    //-----------------------------------------------------------------//
    
    // ----- Define Hardware ------//
    #define KEY4X4_PORT       PORTC
    #define KEY4X4_PIN        PINC
    #define KEY4X4_DDR        DDRC
    
    unsigned char KeyPad[4][4] = {
    					 '7', '8', '9', '/',
    					 '4', '5', '6', 'x',
    					 '1', '2', '3', '-',
    					 'C', '0', '=', '+'};
    
    /*
    unsigned char KeyPad[4][4] = {
    					 '1', '2', '3', 'A',
    					 '4', '5', '6', 'B',
    					 '7', '8', '9', 'C',
    					 '#', '0', '*', 'D'};
    
    // ----- Define Firmware ------//
    */
    
    #endif
    
    
    /* HARDWARE CONNECTION
    
      1 PD0 -------0----1----2----3
                   |    |    |    |
      2 PD1 -------4----5----6----7
                   |    |    |    |
      3 PD2 -------8----9----10---11
                   |    |    |    |
      4 PD3 -------12---13---14---15
             R1    |    |    |    |
      5 PD4 -~~~~~-|    |    |    |
             R2         |    |    |
      6 PD5 -~~~~~------|    |    |
             R3              |    |
      7 PD6 -~~~~~-----------|    |  R1..R4=10k..47k
             R4                   |
      8 PD7 -~~~~~----------------| 
    
    */
    File Key4x4.c

    Code:
    /*****************************************************
    Project : Keypad Matrix 4x4
    Version : 1.0
    Date    : 07-11-2007
    Author  : Nam                             
    Company : PYT                            
    
    Chip type           : ATmega16
    Program type        : Application
    Clock frequency     : 12 MHz
    Memory model        : Small
    External SRAM size  : 0
    Data Stack size     : 256
    *****************************************************/
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include "key4x4.h"
    
    
    //-----------------------------------------------------------------//
    // Global variables
    
    uint8_t	key_old_state[4][4];
    
    //------------------------------------------------------------------------------//
    void check_key()
    {
    	for (uint8_t row=0; row<4; row++) {
    		KEY4X4_PORT = (1<<row); //select row
    
    		for (uint8_t col=0; col<4; col++) {
    			uint8_t key_cur_state = (KEY4X4_PIN>>col+4) & 1;
    
    			if (key_cur_state && (!key_old_state[row][col])) {
    				uint8_t key_code = KeyPad[row][col];
    				lcd_putchar(key_code);
    			}
    
    			key_old_state[row][col] = key_cur_state;
    		}
    	}
    }
    //------------------------------------------------------------------------------//
    
    int main(void)
    {
    	// ----------------- Input/Output Ports initialization ---------------
    	KEY4X4_PORT = 0xFF; // Pull-up R
    	KEY4X4_DDR = 0x0F;  // 4 row -> output, 4 col -> input
    	
    	lcd_init(16);
    
    	// Global enable interrupts
    	sei();
    
    	while (1) {
    		check_key();
        }; //while
    }
    Trong file gởi kèm có phần mô phỏng trên Protues kèm theo.
    Attached Files

  • #2
    Xin hỏi tintintin:
    Ở phần Hadware connection: các pins PD4...PD7 nhw hình vẽ là nối qua R1...R4 rồi mới vào nút nhấn. Còn nếu là pull-up thi nối vào nút nhấn và nối lên V+. Vậy chính xác là kiểu nào?

    Comment


    • #3
      Tôi tìm hiểu hóa ra thế này: Đối với AVR do có R pullups bên trong nên dùng phần mềm cài đặt, không cần R ngoài kéo lên...Nếu có như sơ đồ của tintintin thì họ giải thích là tránh ngắn mạch giữa các cực của IC. Các IC không có R pullups bên trong thì phải có R ngoài kéo lên V+...

      Comment


      • #4
        về cái này thì trong codevision có example rồi đấy. vào đó mở file này mà coi.
        cách viết khá hay, dùng timer, mỗi lần chỉ quét một cột, có chống rung, chống nhiễu, ngoài ra còn có thời gian release phím nữa. dùng cho trường hợp bạn cần nhận phím nhấn liên tục thay vì nhấn nhiều lần.
        tuy nhiên để dễ sử dụng và điều chỉnh linh hoạt thì chắc là cần sửa cái exp đó một tí.

        thân!

        Comment


        • #5
          Nguyên văn bởi nguyencong04
          các bạn cho mình hỏi tí
          nếu nhập từ bàn phím được rồi bây giờ mình muốn nhập giá trị hàng chục, hàng trăm
          sau đó khi gặp phím +;-;*;/ thì làm phép toán tương ứng rồi hiển thị kết quả thì thuật toán thế nào và phải xử lý những gì mong các bạn giúp đỡ.
          cảm ơn mọi người!
          cái này động não lên 1 tí .... nhập hàng chục thì nhân với 10 , trăm thì nhân 100.

          vd : int ketqua;
          char a,b,c,d;
          ketqua = a+b*10+c*100+d*1000;

          còn +,-,*,/ thì :
          nếu bấm phím * thì làm phép toán xxxx * yyy .... làm gì nữa thì tùy

          Comment


          • #6
            Nguyên văn bởi tintintin Xem bài viết

            if (key_cur_state && (!key_old_state[row][col])) {
            uint8_t key_code = KeyPad[row][col];
            lcd_putchar(key_code);
            }
            .

            Các bác cho e hỏi về đoạn code này với. E mới học lập trình nên ko rõ lắm. Thanks

            Comment

            Về tác giả

            Collapse

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

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

            Collapse

            • bqviet
              Trả lời cho Đấu tắt điện cho máy tính bảng
              bởi bqviet
              Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
              06-12-2025, 17:17
            • nguyendinhvan
              Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
              bởi nguyendinhvan
              Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
              05-12-2025, 19:59
            • afrendly
              Trả lời cho Đấu tắt điện cho máy tính bảng
              bởi afrendly
              Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
              04-12-2025, 01:27
            • nick22
              Trả lời cho Máy điện châm ?
              bởi nick22
              Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
              01-12-2025, 13:23
            Đang tải...
            X