/************************************************/
// 说明 : 头文件,包含按键扫描程序
/************************************************/
#define uchar unsigned char
#define uint unsigned int
#include
#define PDATA P1
uchar m,n;
uchar counter;
uchar flag=0;
uchar mm[4][4]={{0,4,8,12}, // 编码对应的按键值
{1,5,9,13},
{2,6,10,14},
{3,7,11,15}
};
///////////////////////////////////////////////////////////
// Name : 延时函数
// In :
// Out :
// Function : 用于延时一定时间
// Explain : 用12M晶振时,大概延时1ms,
///////////////////////////////////////////////////////////
void delay_1ms(uint z)
{
uint i,j;
for(i=0; i
}
///////////////////////////////////////////////////////////
// Name : 按键扫描函数
// In :
// Out :
// Function :
// Explain :
///////////////////////////////////////////////////////////
uchar key_scan(void)
{
uchar key;
flag = 0;
PDATA = 0xf0; // 先使高四位输出高,低四位输出低
_nop_(); // 直接引用汇编
key = PDATA & 0xf0; // 读高四位
if(key != 0xf0)
{
delay_1ms(30); // 延时30ms,跳过抖动
key = PDATA & 0xf0; // 读入高四位
if(key != 0xf0)
{
key = PDATA & 0xf0;
switch(key) // 根据读入值判断位置
{
case 0xe0: m=0; break;
case 0xd0: m=1; break;
case 0xb0: m=2; break;
case 0x70: m=3; break;
default: break;
}
PDATA = 0x0f; // 换成高四位输出低,低四位输出高
_nop_();
key = PDATA & 0x0f; // 读低四位
if(key != 0x0f)
{
delay_1ms(30);
key = PDATA & 0x0f;
if(key != 0x0f)
{
key = PDATA & 0x0f;
switch(key)
{
case 0x0e: n=0; break;
case 0x0d: n=1; break;
case 0x0b: n=2; break;
case 0x07: n=3; break;
default: break;
}
while(key != 0x0f) // 等待按键抬起
{
key = PDATA & 0x0f;
}
flag = 1; // 置有按键按下标志
}
}
}
}
if(flag==1)
{ counter = mm[m][n];} // 当有按键按下后,将编码转成真实的按键值
return(counter);
}