我们在学习单片机的时候会学到矩阵按键,一般的学习板的矩阵按键都是4*4的,这样就是一个并口,驱动起来容易,但是在实际应用中我们经常用到3*3,3*4,5*4等矩阵按键。
下面我介绍一种非并口矩阵按键的驱动方法;看下面函数
//名称;矩阵按键扫描程序(4*3矩阵)
//返回值;按键值(即矩阵中的第几个数)
unsigned char KEY_MatrixScan()
{
unsigned char key_num;
COLUMN1=0; //第一列置低
COLUMN2=1; //第二列置高
COLUMN3=1; //第三列置高
if((ROW1==0)||(ROW2==0)||(ROW3==0)||(ROW4==0)) //若第一列有按键按下
{
Delay10ms(); //消抖
if((ROW1==0)||(ROW2==0)||(ROW3==0)||(ROW4==0)) //第一列真的有按键按下
{
if(ROW1==0) //若是第一列第一行的按键按下
{
key_num=1; //给按键值赋1
}
if(ROW2==0) //若是第一列第二行的按键按下
{
key_num=4; //给按键值赋4
}
if(ROW3==0) //若是第一列第三行的按键按下
{
key_num=7; //给按键值赋7
}
if(ROW4==0) //若是第一列第四行的按键按下
{
key_num=10; //给按键值赋10
}
while(!((ROW1==0)||(ROW2==0)||(ROW3==0)||(ROW4==0)));
}
}
COLUMN1=1; //第一列置高
COLUMN2=0; //第二列置低
COLUMN3=1; //第三列置高
if((ROW1==0)||(ROW2==0)||(ROW3==0)||(ROW4==0))
{
Delay10ms();
if((ROW1==0)||(ROW2==0)||(ROW3==0)||(ROW4==0))
{
if(ROW1==0)
{
key_num=2;
}
if(ROW2==0)
{
key_num=5;
}
if(ROW3==0)
{
key_num=8;
}
if(ROW4==0)
{
key_num=11;
}
while(!((ROW1==0)||(ROW2==0)||(ROW3==0)||(ROW4==0)));
}
}
COLUMN1=1;
COLUMN2=1;
COLUMN3=0;
if((ROW1==0)||(ROW2==0)||(ROW3==0)||(ROW4==0))
{
Delay10ms();
if((ROW1==0)||(ROW2==0)||(ROW3==0)||(ROW4==0))
{
if(ROW1==0)
{
key_num=3;
}
if(ROW2==0)
{
key_num=6;
}
if(ROW3==0)
{
key_num=9;
}
if(ROW4==0)
{
key_num=12;
}
while(!((ROW1==0)||(ROW2==0)||(ROW3==0)||(ROW4==0)));
}
}
return(key_num); //反回按键值
}
设计要点:使能一个行或列时(即拉低行或列,供列或行检测),要把其余的行或列除能;
感兴趣的朋友可以去试一下,有什么问题也欢迎讨论.
|