您的位置:首页 > 其它

键盘扫描程序及体会

2014-01-02 14:20 288 查看
因为键盘扫描程序是一个经常会用的程序,所以我就将其编成了一个头文件需要用的时候直接调用就行了,在这个头文件的程序中我没有用到全局变量,这是因为在使用头文件时我发现头文件的程序要是使用全局变量的话给人感觉参数的调用比较混乱,最好还是只用局部变量和返回值,这样在调用子程序时不用考虑子程序内部的参数。#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define pout P3
uchar key_scan(void); //键盘函数定义段;
void delay(uchar t);

void delay(uchar t) //延时子程序
{
uchar k;
while(t--)
{
for(k=0; k<125; k++)
{ }
}
}
uchar key_scan(void) //键盘扫描
{ uchar sccode,recode,i,ta,rr,k,kb;
pout=0xf0;

kb=0xff;

//如果不赋给kb一个在下面键盘译码值之外的值,在没有按键按下时,程序也会不停的返回0
if((pout&0xf0)!=0xf0)
{
delay(10);
if((pout&0xf0) !=0xf0)
{
sccode=0xfe;
for(i=0;i<4;i++)
{
pout=sccode;
if((pout&0xf0) !=0xf0)
{
recode=(pout&0xf0)|0x0f;
k=(~recode)+(~sccode);
rr=pout;
do {ta=pout;}while(ta==rr); //判断按键是否松开
switch(k) //扫描结果译码为相应4*4键盘按键的数字值
{ case 0x11:kb=0x00;break;
case 0x21:kb=0x01;break;
case 0x41:kb=0x02;break;
case 0x81:kb=0x03;break;
case 0x12:kb=0x04;break;
case 0x22:kb=0x05;break;
case 0x42:kb=0x06;break;
case 0x82:kb=0x07;break;
case 0x14:kb=0x08;break;
case 0x24:kb=0x09;break;
case 0x44:kb=0x0a;break;
case 0x84:kb=0x0b;break;
case 0x18:kb=0x0c;break;
case 0x28:kb=0x0d;break;
case 0x48:kb=0x0e;break;
case 0x88:kb=0x0f;break;
default :kb=0x00;break;
}
}
else
sccode=(sccode<<1)|0x01; 若扫描没有结果,则扫描下一行
}
}

}
return kb;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: