键盘扫描程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define IO P2
uchar code wu[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //位选择数据uchar code du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0到9的断模/******************************************
函数名称:delayms;
函数功能:延时z毫秒;
形参:z (延时时间参数)
*******************************************/
void delayms(uchar z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/******************************************
函数名称:display();
函数功能:数码管显示子函数
形参:d1 (选择第几位数码管)
d2(数码管显示的数字)
*******************************************/
void display(uchar d1,uchar d2)
{
P1=wu[d1]; //位选
P0=du[d2]; // 段选
delayms(1);
P0=0xff;
P1=0xff; // 关显示
}
/******************************************
函数名称:display();
函数功能:4*4矩阵键盘扫描子程序,16个键编号0到15,有键
按下时返回按键编号(小于16),没键按下时返回
16.
形参:d1 (选择第几位数码管)
d2(数码管显示的数字)
*******************************************/
uchar saom(void)
{
uchar num,temp;
num=17; //设定没键按下时返回17
IO=0x7f; //扫描第一行
temp=IO;
temp&=0x0f;
if(temp!=0x0f)
{
delayms(1);
temp=IO;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=IO;
switch(temp)
{
case 0x77:num=1;break;
case 0x7b:num=2;break;
case 0x7d:num=3;break;
case 0x7e:num=4;break;
}
temp&=0x0f;
while(temp!=0x0f) //松手检测
{
temp=IO;
temp&=0x0f;
}
}
}
IO=0xbf; //扫描第二行
temp=IO;
temp&=0x0f;
if(temp!=0x0f)
{
delayms(1);
temp=IO;
temp&=0x0f;
if(temp!=0x0f)
{
temp=IO;
switch(temp)
{
case 0xb7:num=5;break;
case 0xbb:num=6;break;
case 0xbd:num=7;break;
case 0xbe:num=8;break;
}
temp&=0x0f;
while(temp!=0x0f)
{
temp=IO;
temp&=0x0f;
}
}
}
IO=0xdf; //扫描第三行temp=IO;
temp&=0x0f;
if(temp!=0x0f)
{
delayms(1);
temp=IO;
temp&=0x0f;
if(temp!=0x0f)
{
temp=IO;
switch(temp)
{
case 0xd7:num=9;break;
case 0xdb:num=10;break;
case 0xdd:num=11;break;
case 0xde:num=12;break;
}
temp&=0x0f;
while(temp!=0x0f)
{
temp=IO;
temp&=0x0f;
}
}
}
IO=0xef; //扫描第四行temp=IO;
temp&=0x0f;
if(temp!=0x0f)
{
delayms(1);
temp=IO;
temp&=0x0f;
if(temp!=0x0f)
{
temp=IO;
switch(temp)
{
case 0xe7:num=13;break;
case 0xeb:num=14;break;
case 0xed:num=15;break;
case 0xee:num=16;break;
}
temp&=0x0f;
while(temp!=0x0f)
{
temp=IO;
temp&=0x0f;
}
}
}
return num; //返回键值
}
void main(void)
{
uchar num_key1,num_key2;
while(1)
{
num_key1=saom(); //读按键值
if(num_key1<17) //是否有按键按下,小于16时有按键按下
{
num_key2=num_key1;
} //确实有键按下时值赋给num_key2
display(0,num_key2%10); //显示按键编码的个位
display(1,num_key2/10); //显示按键编码的十位
}
}。