►Programming 8051 Microcontroller

►8051 Assembly Program for 4x4 Keypad Matrix

keyport equ P2			;Keypad port connected here
col1 equ P2.0			;Column 1
col2 equ P2.1			;Column 2
col3 equ P2.2			;Column 3
col4 equ P2.3			;Column 4

keyval equ 30H			;To store key number
pressed bit 0H			;Flag

key_init:
	mov keyport,#0FH	;Make rows as o/p and col as i/p
	ret

get_key:
	mov keyval,#0		;reset the number
	mov keyport,#7FH	;make Row1 low
	acall read_col		;read columns

	jb pressed, done	;check if flag is set

	mov keyval,#4		;if not then read next row
	mov keyport,#0BFH	;make Row2 low
	acall read_col		;read columns

	jb pressed, done	;check if flag is set

	mov keyval,#8		;if not then read next row
	mov keyport,#0DFH	;make row3 low
	acall read_col		;read columns

	jb pressed, done	;check if flag is set

	mov keyval,#12		;if not read row4
	mov keyport,#0EFH	;make row4 low
	acall read_col		;read columns

done:
	ret

read_col:			;read columns routine
	clr pressed		;reset the flag

	jb col1, nextcol	;check if first key is pressed
	jnb col1,$		;if yes then wait for key release	
	setb pressed		;set the flag
	ret

nextcol:			;read col2
	jb col2, nextcol1	;check if second key is pressed
	jnb col2,$		;if yes then wait for key release
	inc keyval		;its key number 2
	setb pressed		;set the flag
	ret

nextcol1:			;read col3
	jb col3, nextcol2	;check if third key is pressed
	jnb col3,$		;if yes then wait for key release
	inc keyval		;its key 3
	inc keyval
	setb pressed		;set the flag
	ret

nextcol2:			;read column 4
	jb col4, exit		;check if fourth key pressed
	jnb col4,$		;if yes then wait for key release
	inc keyval		;its key 4
	inc keyval
	inc keyval
	setb pressed		;set the flag
	ret

exit:				;if no key is pressed
	clr pressed		;clr the flag
	clr keyval		;reset the number
	ret

	end




►C Program for 4x4 Keypad Matrix

#include <AT89X51.H>
	//Include file for 8051
#define keyport P2	//keypad connected to P2
#define col1 P2_0	//column 1
#define col2 P2_1	//column 2
#define col3 P2_2	//column 3
#define col4 P2_3	//column 4
#define TRUE 1		//some defines
#define FALSE 0

/*
+---------------------------------------+
| Prototype: void key_init(void);       |
| Return Type: void                     |
| Arguments: None                       |
| Description: Initialize ports and     |
|              Keypad.                  |
+---------------------------------------+
*/
void key_init(){
	keyport &=0x0F;	//make Rows as o/p and cols are i/p
}

/*
+-----------------------------------------------+
| Prototype: unsigned char get_key(void);       |
| Return Type: unsigned char                    |
| Arguments: None                               |
| Description: To read key from the keypad      |
+-----------------------------------------------+
*/
unsigned char get_key(){
	unsigned char i,k,key=0;
	k=1;
	for(i=0;i<4;i++){		//loop for 4 rows
		keyport &=~(0x80>
>
i);	//to make rows low 1 by 1
			if(!col1){	//check if key1 is pressed
				key = k+0;	//set key number
				while(!col1);	//wait for release
				return key;	//return key number
			}
			if(!col2){	//check if key2 is pressed
				key = k+1;	//set key number
				while(!col2);	//wait for release
				return key;	//return key number
			}
			if(!col3){	//check if key3 is pressed
				key = k+2;	//set key number
				while(!col3);	//wait for release
				return key;	//return key number
			}
			if(!col4){	//check if key4 is pressed
				key = k+3;	//set key number
				while(!col4);	//wait for release
				return key;	//return key number
			}
		k+=4;			//next row key number
		keyport |= 0x80>
>
i;	//make the row high again
	}
	return FALSE;			//return false if no key pressed
}



Example of how to use the above functions is given here.


◄ AVR Program  |  Back to Index ►

Downloads

Comments

Oariorrca
Wed Oct 16 2024, 01:14 am
Oariorvln
Wed Oct 16 2024, 12:59 am
Jamesrat
Wed Oct 16 2024, 12:56 am
Cazrwam
Tue Oct 15 2024, 04:50 pm
Cazrlby
Tue Oct 15 2024, 04:34 pm
Ameliaror
Tue Oct 15 2024, 03:02 pm
GlendaInvaf
Tue Oct 15 2024, 02:30 pm
Georgepucky
Tue Oct 15 2024, 12:11 am