求一段51单片机子程序,单片机可以得到矩阵键盘输入的2位数用于后续操作,不用于显示

只得到数就行,用c写。键盘接P2口
2025-05-20 14:21:12
推荐回答(1个)
回答1:

/************************************************/

// 说明 : 头文件,包含按键扫描程序
/************************************************/

#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 { for(j=0; j<120; j++); }
}

///////////////////////////////////////////////////////////
// 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);

}