看你的程序麻烦 你可以先取得按键的值 0----F 这样如果没错的话 就说明你的矩阵键盘的程序没有问题 然后再去做键值平方的问题
给你一个4*4矩阵键盘的程序参考
/****************************************************************************
* 文件名:KeyArray.C
* 功能:有按键矩阵控制数码管显示0~F
* 硬件说明:
* 用1根8位连接线。将数码管部份的数据口 接到CPU部份的P0口
* 用1根8位连接线。将数码管部份的数据口 接到CPU部份的P2口
* 用1根8位连接线。将按键矩阵部份的数据口 接到CPU部份的P1口
****************************************************************************/
#include
#define LedBit P2_1 //选择第二个7段数码管(为0有效)
#define PortSegLed P0 //数据输出显示七段数据
#define PortKeyCtrl P1 //键盘控制端(列线P1.0-1.3)
//(行线P1.4-1.7)
#define KeyCtrlColm1 P1_4
#define KeyCtrlColm2 P1_5
#define KeyCtrlColm3 P1_6
#define KeyCtrlColm4 P1_7
unsigned char temp;
unsigned char key;
unsigned char i,j;
//定义轮流显示的键盘值,因为无法表达*# 就用H表示,B用8表示
unsigned table[]= { 0x28,0x34,0x28,0x34, //0h0h
0xa9,0x60,0x20,0x7a, //c987
0x20,0x21,0x61,0x74, //8654
0x30,0x62,0xa2,0x7e //a321
};
//***********************************************************
//函数名称:Delay1s()
//函数功能:延时k ms函数
//入口参数:k(1-128)
//出口参数:无
//***********************************************************
void Delaykms(unsigned char k)
{
unsigned char n,s;
for(n=2*k;n>0;n--)
for(s=248;s>0;s--);
}
void main(void)
{
while(1)
{
PortKeyCtrl=0xff; //矩阵按键控制端输出全1
KeyCtrlColm1=0; //选择扫描第一列
temp=PortKeyCtrl; //读按键控制端
temp=temp & 0x0f; //读取键值
if (temp!=0x0f) //如果键值不为0x0f
{
Delaykms(25); //延时25ms
temp=PortKeyCtrl; //读按键控制端
temp=temp & 0x0f; //读取键值
if (temp!=0x0f) //如果键值仍不为0x0f
{
switch(temp) //对读取的键值分配对应键码
{
case 0x0e:
key=0;
break;
case 0x0d:
key=4;
break;
case 0x0b:
key=8;
break;
case 0x07:
key=12;
break;
}
LedBit=0; //开显示位
PortSegLed=table[key]; //显示键值
temp=PortKeyCtrl; //读按键控制端
temp=temp & 0x0f; //读取键值
while(temp!=0x0f) //如果键值不为0x0f
{
temp=PortKeyCtrl; //读按键控制端
temp=temp & 0x0f; //读取键值
}
}
}
PortKeyCtrl=0xff;
KeyCtrlColm2=0;
temp=PortKeyCtrl;
temp=temp & 0x0f;
if (temp!=0x0f)
{
Delaykms(25);
temp=PortKeyCtrl;
temp=temp & 0x0f;
if (temp!=0x0f)
{
switch(temp)
{
case 0x0e:
key=1;
break;
case 0x0d:
key=5;
break;
case 0x0b:
key=9;
break;
case 0x07:
key=13;
break;
}
LedBit=0;
PortSegLed=table[key];
temp=PortKeyCtrl;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=PortKeyCtrl;
temp=temp & 0x0f;
}
}
}
PortKeyCtrl=0xff;
KeyCtrlColm3=0;
temp=PortKeyCtrl;
temp=temp & 0x0f;
if (temp!=0x0f)
{
Delaykms(25);
temp=PortKeyCtrl;
temp=temp & 0x0f;
if (temp!=0x0f)
{
switch(temp)
{
case 0x0e:
key=2;
break;
case 0x0d:
key=6;
break;
case 0x0b:
key=10;
break;
case 0x07:
key=14;
break;
}
LedBit=0; //开显示位
PortSegLed=table[key]; //显示键值
temp=PortKeyCtrl;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=PortKeyCtrl;
temp=temp & 0x0f;
}
}
}
PortKeyCtrl=0xff;
KeyCtrlColm4=0;
temp=PortKeyCtrl;
temp=temp & 0x0f;
if (temp!=0x0f)
{
Delaykms(25);
temp=PortKeyCtrl;
temp=temp & 0x0f;
if (temp!=0x0f)
{
switch(temp)
{
case 0x0e:
key=3;
break;
case 0x0d:
key=7;
break;
case 0x0b:
key=11;
break;
case 0x07:
key=15;
break;
}
LedBit=0; //开显示位
PortSegLed=table[key]; //显示键值
temp=PortKeyCtrl;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=PortKeyCtrl;
temp=temp & 0x0f;
}
}
}
}
}