📄 key.c
字号:
/************************************************************************************
* Copyright (c) 2004,西安铭朗电子科技有限责任公司
* All rights reserved.
*
* 文件名称: Key.C
* 文件标识: none
* 适用器件: C8051F020
*
* 摘 要: 本文件是键盘子程序;使用外部22.1184MHz晶振.
*
* 当前版本:1.1
* 作 者:刘大伟
* 完成日期:2007年3月2日
*
* 历史版本:1.0
* 作 者:卢 阳
* 完成日期:2004年11月14日
*
* 历史版本:0.9
* 原作者 : 李林利
* 完成日期:2004年1月1日
*************************************************************************************/
/************************************************************************************/
// 引用外部头文件
#include "c8051F020.h"
#include "key.h"
#include "Delay.h"
#include <INTRINS.H>
/************************************************************************************/
/************************************************************************************
// 常量及全局变量定义
*************************************************************************************/
unsigned char code Key_Value_Table[16]=
{0xff,0x00,0x01,0xff,0x02,0xff,0xff,0xff,
0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff
};
bit bKeyUp_Flag;
/************************************************************************************
* key功能子程序
*************************************************************************************/
/***********************************************************************************
* 函数名称:Key_Init;
*
* 函数功能描述:键盘初始化,将标志位置1;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Key_Init(void)
{
bKeyUp_Flag=1;//标志位置1
}
/***********************************************************************************
* 函数名称:GetScanKey;
*
* 函数功能描述:键盘扫描函数,得到键的行列位置;
*
* 输入参数:none;
*
* 返回数据:unsigned char类型数据,是按键所在行列号值 高4位是键盘IO口低4位(SELn) 低4位
* 是键盘IO口高4位(RLn) 1有效;
*
* 注意: 请参考电路图;
*
* 注释: 将键盘IO低4位(SEL)置高电平,循环逐一置低电平.检测键盘IO口高4位(RL),如有低电平
* 则判断有按键按下,跳出循环.返回相应键值。否则待循环完毕后,返回预定值oxff,
* 相关逻辑关系等请参考电路图。
************************************************************************************/
unsigned char GetScanKey(void)
{
unsigned char key, i, temp;
key=0xff;
for (i=1; i<0x10; i<<=1) //i的低4位为行数位,行依次检测 循环4次
{
Key_Scan |= 0x0f; //保留高4位(列RL),低4位置1
Key_Scan &= ~i; //取带5检测行数位
temp = Key_Scan; //取键盘IO口的值
temp = ~temp; //按键有效后为0,要求有效按键为1无效为0,取反
temp>>=4; //取高4位列数位的值并将其放入低4位
if (temp!=0x00) //是否有有效键值
{
key = i<<4; //取低4位行数位的值并将其放入返回值高4位
key|=temp; //列数位的值放入返回值低4位
break;
}
}
return key; //返回行位(高四)和列位(低四)
}
/***********************************************************************************
* 函数名称:GetKey;
*
* 函数功能描述:取键值,长按无效;
*
* 输入参数:none;
*
* 返回数据:unsigned char类型数据
*
* 注意: none;
************************************************************************************/
unsigned char GetKey(void)
{
unsigned char key, temp;
if (!bKeyUp_Flag) //判断标志,是0执行
/*按键程序执行一次后会将bKeyUp_Flag标志位清零,执行此段程序,长按键无效返回无效值
直至按键无效返回无效按键值,置"1"标志位。按键输入恢复有效*/
{
key=GetScanKey();
if (key==0xff) //没有按键,置标志位
bKeyUp_Flag=1;
else //保持按键
return 0xff;
}
key=GetScanKey();
if (key==0xff) //没有按键
return key;
else //有按键有效
temp=key; //取键值
Delay_ms(20); //延时20ms 消抖
key=GetScanKey(); //键盘扫描
if(key!=temp) //判断两次键值是否相同,排除干扰信号影响 确认有效信号
{
key=0xff;
return key;
}
else //取键值
{
temp=Key_Value_Table[key>>4];
/*行值有效位(键盘的4个行SEL返回的值含有的有效位"1")有且只有一位 键值才有效 否则返回无效键值*/
if (temp==0xff)
{
key=0xff;
return key;
}
temp=Key_Value_Table[key&0x0f];
/*列值有效位(键盘的4个列RL返回的值含有的有效位"1")有且只有一位 键值才有效 否则返回无效键值*/
if (temp==0xff)
{
key=0xff;
return key;
}
key=Key_Value_Table[key>>4]*4+Key_Value_Table[key&0x0f];
/*行列组合后的值大于15无效*/
if (key>15)
{
key=0xff;
return key;
}
bKeyUp_Flag=0;
return key;
}
}
/***********************************************************************************
* 函数名称:Alarm;
*
* 函数功能描述:蜂鸣器开关控制 0:关闭,其他:开启;
*
* 输入参数:0:关闭,其他:开启;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Alarm(unsigned char flag)
{
if(flag)
Alarm_On;
else
Alarm_Off;
}
/***********************************************************************************
* 函数名称:LED_state;
*
* 函数功能描述:LED开关控制 0:关闭,其他:开启;
*
* 输入参数:0:关闭,其他:开启;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************
void LED_state(unsigned char flag)
{
if(flag)
{
LED1 = 1;
LED2 = 1;
LED3 = 1;
}
else
{
LED1 = 0;
LED2 = 0;
LED3 = 0;
}
}
/************************************************************************************
* 文件结束
************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -