Saturday 29 October 2011

Keypad 4X4


This is as simple routine how to read 4x4 keypad keys using AVR-GCC language. The keypad is connected to AVR microcontroller 8 bit port. In this example it is B port. You can change ports depending on your needs – this is only an example ant it is not the only way to this.
 
Howt it works. Well very simply. PORTB is divided into two nibbles PINB0 – PINB3 as inputs (as rows) and PINB4-PINB7 as outputs (columns). The keys are checked in a loop in series. Lets say if we set first row output (PORTB bit 7) to 0 then when checking rows we are looking which bit is set to 0, because of key pressed with function bit_is_set(PINB, bitNo). This function gives non-zero if bit is clear.
10k resistors protect AVR from shortcuts.
#include <avr/io.h>
int main()
{
//high nibble for output(columns) low for input(rows);
DDRB=0xF0;
//enable internal pullups for PB0-PB3
PORTB=0x0F;
//Port D for indication only
DDRD=0xFF;
while (1) //loop key check forever
{
//first column
PORTB =0b01111111;
//check for rows and send key number to portD
//instead sending key number to PORTD you can use
// any function that serves pressed button
if (bit_is_set(PINB, 3)) PORTD=1;
if (bit_is_set(PINB, 2)) PORTD=2;
if (bit_is_set(PINB, 1)) PORTD=3;
if (bit_is_set(PINB, 0)) PORTD=4;
//second column
PORTB =0b10111111;
if (bit_is_set(PINB, 3)) PORTD=5;
if (bit_is_set(PINB, 2)) PORTD=6;
if (bit_is_set(PINB, 1)) PORTD=7;
if (bit_is_set(PINB, 0)) PORTD=8;
//third column
PORTB =0b11011111;
if (bit_is_set(PINB, 3)) PORTD=9;
if (bit_is_set(PINB, 2)) PORTD=10;
if (bit_is_set(PINB, 1)) PORTD=11;
if (bit_is_set(PINB, 0)) PORTD=12;
//fourth column
PORTB =0b11101111;
if (bit_is_set(PINB, 3)) PORTD=13;
if (bit_is_set(PINB, 2)) PORTD=14;
if (bit_is_set(PINB, 1)) PORTD=15;
if (bit_is_set(PINB, 0)) PORTD=16;
}
}

0 comments:

Post a Comment

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Raghu | Protected by - ElectroClub