#define F_CPU 16000000UL
#include <avr/interrupt.h>
#include <avr/io.h>
#include <string.h>
#include <util/delay.h>
#include <avr/eeprom.h> // EEPROM kütüphanesi
#define keypadDirectionRegisterR DDRB
#define keypadPortControlR PORTB
#define keypadPortValueR PINB
#define keypadDirectionRegisterC DDRC
#define keypadPortControlC PORTC
#define keypadPortValueC PINC
#define ctrl PORTD // We are using port D
#define en 2 // enable signal pin 2
#define rw 1 // read/write signal pin 1
#define rs 0 // register select signal 0
void lcd_command(unsigned char cmd);
void lcd_init(void);
void lcd_data(unsigned char data);
void lcdCommand(char);
void lcdData(char);
void lcd_print(unsigned char *str);
void lcd_gotoxy(unsigned char x, unsigned char y);
void keypadScan(void);
void save_to_eeprom(uint8_t address, char data);
char read_from_eeprom(uint8_t address);
int eeprom_address = 0; // EEPROM adresi için başlangıç değeri
typedef struct {
const char name[20];
int calories;
} Product;
typedef struct {
const char name[30];
Product products[5]; // Ürün sayısını 5'e düşürdük
} Category;
const Category categories[] = {
{"Fruits", {
{"Peach", 59}, {"Grape", 62}, {"Strawberry", 53}, {"Pomegranate", 83}, {"Olive", 115}
}},
{"Meat and Dairy", {
{"Ribeye", 402}, {"Beef", 679}, {"Fillet", 170}, {"Mince", 250}, {"Ostrich", 206}
}},
{"Vegetables", {
{"Tomato", 22}, {"Potato", 77}, {"Carrot", 41}, {"Lettuce", 5}, {"Spinach", 23}
}},
{"Grains", {
{"Rice", 130}, {"Bread", 79}, {"Pasta", 131}, {"Oatmeal", 68}, {"Quinoa", 120}
}},
{"Seafood", {
{"Salmon", 208}, {"Tuna", 132}, {"Shrimp", 99}, {"Cod", 82}, {"Crab", 97}
}},
{"Desserts", {
{"Cake", 260}, {"Ice Cream", 207}, {"Cookies", 502}, {"Pudding", 140}, {"Donut", 195}
}},
{"Beverages", {
{"Water", 0}, {"Tea", 2}, {"Coffee", 2}, {"Juice", 112}, {"Milk", 103}
}},
{"Snacks", {
{"Chips", 152}, {"Popcorn", 106}, {"Nuts", 607}, {"Pretzels", 195}, {"Crackers", 129}
}},
{"Condiments", {
{"Ketchup", 112}, {"Mustard", 66}, {"Mayo", 94}, {"Soy Sauce", 9}, {"BBQ Sauce", 70}
}}
};
int main() {
DDRD = 0xFF; // Setting DDRD to output // setting for port D
lcd_init(); // initialization of LCD function
_delay_ms(30);
lcd_gotoxy(1, 1); // Go to the location 1,1 of lcd
lcd_print("Press a key"); // Print the text
lcd_gotoxy(1, 2); // Go to the location 1,2 of lcd
// Keypad initialization
keypadDirectionRegisterR = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3);
keypadDirectionRegisterC = (0 << 0) | (0 << 1) | (0 << 2) | (0 << 3);
keypadPortControlR = (0 << 0) | (0 << 1) | (0 << 2) | (0 << 3);
keypadPortControlC = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3);
while (1) {
keypadScan();
};
return 0;
}
void keypadScan() {
// Store value for column
uint8_t keyPressCodeC = keypadPortValueC;
keypadDirectionRegisterC ^= (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3);
keypadDirectionRegisterR ^= (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3);
keypadPortControlC ^= (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3);
keypadPortControlR ^= (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3);
_delay_ms(5);
// Store value for row
int temp = keypadPortValueR;
uint8_t keyPressCodeR = temp << 4;
// Add value for column and row
uint8_t keyPressCode = keyPressCodeC | keyPressCodeR;
// Comparison and resultant action
char key = '\0'; // Basılan tuşu saklamak için değişken
// Column one
if (keyPressCode == 0b11101110) {
key = '1';
} else if (keyPressCode == 0b11011110) {
key = '4';
} else if (keyPressCode == 0b10111110) {
key = '7';
} else if (keyPressCode == 0b01111110) {
key = '*';
}
// Column two
else if (keyPressCode == 0b11101101) {
key = '2';
} else if (keyPressCode == 0b11011101) {
key = '5';
} else if (keyPressCode == 0b10111101) {
key = '8';
} else if (keyPressCode == 0b01111101) {
key = '0';
}
// Column three
else if (keyPressCode == 0b11101011) {
key = '3';
} else if (keyPressCode == 0b11011011) {
key = '6';
} else if (keyPressCode == 0b10111011) {
key = '9';
} else if (keyPressCode == 0b01111011) {
key = '#';
}
if (key != '\0') { // Eğer geçerli bir tuş basılmışsa
lcd_print(&key); // Tuşu LCD'ye yazdır
save_to_eeprom(eeprom_address++, key); // Tuşu EEPROM'a kaydet ve adresi artır
if (key >= '1' && key <= '9') {
int category = key -'1';
//lcd_command(0x01); // Clear LCD
_delay_ms(1);
lcd_gotoxy(1, 1);
char categoryName[30];
strcpy_P(categoryName, categories[category].name);
lcd_print(categoryName);
}
}
}
void save_to_eeprom(uint8_t address, char data) {
eeprom_update_byte((uint8_t*)address, data);
}
char read_from_eeprom(uint8_t address) {
return eeprom_read_byte((const uint8_t*)address);
}
void lcd_gotoxy(unsigned char x, unsigned char y) {
unsigned char firstCharAdr[] = {0x80, 0xC0, 0x94, 0xD4};
lcdCommand(firstCharAdr[y - 1] + x - 1);
_delay_ms(0.1);
}
void lcd_init(void) {
lcdCommand(0x02); // To initialize LCD in 4-bit mode.
_delay_ms(1);
lcdCommand(0x28); // To initialize LCD in 2 lines, 5X7 dots and 4bit mode.
_delay_ms(1);
// lcdCommand(0x01); // Clear LCD
_delay_ms(1);
lcdCommand(0x0E); // Turn on cursor ON
_delay_ms(1);
lcdCommand(0x80); // —8 go to first line and –0 is for 0th position
_delay_ms(1);
return;
}
void lcdCommand(char cmd_value) {
char cmd_value1;
cmd_value1 = cmd_value & 0xF0; // Mask lower nibble
lcd_command(cmd_value1); // Send to LCD
cmd_value1 = ((cmd_value << 4) & 0xF0); // Shift 4-bit and mask
lcd_command(cmd_value1); // Send to LCD
}
void lcdData(char data_value) {
char data_value1;
data_value1 = data_value & 0xF0; // Mask lower nibble
lcd_data(data_value1); // because PD4-PD7 pins are used.
data_value1 = ((data_value << 4) & 0xF0); // Shift 4-bit and mask
lcd_data(data_value1); // Send to LCD
}
void lcd_command(unsigned char cmd) {
deger = cmd;
deger &= ~(1 << rs); // RS = 0 for command
deger &= ~(1 << rw); // RW = 0 for write
deger |= (1 << en); // EN = 1 for High to Low pulse
_delay_ms(1);
deger &= ~(1 << en); // EN = 0 for High to Low pulse
_delay_ms(40);
return;
}
void lcd_data(unsigned char data) {
deger = data;
deger |= (1 << rs); // RS = 1 for data
deger &= ~(1 << rw); // RW = 0 for write
deger |= (1 << en); // EN = 1 for High to Low pulse
_delay_ms(1);
deger &= ~(1 << en); // EN = 0 for High to Low Pulse
_delay_ms(40);
return;
}
void lcd_print(unsigned char *str) {//yazdir
int i = 0;
while (str[i] != '\0') { // loop will go on till the NULL character in the string
lcdData(str[i]); // sending data on LCD byte by byte
i++;
}
return;
}