矩阵键盘通用模块

  • 格式:docx
  • 大小:13.96 KB
  • 文档页数:3

下载文档原格式

  / 7
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

通用模块

#ifndef _KEY_H_

#define _KEY_H_

#include

//#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

//---------------------------------------------------

#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

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' }