矩阵键盘
它用8个IO口实现了16个按键的扫描检测,实现了IO口更充分的利用。
unsigned char code keycode[]={
0xee,0xde,0xbe,0x7e,
0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,
0xe7,0xd7,0xb7,0x77
}; //矩阵键盘编码
根据按键返回相应的值
方法一
unsigned char keyscan1()//4*4矩阵按键扫描函数:(要去抖)扫描哪个键被按下。若有按键按下,返回对应的按键值(0-15),否则返回16
{ unsigned char i=16,hang,temp;//初值设置为16,目的是:没有按键按下时返回16;若不设初值(默认值为0),没有按键按下时,将返回0,会显示0,误认为0被按下
P3=0x0f;//列输出全0,行输出全1
temp=P3;//读行列输入
if(temp!=0x0f) //若无按键按下,输入仍为0x0f;若有按键按下对应行输入变为0,其他不变
{ delay(10);//去抖
temp=P3;//再次读行列输入
if(temp!=0x0f)
//根据temp的值可知哪一行有按键按下,然后送对应的行扫描信号
//若第一行有按键按下temp=00001110,第一行行扫描信号hang=11111110
//若第二行有按键按下temp=00001101,第一行行扫描信号hang=11111101
//若第三行有按键按下temp=00001011,第一行行扫描信号hang=11111011
//若第四行有按键按下temp=00000111,第一行行扫描信号hang=11110111
{ hang=temp^0xf0;
P3=hang;//输出行扫描信号
temp=P3;//读行列输入
for(i=0;i<16;i++)
if(temp==keycode[i]) break;
P3=0x0f;//等待按键释放
while((temp=P3)!=0x0f);
}
}
return(i);
}
方法二
unsigned char keyscan2()//4*4矩阵按键扫描函数:(要去抖)扫描哪个键被按下。若有按键按下,返回对应的按键值(0-15),否则返回16
{ unsigned char i=16,j,hang,lie,temp;//初值设置为16,目的是:没有按键按下时返回16;若不设初值(默认值为0),没有按键按下时,将返回0,会显示0,误认为0被按下
P3=0x0f;//列输出全0,行输出全1
temp=P3;//读行列输入
if(temp!=0x0f) //若无按键按下,输入仍为0x0f;若有按键按下对应行输入变为0,其他不变
{ delay(10);//去抖
temp=P3;//再次读行列输入
if(temp!=0x0f)//有键按下
//进行行列扫描
{ for(i=0,hang=0xfe;i<=3;i++,hang=_crol_(hang,1))
{ P3=hang;//输出行扫描信号hang,依次为:111111110、11111101、11111011、11110111
temp=P3;//读行列输入
for(j=0,lie=0x10;j<=3;j++,lie=lie<<1)//列扫描:扫描第i行第j列是否被按下
if(temp==(hang^lie)) break; //hang^lie(00010000、00100000、01000000、10000000)依次将行扫描信号对应的各列信号取反,比对是否为该列有按键按下
if(j<4) break;//若找到,结束扫描,否则继续扫描下一行
}
P3=0x0f;//检测按键是否释放
while((temp=P3)!=0x0f);
}
}
if(i<4) return(4*i+j);//找到
else return(16);//没找到
}