📄 key.c
字号:
/*****************************************************************************
* 文件名: Key.c
* Copyright (c) 2008 *********武汉理工大学信息工程学院电信系
* 创建人: 王康
* 日 期: 2008.8.13
* 修改人: 王康
* 日 期:
* 描 述: 本文件定义了供调用的用户外部函数,是关于板上5个按键的驱动程序,函数名
* 均以Key开头.
* 接 口: K1 K1--P1.4 K2--P5.7
* K2 K5 K4 K3--P8.6 K4--P5.5
* K3 K5--P5.4
* 版 本: IAR V4.11
******************************************************************************/
//头文件
#include "config.h"
/*****************************************************************************
* 函数名: Key_Init
* 输 入: 无
* 输 出: 无
* 功能描述: 本函数为键盘初始化子函数
* 全局变量: 无
* 调用模块: 无
* 作 者: 王康
* 日 期: 2008.8.13
* 修 改: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************/
void Key_Init(void)
{
g_KeyPressed = 0;
g_KeyVal = 0;
g_KeyFlag = 0;
P1DIR = 0xef; //P1.4为输入,其余为输出模式
P5DIR = 0x0f; //P5.4~P5.7为输入,其余为输出模式
}
/*****************************************************************************
* 函数名: Key_Delay
* 输 入: 无
* 输 出: 无
* 功能描述: 本函数为延时子函数,主要用于按键去抖
* 全局变量: 无
* 调用模块: 无
* 作 者: 王康
* 日 期: 2008.8.13
* 修 改: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************/
void Key_Delay(void)
{
uchar t = 100;
while(t--);
}
/*****************************************************************************
* 函数名: Key_Check
* 输 入: 无
* 输 出: 无
* 功能描述: 本函数为获取键值子函数,用来检查按键,确认键值
* 全局变量: 无
* 调用模块: 无
* 作 者: 王康
* 日 期: 2008.8.13
* 修 改: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************/
void Key_Check(void)
{
uchar temp1;
uchar temp2;
temp2 = P1IN & 0x10;
temp1 = (P5IN & 0xf0) | (temp2 >> 1);
switch(temp1)
{
case 0xf0 : g_KeyVal = 1;
break;
case 0x78 : g_KeyVal = 2;
break;
case 0xb8 : g_KeyVal = 3;
break;
case 0xd8 : g_KeyVal = 4;
break;
case 0xe8 : g_KeyVal = 5;
break;
default : break;
}
}
/*****************************************************************************
* 函数名: Key_Event
* 输 入: 无
* 输 出: 无
* 功能描述: 本函数为按键查询子函数,用来检测键盘是否有键按下,若有则获取键值
* 全局变量: 无
* 调用模块: 无
* 作 者: 王康
* 日 期: 2008.8.13
* 修 改: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************/
void Key_Event(void)
{
uchar temp1;
uchar temp2;
temp2 = P1IN & 0x10; //读取P1.4的状态
//将5个按键的状态全部读入到temp1中,并且依次存放在temp1的高5位中
temp1 = (P5IN & 0xf0) | (temp2 >> 1);
if((g_KeyPressed == 0) & ((temp1 & 0xf8) < 0xf8))
{ //若g_KeyPressed为0,且有键按下
Key_Delay(); //延时去抖
if((g_KeyPressed == 0) & ((temp1 & 0xf8) < 0xf8))
{
g_KeyPressed = 1; //如果有键按下,则置位g_KeyPressed标志
Key_Check(); //调用获取键值子函数
}
}
else if((g_KeyPressed == 1) & ((temp1 & 0xf8) == 0xf8))
{
g_KeyPressed = 0; //键已释放则复位g_KeyPressed标志
g_KeyFlag = 1; //置位g_KeyFlag标志,表示可以读出已获取的键值
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -