// Bağlantılar
const int clkPin = 11; // CLK pini
const int dioPin = 12; // DIO pini
const byte rowPins[] = {9, 8, 7, 6}; // Keypad row pinleri
const byte colPins[] = {5, 4, 3, 2}; // Keypad column pinleri
char keys[4][4] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
char nums[4] = {'0', '0', '0', '0'};
int digitIndex = 0;
void setup() {
pinMode(clkPin, OUTPUT);
pinMode(dioPin, OUTPUT);
for (int i = 0; i < 4; i++) {
pinMode(rowPins[i], INPUT_PULLUP);
}
for (int i = 0; i < 4; i++) {
pinMode(colPins[i], OUTPUT);
digitalWrite(colPins[i], HIGH);
}
tm1637Init();
for (int i = 0; i < 4; i++) {
tm1637DisplayDigit(i, nums[i] - '0');
}
int i = 0;
}
void loop() {
char key = getKey();
if (isdigit(key)) {
nums[digitIndex] = key;
tm1637DisplayDigit(digitIndex, key - '0');
digitIndex = (digitIndex + 1) % 4;
}
if (key == '#') {
tm1637DisplayDigit(0, ' ');
}
if (key == '*') {
for (int i = 0; i < 4; i++) {
tm1637DisplayDigit(i, '1');
nums[i]=0;
}
digitIndex=0;
}
}
char getKey() {
for (int i = 0; i < 4; i++) {
digitalWrite(colPins[i], LOW);
for (int j = 0; j < 4; j++) {
if (digitalRead(rowPins[j]) == LOW) {
delay(10);
char key = keys[j][i];
digitalWrite(colPins[i], HIGH);
return key;
}
}
digitalWrite(colPins[i], HIGH);
}
return 0;
}
void tm1637Start() {
digitalWrite(clkPin, HIGH);
digitalWrite(dioPin, HIGH);
digitalWrite(dioPin, LOW);
digitalWrite(clkPin, LOW);
}
void tm1637Stop() {
digitalWrite(clkPin, LOW);
digitalWrite(dioPin, LOW);
digitalWrite(clkPin, HIGH);
digitalWrite(dioPin, HIGH);
}
void tm1637WriteByte(uint8_t data) {
for (uint8_t i = 0; i < 8; i++) {
digitalWrite(clkPin, LOW);
if (data & 0x01) {
digitalWrite(dioPin, HIGH);
} else {
digitalWrite(dioPin, LOW);
}
data >>= 1;
digitalWrite(clkPin, HIGH);
}
digitalWrite(clkPin, LOW);
digitalWrite(dioPin, HIGH);
digitalWrite(clkPin, HIGH);
digitalWrite(dioPin, LOW);
}
void tm1637DisplayDigit(uint8_t digit, uint8_t value) {
uint8_t segmentData = 0;
if (value != 0x7F) {
segmentData = tm1637DigitToSegment(value);
}
tm1637Start();
tm1637WriteByte(0x44); // Data Write for 1st digit + Address
tm1637Stop();
tm1637Start();
tm1637WriteByte(0xC0 + digit); // Auto Address Increment (00-07) + Address
tm1637WriteByte(segmentData);
tm1637Stop();
}
void tm1637DisplayAll() {
for (uint8_t digit = 0; digit < 4; digit++) {
tm1637DisplayDigit(digit, nums[digit] - '0');
}
}
void tm1637Init() {
tm1637Start();
tm1637WriteByte(0x8a); // Display Control Set (8x - 1/16)
tm1637Stop();
tm1637Start();
tm1637WriteByte(0x40); // Data Command (Write Data)
tm1637Stop();
}
uint8_t tm1637DigitToSegment(uint8_t digit) {
static const uint8_t digitToSegment[] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F, // 9
0x40 // Blank
};
return digitToSegment[digit];
}