| ??? 12/17/06 21:43 Read: times |
#129648 - Key scanning in C51 |
Off lately, I have been involved in converting all my A51 codes into C51. One of them happens to be the HEXkeypad key scanning (original A51 version is here http://www.8052.com/forum/read.phtml?id=120801). Below is the C51 version of the A51 key scan routine (concept remains same) which had been discussed elaborately in this forum before. I would appreciate it if anybody out there would post some comments regarding the reliability of the “unsigned char key_scan(void)” subroutine. The code is ‘working fine’ ‘for me’. (Out of my previous experiences I am sure that I will get quite a few comments on this sentence too. )
#include<reg51.h>
#include "delay.h"
#define LCDport P1
sbit RS=LCDport^1;
sbit RW=LCDport^2;
sbit EN=LCDport^3;
#include "4bit_lcd.h"
#define KEYPADport P0
sbit row0=KEYPADport^0;
sbit row1=KEYPADport^1;
sbit row2=KEYPADport^2;
sbit row3=KEYPADport^3;
#define debounce_delay 20
sbit clmn0=KEYPADport^7;
sbit clmn1=KEYPADport^6;
sbit clmn2=KEYPADport^5;
sbit clmn3=KEYPADport^4;
unsigned char code mat[4][4]={'1','2','3','A', // lookup table
'4','5','6','B',
'7','8','9','C',
'*','0','#','D'};
unsigned char find_clmn(unsigned int row_num) // row_num = row-number of press key
{
unsigned int clmn_num=0;
while(clmn0!=0) // corresponding column of the press key will be grounded,
{ //so check last bit for '0'
KEYPADport<<=1; // shift left until column is found
clmn_num++; // keep track of column-number
}
return mat[row_num][clmn_num]; // return the character equivalent(look-up table)of pressed key
}
unsigned char key_scan(void)
{
unsigned char character;
unsigned int temp;
do // check if all keys are released initially
{
KEYPADport=0xf0; // all rows low, all columns high
temp=KEYPADport;
temp&=0xf0; // consider only columns
}
while(temp!=0xf0); // key pressed=> one of the columns go low
while (1)
{
do
{
do // check if any key is pressed
{
delay_ms(debounce_delay);
temp=KEYPADport;
temp&=0xf0; // consider only columns
}
while(temp==0xf0); // key pressed=> one of the columns go low
delay_ms(debounce_delay); // provide debounce
temp=KEYPADport;
temp&=0xf0; // consider only columns
}
while(temp==0xf0); // if temp!=0xf0, key-press confirmed
row0=0; // induvidually ground each row to find row-number of pressed key
row1=1;
row2=1;
row3=1;
if(KEYPADport!=0xfe) // check for row0
{
character=find_clmn(0);
break;
}
row0=1;
row1=0;
row2=1;
row3=1;
if(KEYPADport!=0xfd) // check for row1
{
character=find_clmn(1); // find column
break; // stop scanning once pressed key is found
}
row0=1;
row1=1;
row2=0;
row3=1;
if(KEYPADport!=0xfb) // check for row2
{
character=find_clmn(2);
break;
}
row0=1;
row1=1;
row2=1;
row3=0;
if(KEYPADport!=0xf7) // check for row3
{
character=find_clmn(3);
break;
}
}
return character;
}
void main()
{
lcd4_initialize();
KEYPADport=0xff;
while(1)
{
unsigned char keyscan_digit;
keyscan_digit=key_scan();
lcd_datw(keyscan_digit);
}
}
|
| Topic | Author | Date |
| Key scanning in C51 | 01/01/70 00:00 | |
| Post delay.h, 4bit:_lcd.h, | 01/01/70 00:00 | |
| "delay.h" & "4bit_lcd.h" | 01/01/70 00:00 | |
Header files | 01/01/70 00:00 |



