你说的是矩阵键盘吧,每一个按键与两个IO口相连。假设将行全部置为低电平,则检测列有没有低电平,有则为按键按下。这个可以根据你自身的需要来改变,就把他看做是坐标即可,在之下这个网址有矩阵键盘的一些判别方法,我写的不是很详细,自己多看看百科,应该能找到你想要的
http://baike.baidu.com/view/2492072.htm
另外我给你贴一个4*3键盘扫描程序
/*************************************************************/
/* */
/* 键扫描子程序 (4*3 的矩阵) P1.4 P1.5 P1.6 P1.7为行 */
/* P1.1 P1.2 P1.3为列 */
/* */
/*************************************************************/
void keyscan(void)
{ temp = 0;
P1=0xF0; //高四位输入 行为高电平 列为低电平
delay(1);
temp=P1; //读P1口
temp=temp&0xF0; //屏蔽低四位
temp=~((temp>>4)|0xF0);
if(temp==1) // p1.4 被拉低
key=0;
else if(temp==2) // p1.5 被拉低
key=1;
else if(temp==4) // p1.6 被拉低
key=2;
else if(temp==8) // p1.7 被拉低
key=3;
else
key=16;
P1=0x0F; //低四位输入 列为高电平 行为低电平
delay(1);
temp=P1; //读P1口
temp=temp&0x0F;
temp=~(temp|0xF0);
if(temp==2) // p1.1 被拉低
key=key+0;
else if(temp==4) // p1.2 被拉低
key=key+4;
else if(temp==8) // p1.3 被拉低
key=key+8;
else
key=16;
dis_buf = key; //键值入显示缓存
dis_buf = dis_buf & 0x0f;
if(dis_buf>9) //转换为ASCII码
dis_buf = dis_buf+0x37;
else
dis_buf = dis_buf+0x30;
}
/*************************************************************/
/* */
/*判断键是否按下 */
/* */
/*************************************************************/
void keydown(void)
{
P1=0xF0;
if(P1!=0xF0) //判断按键是否按下 如果按钮按下 会拉低P1其中的一个端口
{
keyscan();
}
}
可追问
回答起来挺复杂,建议看下书,提出针对性强点的问题。