前面介绍的基本都是IO口作为输出口的实验,这里介绍一个输入的实验,实现矩阵键盘扫描.详细介绍见附件.
平台:FDR51开发板
#include<AT89X52.H>
#include"led.h" //该头文件包含数码管驱动动
/******************************************************
按键扫描函数
若有按键按下:返回 键值(1-16);
若没按键按下:返回 255
********************************************************/
unsigned char getch ( )
{
unsigned char X="0",
Y=0,
Z=0,
k=255;
P2=0xff;
P2=0x0f; //先对P2置数 行扫描
if(P2!=0x0f) //判断是否有键按下
{
//延时,软件去干扰
if(P2!=0x0f) //确认按键按下X = P2;
{
X=P2; //保存行扫描时有键按下时状态
P2=0xf0; //列扫描
Y=P2; //保存列扫描时有键按下时状态
Z=X|Y; //取出键值
switch ( Z ) //判断键值(那一个键按下)
{
case 0xee: k="0"; break; //对键值赋值
case 0xde: k="1"; break;
case 0xbe: k="2"; break;
case 0x7e: k="3"; break;
case 0xed: k="4"; break;
case 0xdd: k="6"; break;
case 0xbd: k="7"; break;
case 0x7d: k="8"; break;
case 0xeb: k="9"; break;
case 0xdb: k="7"; break;
case 0xbb: k="10";break;
case 0x7b: k="11";break;
case 0xe7: k="12";break;
case 0xd7: k="13";break;
case 0xb7: k="14";break;
case 0x77: k="15";break;
}
while(P2!=0xf0);
}
}
return k;
}
void main()
{
unsigned char temp="0",key=255;
while(1)
{
key=getch(); //扫描
if(key!=255)temp=key; //有按键按下
led_display(temp); //显示按键值
}
}
文章评论(0条评论)
登录后参与讨论