单片机 矩阵键盘扫描 C语言

//矩阵键盘扫描
void Keys_Scan()
{
	uchar Tmp;
	P1=0x0f;	//高4位置0,放入4行
	DelayMS(1);
	Tmp=P1^0x0f;//按键后0f变成0000XXXX,X中一个为0,3个仍为1,通过异或把3个1变为0,唯一的0变为1
	switch(Tmp)	//判断按键发生于0~3列的哪一列
	{
		case 1:	KeyNo=0;break;
		case 2:	KeyNo=1;break;
		case 4: KeyNo=2;break;
		case 8:	KeyNo=3;break;
		default:KeyNo=16;	//无键按下	
	}
	P1=0xf0;   //低4位置0,放入4列
	DelayMS(1);
	Tmp=P1>>4^0x0f;//按键后f0变成XXXX0000,X中有1个为0,三个仍为1;高4位转移到低4位并异或得到改变的值
	switch(Tmp)	//对0~3行分别附加起始值0,4,8,12
	{
		case 1:	KeyNo+=0;break;
		case 2:	KeyNo+=4;break;
		case 4:	KeyNo+=8;break;
		case 8:	KeyNo+=12;
	}
}