- 2
- 0
- 约1.76千字
- 约 5页
- 2019-06-25 发布于河北
- 举报
51单片机4×4矩阵按键扫描方法
/*****4×4按键扫描******/
/*** 编程要点
1.首先检测是否有按键按下
2.若有按键按下,即进行行检测,列检测
3.行检测:高4位设为0,低4位为1,进行检测 0x0f
4.列检测:低4位设为0,高4位为1,进行检测 0xf0
5.检测按键是否松开
6.送至LED显示,前四个代表第几行
后四个代表第几列
P0 为 led灯口
P2 为 按键接口
****///
#includereg51.h
#define uchar unsigned char
#define key P2 //P2口定义,便于调用
#define led P0 //P0口定义,便于调用
unsigned char line_num,row_num;//行列定义
led_arry[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数组定义,便于显示
//******检测是否有按键按下*****//
uchar Check_Button()
{
key=0x0f; //高四位为0
if(key==0x0f) //若无变化,证明无按键按下
return 0; //返回0
else //否则
return 1; //返回1
}
//********行检测********//
uchar Line[]={0x0e,0x0d,0x0b,0x07}; //那个按键按下,检测出的状态则对应数组中的第几个数
void Check_Line()
{
uchar i;
key=0x0f; //高四位为0
for(i=0;i4;i++)
{
if(key==Line[i])
{
line_num=i; //取出检测值
break; //结束行检测
}
}
}
//********列检测*********//
uchar Row[]={0xe0,0xd0,0xb0,0x70};//那个按键按下,检测出的状态则对应数组中的第几个数
void Check_Row()
{
uchar j;
key=0xf0; //低4位置0
for(j=0;j4;j++)
{
if(key==Row[j])
{
row_num=j; //取出检测值
break; //结束行检测
}
}
}
/*******按键松开检测*********/
uchar Check_Release()
{
key=0xf0; //低四位为0
if(key==0xf0) //若无变化,证明按键松开
return 0; //返回0
else //否则,按键未松开
return 1; //返回1
}
//*********主函数*********//
int main()
{
key=0xff; //按键初始化
led=0xff; //关闭LED灯
while(1)
{
while(!Check_Button()); //若无按键按下,则等待,若有继续下一步
Check_Line(); //行检测
Check_Row(); //列检测
while(Check_Release()); //检测按键是否松开
led=led_arry[line_num]led_arry[row_num+4];
//送至led显示
/*
eg:如果是第三行第二列按键按下
则第3个、第6(2列+4)个LED灯亮
如下图所示(Proteus仿真电路图)
*/
}
}
原创力文档

文档评论(0)