#include #include #include "prgKeyboard.h" // General hardware void initPorts(void) { // LEDs LED_DDR |= (1 << LED_RED); LED_DDR |= (1 << LED_GREEN); LED_PORT &= ~(1 << LED_RED); // switch 'em off LED_PORT &= ~(1 << LED_GREEN); // Keypad // X-Axis // Set Keypad X-Axis as inputs Keypad_DDR_X &= ~(1 << Keypad_X1) & ~(1 << Keypad_X2) & ~(1 << Keypad_X3) & ~(1 << Keypad_X4); // And enable the pullups Keypad_PORT_X |= (1 << Keypad_X1) | (1 << Keypad_X2) | (1 << Keypad_X3) | (1 << Keypad_X4); // Y-Axis // Set Keypad Y-Axis as outputs Keypad_DDR_Y |= (1 << Keypad_Y1) | (1 << Keypad_Y2) | (1 << Keypad_Y3) | (1 << Keypad_Y4); // And set 'em all to high (no keypressses will be registered) Keypad_PORT_Y |= (1 << Keypad_Y1) | (1 << Keypad_Y2) | (1 << Keypad_Y3) | (1 << Keypad_Y4); // MODE Keypad_MDDDR &= ~(1 << Keypad_MD); // Set it as input Keypad_MDPORT |= (1 << Keypad_MD); // Enable pullup // EEPROM (24lc64) // !!! Write protection cannot be used because of an error in the circuit !!! EEPROM_PORT |= (1 << EEPROM_SDA); //pullups EEPROM_PORT |= (1 << EEPROM_SCL); return; } uint8_t getKey() { // Check for the MODE-Button if (!(Keypad_MDPIN & (1 << Keypad_MD))) return Key_MODE; // MODE PRESSED // First make sure all bits except the first one are high Keypad_PORT_Y |= (1 << Keypad_Y2) | (1 << Keypad_Y3) | (1 << Keypad_Y4); // Now clear the first one so that it's able to pull the pressed bit low Keypad_PORT_Y &= ~(1 << Keypad_Y1); KEYDELAY if (!(Keypad_PIN_X & (1 << Keypad_X1))) return 1; if (!(Keypad_PIN_X & (1 << Keypad_X2))) return 2; if (!(Keypad_PIN_X & (1 << Keypad_X3))) return 3; if (!(Keypad_PIN_X & (1 << Keypad_X4))) return 4; Keypad_PORT_Y |= (1 << Keypad_Y1); // first high Keypad_PORT_Y &= ~(1 << Keypad_Y2); KEYDELAY // second low if (!(Keypad_PIN_X & (1 << Keypad_X1))) return 5; if (!(Keypad_PIN_X & (1 << Keypad_X2))) return 6; if (!(Keypad_PIN_X & (1 << Keypad_X3))) return 7; if (!(Keypad_PIN_X & (1 << Keypad_X4))) return 8; Keypad_PORT_Y |= (1 << Keypad_Y2); // second high Keypad_PORT_Y &= ~(1 << Keypad_Y3); KEYDELAY // third low if (!(Keypad_PIN_X & (1 << Keypad_X1))) return 9; if (!(Keypad_PIN_X & (1 << Keypad_X2))) return 10; if (!(Keypad_PIN_X & (1 << Keypad_X3))) return 11; if (!(Keypad_PIN_X & (1 << Keypad_X4))) return 12; Keypad_PORT_Y |= (1 << Keypad_Y3); // third high Keypad_PORT_Y &= ~(1 << Keypad_Y4); KEYDELAY // forth low if (!(Keypad_PIN_X & (1 << Keypad_X1))) return 13; if (!(Keypad_PIN_X & (1 << Keypad_X2))) return 14; if (!(Keypad_PIN_X & (1 << Keypad_X3))) return 15; if (!(Keypad_PIN_X & (1 << Keypad_X4))) return 16; // if nothing is pressed return 0; } // 24LC64 void EEOpen() { //Set up TWI Module TWBR = 5; TWSR &= (~((1<>8); //Initiate Transfer TWCR=(1<>8); //Initiate Transfer TWCR=(1<