|
/*頭文件*/
#include<stdio.h>
#include<at89x52.h>
///////////////////////////////////////////////////////////////////////////
// /*全局符號定義*/ //
#define DRV_NUM 4 //行線數(shù),驅(qū)動線<8
#define SCN_NUM 6 //列線數(shù),掃描線<8
#define TRUE 1
#define FALSE 0
#define HIGH 1
#define LOW 0
#define DELAY_VALUE 3 //定義延時值
#define DRVKEY P2
#define SCNKEY P1
unsigned char DrvKey; //驅(qū)動線值
unsigned char ScnKey; //掃描線值
/*******************************************************************************
* 函數(shù)原型:bit KeyScan(void);
* 功 能:鍵盤掃描子程序,判斷是否有鍵按下。
*******************************************************************************/
bit KeyScan(void)
{
DRVKEY = 0xf0;
ScnKey = SCNKEY ^ 0xff; //列線值取反,以便判斷
ScnKey &= 0x3f;
if (ScnKey != 0) //列線值不全為0,則有鍵按下
{
return TRUE;
}
else //否則,無鍵按下
{
return FALSE;
}
}
/*******************************************************************************
* 函數(shù)原型:void Delay(unsigned char i);
* 功 能:延時子程序,用于去抖。
*******************************************************************************/
void Delay(unsigned char i)
{
int j = 0;
int k = 0;
k = i * i;
while (j < k)
{
j++;
}
}
/*******************************************************************************
* 函數(shù)原型:bit AvoidWobble(void);
* 功 能:去抖子程序,用于消除抖動,判斷是否真有鍵按下。
*******************************************************************************/
bit AvoidWobble(void)
{
Delay(DELAY_VALUE); //延時再讀
if (KeyScan()) //仍有鍵按下,返回1
{
return TRUE;
}
else //無鍵按下則為抖動
{
return FALSE;
}
}
/*******************************************************************************
* 函數(shù)原型:unsigned char GetKeyValue(void);
* 功 能:鍵盤子程序。最大8*8鍵盤。
*******************************************************************************/
unsigned char GetKeyValue(void)
{
unsigned char i;
unsigned char j;
unsigned char Key_Value = 0;
unsigned char temp = 0x01;
if (KeyScan()) //有鍵按下取其值
{
if (AvoidWobble()) //確實有鍵按下,取其值
{
for (i = 0;i < DRV_NUM;i++) //行線移位送0
{
DRVKEY = (temp << i) ^ 0xff;
for (j =0;j < SCN_NUM;j++) //列線移位掃描
{
ScnKey = SCNKEY; //讀列線值
ScnKey >>= j;
ScnKey &= 0x01;
if (ScnKey == 0) //判斷第j位是否為0
{
Key_Value += j; //計算健值
while(KeyScan()) //等待按鍵松開
{
;
}
return Key_Value;
}
}
Key_Value += SCN_NUM; //第i行無按鍵按下,鍵值加列線值,掃描第i+1行
}
return 255;
}
else
{
return 255;
}
}
else
{
return 255;
}
}
這個程序沒問題,你改一下行線和列線的定義就行了。 |
|