📄 key.c
字号:
#define __KEY_H__
#include "Config.h"
#define KEYPORT P6 //定义端口
#define KEYPORTPINCFG P6PINCFG //定义端口
#define KEYMASK 0x0F //按键的屏蔽码,屏蔽掉高位的LED,定义成宏方便使用.
/********************************************************************************************************
**函数名称:KeyDelay
**函数功能:用于按键的延时去抖
**输 入:uchar DelayLoops 延时循环次数,控制延时时间
**输 出:无
********************************************************************************************************/
void KeyDelay(uchar DelayLoops)
{
uint i;
for(; DelayLoops > 0; DelayLoops --)
{
for(i = 5000; i > 0; i --)
{;}
}
}
/****************************************************************************************************
**函数名称:KeyRead
**函数功能:读按键程序
**输 入:无
**输 出:返回读到的键值
**全局变量:uchar code KeyDecode[4]->用于按键解码
** GlKeyFlag 保存上次的键值
****************************************************************************************************/
uchar code KeyDecode[4] = {0x0E,0x0D,0x0B,0x07}; //按下不同键对应的代码
uchar GlKeyFlag = KEYMASK; //纪录上一次按键的全局变量
uchar KeyRead(void)
{
uchar KeyBuf,KeyBuf1,i;
PORTINEN |= (BIT0 | BIT1 | BIT2 | BIT3); //使能按键输入
//KEYPORTPINCFG |= 0x0F; //设置低四位为输入
//------------------------------------------------------------------------------
//判定本次有无按键按下
//------------------------------------------------------------------------------
KeyBuf = KEYPORT;
KeyBuf &= KEYMASK; //屏蔽无关位
if(KeyBuf1 != KEYMASK) //有键按下
{
KeyDelay(1); //延时去抖
KeyBuf1 = KEYPORT;
KeyBuf1 &= KEYMASK; //再读
if((KeyBuf1 != KEYMASK) && (KeyBuf1 == KeyBuf))
//延时后还是有按键中断且与第一次的相同说明有键按下
{;} //有键按下,则键值被保存,随后再判断
else
{
KeyBuf = KEYMASK;
KeyBuf1 = KEYMASK; //无键按下,将所有标志清零
}
}
//------------------------------------------------------------------------------
//根据本次读到的键值和全局变量保存的值判定有无键按下
//------------------------------------------------------------------------------
if(KeyBuf == KEYMASK) //本次无键按下,清全局标志
{
if(GlKeyFlag != KEYMASK) //如果全局变量保存的是有键状态,则将其清除
{
GlKeyFlag = KEYMASK; //保存无键状态
}
}
else //如果检测到有键按下
{
if(GlKeyFlag == KEYMASK) //如果上次没有键按下则判定这次按键有效
{
GlKeyFlag = KeyBuf; //将这次的键值保存到全局变量
}
else //这次的键值与上次的键值一样或为其他键值,说明健还未松手,判定无键
{
KeyBuf = KEYMASK; //判定无键
}
}
//------------------------------------------------------------------------------
//返回结果
//------------------------------------------------------------------------------
if(KeyBuf != KEYMASK) //如果有键按下
{
for(i = 0; i < 4; i ++) //通过读到的代码查找按键
{
if(KeyBuf == KeyDecode[i])
{
return (i + 1 + 0x30); //返回按键对应的ASIIC '1','2','3','4'
}
}
}
return 0; //如果没有键按下或是没有找到对应的键值,则返回0,否则返回对应的字符
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -