矩阵键盘通用模块
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通用模块
#ifndef _KEY_H_
#define _KEY_H_
#include<reg52.h>
//#include "public.h" 为了让模块变的跟独立这个也不需要
//#define uchar unsigned char 外部不需要调用,放在函数内部就可以
#define KEY_BUS P2 //这个根据开发板来变;加一个分号导致整个程序错误
extern unsigned char key_scan(void); //返回一个无符号字符型变量(0~15),无按键按下返回一个'E'
#endif
/*********************************************************
** 函数功能:** 键盘扫描函数**
** 带入参数:** 无**
** 带出参数:** 返回键1-15 若无返回'E' **
** 其他备注:** 4*4矩阵键盘**
** 作者:** 江锟**
** 更新时间:** 2017.12.14 **
*********************************************************/
#include "key.h"
#include<intrins.h>
//---------------------------------------------------
#define uchar unsigned char
#define uint unsigned int
//---------------------------------------------------
/*********************************************************
** 函数功能:** 软件延时函数0~65536ms **
** 带入参数:** u nsigned int **
** 带出参数:** 无**
** 其他备注:** 延时0~unsigned int(带入参数)ms **
** 作者:** 江锟**
** 时间:** 2015.12.14 **
*********************************************************/
void delay_ms(unsigned int z)
{
int x,y;
for(x=0;x<z;x++)
for(y=0;y<113;y++);
}
unsigned char key_scan(void)
{
uchar i,k,key;
//uint c;
k='E';
KEY_BUS=0x0f;
if(KEY_BUS!=0x0f)// 这就算是进来了
delay_ms(5);
if(KEY_BUS!=0x0f)// 抖动检测
{
KEY_BUS=0xef;
for(i=0;i<4;i++)//四次扫描
{
key=KEY_BUS&0x0f;//屏蔽掉低4位只保留检测回来的位
switch(key)
{
case 0x0e: k=i;break;//能记录0-3
case 0x0d: k=i+4;break;//能记录4-7
case 0x0b: k=i+8;break;//能记录8-11
case 0x07: k=i+12;break;//能记录12-15
default: ; break;
}
KEY_BUS=(KEY_BUS<<1)+1;//把P1口的0的位向左移动
//_crol_(KEY_BUS,1); 可以用这个代替
if(k!='E')break;//检测到按键后退出for循环
}
KEY_BUS=0xf0;
//for(c=0;(c>200)||(P2!=0xf0);c++);
// delay_ms(10);
//for(c=0;(c>200)||(P2!=0xf0);c++); //这样写可以让单片机检测200次,不至于是一个死循环,有些时候用的到
//if(P2==0xf0)
//{
// return k;
//}
// else return 20;//有按键按下但没松手,这种情况也可以定义笔记特殊
while(P2!=0xf0);
delay_ms(40);
while(P2!=0xf0);// 一直不松手会进入一个死循环,这样做不好,只要他延时一段时间就好
return k;
}
else return 'E';//没有键按下返回'E' }。