#include <Keypad.h>
// กำหนดพอร์ตสำหรับคีย์แพด 4x4
#define ROWS 4
#define COLS 4
byte rowPinsKeypad[ROWS] = {4, 5, 18, 19}; // พอร์ตสำหรับแถวคีย์แพด
byte colPinsKeypad[COLS] = {21, 22, 23, 25}; // พอร์ตสำหรับคอลัมน์คีย์แพด
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// สร้างตัวแปร Keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPinsKeypad, colPinsKeypad, ROWS, COLS);
#define latchPin 12 // Latch pin ของ 74HC595
#define clockPin 14 // Clock pin ของ 74HC595
#define dataPin 27 // Data pin ของ 74HC595
byte i;
byte j;
int row, col;
// storage variable
byte dataToSend;
String input = ""; // เก็บข้อมูลที่กด
void setup() {
Serial.begin(115200);
// ตั้งค่า GPIO สำหรับ Latch, Clock, Data pin
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
dataToSend = (1 << (i + 4)) | (15 & ~(1 << j));
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, dataToSend);
digitalWrite(latchPin, HIGH);
delay(100); // wait
}
}
// ปิดทุก LED
dataToSend = 0x00;
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, dataToSend);
digitalWrite(latchPin, HIGH);
}
void loop() {
char key = keypad.getKey(); // อ่านค่าที่กดจากคีย์แพด
if (key) {
Serial.println(key); // แสดงค่าที่กดใน Serial Monitor
if (key == '#') { // หากกดปุ่ม '#'
// แปลงค่าใน input เป็น row และ col
if (input.length() == 2) {
row = input.charAt(0) - '0'; // แปลงตัวเลขตัวแรกเป็นค่า row
col = input.charAt(1) - '0'; // แปลงตัวเลขตัวที่สองเป็นค่า col
// แสดงค่าที่เก็บใน Serial Monitor
Serial.print("Row: ");
Serial.print(row);
Serial.print(", Col: ");
Serial.println(col);
// สร้างข้อมูลที่ต้องส่งไปที่ 74HC595
dataToSend = (1 << (row + 4)) | (15 & ~(1 << col));
Serial.println(dataToSend); // แสดงค่า dataToSend ใน Serial Monitor
digitalWrite(latchPin, LOW);
// shift out the bits of dataToSend to the 74HC595
shiftOut(dataPin, clockPin, LSBFIRST, dataToSend);
digitalWrite(latchPin, HIGH);
}
// ล้างข้อมูลใน input หลังจากกด #
input = "";
} else if (key >= '0' && key <= '9') {
// กดตัวเลขและเก็บใน input
input += key;
Serial.print("Input: ");
Serial.println(input); // แสดงข้อมูลที่เก็บใน input
} else if (key == 'D') {
// ปิดทุก LED
dataToSend = 0x00;
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, dataToSend);
digitalWrite(latchPin, HIGH);
} else if (key == 'A') {
displayPattern();
}
}
}
void displayPattern() {
byte pattern[1] = {0xAA}; // รูปแบบที่กำหนด
for (byte i = 0; i < 4; i++) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, pattern[i]);
digitalWrite(latchPin, HIGH);
delay(200);
}
}