Ini produknya. Saya mengerti idenya: 16 tombol ini menggunakan matriks 4x4. 4 baris untuk baris, 4 baris untuk kolom, dan kami memiliki 8 kabel.
Tapi:
Bagaimana ini bisa bekerja tanpa multiplexer?
Bisakah ini mendeteksi secara akurat penekanan beberapa tombol? Bahkan jika tombol menggunakan baris atau kolom yang sama? Contoh: tombol pada posisi (2,2) (2,3), (3,2), dan (3,3) ditekan secara bersamaan.
Bagaimana cara kerjanya?
Jawaban:
Tidak. Papan tombol tampaknya hanya memiliki saklar, dengan beberapa dioda mungkin tidak dapat kita lihat. Namun, papan kiri sepertinya memiliki prosesor di atasnya. Hampir pasti, multiplexing sedang dilakukan dalam firmware.
Algoritma multiplexing bekerja seperti ini:
Proses di atas diulang cukup cepat sehingga semua tombol diperiksa dalam waktu yang masih terasa instan bagi pengamat manusia. Batas manusia "sesaat" dalam konteks ini adalah sekitar 50 ms. Bahkan mikrokontroler low-end dapat memindai keypad 4x4 dalam waktu yang jauh lebih sedikit dari itu.
Mungkin iya. Salah satu caranya adalah dengan meletakkan dioda secara seri dengan masing-masing tombol. Itu bisa berada di sisi bawah papan yang Anda perlihatkan. Dengan dioda, algoritma yang dijelaskan di atas hanya berfungsi.
Cara lain adalah dengan meletakkan resistor secara seri dengan garis dan mengukur tegangan analognya. Bahkan dengan beberapa tombol memendekkan beberapa baris / kolom secara bersamaan, Anda akhirnya dapat mengetahui tombol mana yang ditekan. Ini membutuhkan input A / D dalam mikro, bukan hanya input digital seperti ketika dioda digunakan.
sumber
Tanpa dioda ... Anda akan mendapatkan persegi panjang hantu.
Misalnya dalam contoh Anda (2,2) (2,3), (3,2), dan (3,3); Anda memilih contoh ironis dengan memilih persegi panjang. Jika Anda benar-benar menekan keempatnya, itu akan berhasil. Tetapi jika Anda menekan tiga sudut persegi panjang, sudut keempat juga akan tampak ditekan, meskipun tidak.
Keypad itu jelas dimaksudkan untuk entri data keyboard, di mana konvensi pengguna adalah penekanan tombol satu per satu. Anda perhatikan tidak ada tombol "shift" pada keypad entri kartu kredit pompa bensin, misalnya.
Namun, jika Anda membuat S1 sebagai tombol shift, dan S3 sebagai tombol alt-shift sehingga pengguna mungkin bisa menahan keduanya sekaligus menekan S13, maka S15 juga akan tampak ditekan.
sumber
Berikut cara melakukannya tanpa pemindaian berkelanjutan:
sumber
Saya telah melakukan ini dengan Bahasa Majelis pada mikrokontroler AVR Atmel telanjang.
Untuk kesederhanaan: Baris Keypad: gunakan Pin Arduino 4,5,6 dan 7 (pin AVR PD4, PD5, PD6, dan PD7) Kolom keypad: gunakan Pin Arduino 8, 9, 10 dan 11 (pin AVR PB0, PB1, PB2 dan PB3 ) Buat input pin Baris dengan pull-up diaktifkan. Buat pin Kolom Output dan output nol untuk mereka. Aktifkan Pin Change Interrupts pada semua pin baris dan kolom. http://playground.arduino.cc/Main/PinChangeInterrupt Menekan tombol pada keypad akan menarik pin Row rendah. Rutin interupsi perlu membaca pin baris dan menemukan pin yang rendah. 4 bit atas harus tiga dan satu nol. Jika Anda menggunakan variabel uint8_t 8 bit, Anda dapat membaginya dengan 16 atau (var >> 4) untuk meletakkan 4 bit di bit yang lebih rendah dari angka tersebut. Anda dapat menggunakan bitwise OR | operasi dengan 240 untuk mengatur 4 bit bagian atas menjadi 1s dan operasi bitwise NOT ~ untuk membalikkan semua bit sehingga Anda hanya memiliki satu bit yang mewakili baris penekanan tombol. Simpan nomor ini sebagai 0, 1, 2 atau 3.
Ganti konfigurasi pin:
Buat input pin Kolom dengan pull-up diaktifkan. Buat pin Row Output dan output nol kepada mereka. Baca pin kolom dan temukan pin yang rendah. Lakukan manipulasi yang sama dengan nilai ini kecuali Anda tidak harus menggeser angka ke kanan. Setelah var ^ 240 dan ^ var Anda memiliki satu bit untuk mewakili kolom tekan tombol aktif. Ingatlah untuk menonaktifkan interupsi sebelum mengkonfigurasi ulang port karena kemungkinan akan memicu interupsi yang tidak diinginkan. Anda mungkin harus menghapus tanda interupsi ketika meninggalkan rutin interupsi untuk mencegah penanganan interupsi duplikat.
sumber