/* KeyPad12.c ATmega328/P on Arduino R3 board */ /* Input from KeyPad with 12 key eg. COM-08653 */ #include #define MCU atmega328p #define F_CPU 16000000UL #include /* KeyPad connections */ /* Redefine if other pins are used */ #define R1_pin PD6 #define R1_DDR DDRD #define R1_PIN PIND #define R1_PORT PORTD #define R2_pin PD7 #define R2_DDR DDRD #define R2_PIN PIND #define R2_PORT PORTD #define R3_pin PB0 #define R3_DDR DDRB #define R3_PIN PINB #define R3_PORT PORTB #define R4_pin PB1 #define R4_DDR DDRB #define R4_PIN PINB #define R4_PORT PORTB #define C1_pin PB5 #define C1_DDR DDRB #define C1_PIN PINB #define C1_PORT PORTB #define C2_pin PB3 #define C2_DDR DDRB #define C2_PIN PINB #define C2_PORT PORTB #define C3_pin PB2 #define C3_DDR DDRB #define C3_PIN PINB #define C3_PORT PORTB void KeyPad_deactivate( void ); char getchar_KeyPad( void ); char whichRow( void ); void init_uart( void ); void putchar_uart( char ); void _delay_ms (double); /* Definition of rows and columns */ const char keys[4][3] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'} }; int main(void) { char pressedKey; KeyPad_deactivate( ); init_uart( ); while(1) { pressedKey = getchar_KeyPad( ); } } /* *********************************** */ /* FUNCTIONS */ /* *********************************** */ char getchar_KeyPad( void ) { /* Note! Blocking function - waits until a Key is pressed */ char row, col, keychar; R1_DDR &= ~( 1 << R1_pin ); // "0" R1-pin direction is input R1_PORT |= ( 1 << R1_pin ); // "1" activate pullup resistor R2_DDR &= ~( 1 << R2_pin ); // "0" R2-pin direction is input R2_PORT |= ( 1 << R2_pin ); // "1" activate pullup resistor R3_DDR &= ~( 1 << R3_pin ); // "0" R3-pin direction is input R3_PORT |= ( 1 << R3_pin ); // "1" activate pullup resistor R4_DDR &= ~( 1 << R4_pin ); // "0" R4-pin direction is input R4_PORT |= ( 1 << R4_pin ); // "1" activate pullup resistor C1_DDR |= ( 1 << C1_pin ); // "1" C1-pin direction is output C2_DDR |= ( 1 << C2_pin ); // "1" C2-pin direction is output C3_DDR |= ( 1 << C3_pin ); // "1" C3-pin direction is output /* wait for any key pressed */ do { col = 1; // 011 C1_PORT &= ~( 1 << C1_pin ); // "0" C1-pin output is 0. C2_PORT |= ( 1 << C2_pin ); // "1" C2-pin output is 1. C3_PORT |= ( 1 << C3_pin ); // "1" C3-pin output is 1. _delay_ms(5); row = whichRow(); if( row != 0) break; col = 2; // 101 C1_PORT |= ( 1 << C1_pin ); // "1" C1-pin output is 1. C2_PORT &= ~( 1 << C2_pin ); // "0" C2-pin output is 0. C3_PORT |= ( 1 << C3_pin ); // "1" C3-pin output is 1. _delay_ms(5); row = whichRow(); if( row != 0) break; col = 3; // 110 C1_PORT |= ( 1 << C1_pin ); // "1" C1-pin output is 1. C3_PORT |= ( 1 << C2_pin ); // "1" C2-pin output is 1. C3_PORT &= ~( 1 << C3_pin ); // "0" C3-pin output is 0. _delay_ms(5); row = whichRow(); } while (row == 0); /* now a key is pressed */ keychar = keys[row -1][col-1]; // index starts with 0 putchar_uart ( keychar); // echo to the user /* wait for all keys released */ C1_PORT &= ~( 1 << C1_pin ); // "0" C1-pin output is 0. C2_PORT &= ~( 1 << C2_pin ); // "0" C2-pin output is 0. C3_PORT &= ~( 1 << C3_pin ); // "0" C3-pin output is 0. _delay_ms(5); do { row = whichRow(); } while ( row != 0 ); /* all keys are now released */ KeyPad_deactivate( ); _delay_ms(100); // wait debounce time return keychar; } char whichRow( void ) // used by function getchar_KeyPad() { unsigned char row = 0 ; if( ( R1_PIN & ( 1 << R1_pin ))==0 ) row=1; if( ( R2_PIN & ( 1 << R2_pin ))==0 ) row=2; if( ( R3_PIN & ( 1 << R3_pin ))==0 ) row=3; if( ( R4_PIN & ( 1 << R4_pin ))==0 ) row=4; return row; } void KeyPad_deactivate( void ) // disconnects KeyPad from all pins { C1_DDR &= ~( 1 << C1_pin ); // "0" C1-pin direction is input C1_PORT &= ~( 1 << C1_pin ); // "0" deactivate pullup resistor C2_DDR &= ~( 1 << C2_pin ); // "0" C2-pin direction is input C2_PORT &= ~( 1 << C2_pin ); // "0" deactivate pullup resistor C3_DDR &= ~( 1 << C3_pin ); // "0" C3-pin direction is input C3_PORT &= ~( 1 << C3_pin ); // "0" deactivate pullup resistor R1_DDR &= ~( 1 << R1_pin ); // "0" R1-pin direction is input R1_PORT &= ~( 1 << R1_pin ); // "0" deactivate pullup resistor R2_DDR &= ~( 1 << R2_pin ); // "0" R2-pin direction is input R2_PORT &= ~( 1 << R2_pin ); // "0" deactivate pullup resistor R3_DDR &= ~( 1 << R3_pin ); // "0" R3-pin direction is input R3_PORT &= ~( 1 << R3_pin ); // "0" deactivate pullup resistor R4_DDR &= ~( 1 << R4_pin ); // "0" R4-pin direction is input R4_PORT &= ~( 1 << R4_pin ); // "0" deactivate pullup resistor } void init_uart( void ) { // Bits in UCSR0B register: "RXCIE0 TXCIE0 UDRIE0 RXEN0 TXEN0 UCSZ02 RXB80 TXB80" UCSR0B |= (1<<(RXEN0)) | (1<<(TXEN0)); // "----1---" // Bits in UCSR0C register: "UMSEL01 UMSEL00 UPM01 UPM00 USBS0 UCSZ01/UCPHA0 UCSZ01/UCPHA0 UCPOL0" UCSR0C |= (1<<(UCSZ01)) | (1<<(UCSZ00)); // "-----11-" UBRR0 = 103; // Baud prescaler 103 -> 9600 Baud } void putchar_uart( char ch ) { // Bits in UCSR0A register: "RXC0 TXC0 UDRE0 FE0 DOR0 UPE0 U2X0 MPCM0" // wait until the port is ready to be written to while( ( UCSR0A & ( 1<<(UDRE0) ) ) == 0 ){} // write the byte to the serial port UDR0 = ch; } /* *********************************** */ /* HARDWARE */ /* *********************************** */ /* Chip ATMega328 Arduino Uno R3 stackable header _______ Digital: _____/ \__ Analog: ______________ ______________ txd ->-|D00 >RXD A5|- | \/ | rxd -<-|D01 -(D01)-|03 PD1/TXD PC3 26|-(A3)- -|D04 A1|- -(D02)-|04 PD2/INT0 PC2 25|-(A2)- -|D05~ A0|- -(D03)-|05 PD3/INT1/PWM PC1 24|-(A1)- R1 -<-|D06~ | Power: -(D04)-|06 PD4 PC0 23|-(A0)- R2 -<-|D07 Vin|- +5V ---|07 VCC GND 22|--- Gnd | GND|- Gnd ---|08 GND AREF 21|--- Vin R3 -<-|D08 GND|- Xtal |X|--|09 PB6/OSC1 AVCC 20|--- +5V R4 -<-|D09~ +5V|- 16MHz |X|--|10 PB7/OSC2 SCK/PB5 19|-(D13)->-C1 C3 -<-|D10~ +3.3V|- -(D05)-|11 PD5/PWM MISO/PB4 18|-(D12)- C2 -<-|D11~ Res|- R1->-(D06)-|12 PD6/PWM PWM/MOSI/PB3 17|-(D11)->-C2 -|D12 IOREF|- R2->-(D07)-|13 PD7 PWM/SS'/PB2 16|-(D10)->-C3 C1 -<-|D13 LED --- | R3->-(D08)-|14 PB0 PWM/PB1 15|-(D09)-<-R4 -|GND | |______________________________| -|AREF | -|SCL | -|SDA | |________________| */ /* KeyPad 12 key COM-08653 C1: C2: C3: R1: 1 2 3 R2: 4 5 6 R3: 7 8 9 R4: * 0 # Connections: KeyPad: - C2 R1 C1 R4 C3 R3 R2 - Pin: (-) (1) (2) (3) (4) (5) (6) (7) (-) | | | | | | | AVR chip: PB3 PD6 PB5 PB1 PB2 PB0 PD7 Pin: (17) (12) (19) (15) (16) (14) (13) | | | | | | | Arduino: D11 D06 D13 D09 D10 D08 D07 */