📄 key.c
字号:
//========================================================================
// 文件名: Key.c
// 作 者: xinqiang Zhang(小丑) (email: xinqiang@Mzdesign.com.cn)
// 日 期: 2007/07/26
// 描 述: MzLH01-12864 LCD显示模块驱动V1.0版
// 基本功能接口函数集
//
// 参 考: 无
// 版 本:
// 2007/07/26 First version Mz Design
//========================================================================
#include ".\Driver\Key_Service\Key_config.h"
unsigned int Key_Sample1=0; //当前对按键采样的值
unsigned int Key_Sample2=0; //上一次对按键采样的值
unsigned int Key_Scan_old=0; //上一次有效的键值状态
//(必需连续两次的采样值相同时才能载入该变量中)
unsigned char Key_Down_flag=0; //键盘按下标识,注意是经过消抖后确认的按下标识
unsigned char Key_Down_Counter=0; //用于消抖
unsigned int Key_Value=0; //最终经过确认的键值
unsigned int Key_Data=0;
unsigned char Key_flag=0;
unsigned char Key_flag_long=0; //长时按键标识~
unsigned char Key_Down_Counter_l=0; //长时按键计数器
unsigned char Key_Release_flag=0; //在有些按键中防止长按键时重复响应用的
void Key_Initial(void)
{
/* *Port_Key_Dir &= ~KEY_MASK;
*Port_Key_Attrib &= ~KEY_MASK;
*Port_Key_Buffer &= ~KEY_MASK; */
Port_Key_Data = KEY_MASK;
}
void KeyScan_Service(void)
{
Port_Key_Data = KEY_MASK;
Key_Sample1 = Port_Key_Data&KEY_MASK;
Key_Sample1 = Key_Sample1^KEY_MASK;
if(Key_Sample1==Key_Sample2)
{ //连续两次扫描的键值相同,有效,则处理
if(Key_Sample1) //是否有键按下?如有则处理
{
if(Key_Down_flag==0) //如果键值还没有被消抖确认,则确认是否与之前的键值一至
{
if(Key_Sample1==Key_Scan_old)
{
Key_Down_Counter++;
if(Key_Down_Counter>=KEY_DOWN_COUNTER_S)
{
Key_Down_Counter = 0;
Key_Down_Counter_l=KEY_DOWN_COUNTER_S;
Key_Down_flag = 1;
Key_Value = Key_Sample1; //将确认的键值载入缓存器中,供键抬起后处理用
}
}
else
{
Key_Down_Counter = 0; //重新计数,即重新消抖
Key_flag_long=0;
}
}
else //如已经过消抖,则判断是否有组合键按下?如无则直接退出处理
{
Key_Down_Counter_l++;//
if(Key_Down_Counter_l>=KEY_DOWN_COUNTER_L)
{
Key_flag_long=1;
Key_Down_Counter_l=KEY_DOWN_COUNTER_L-KEY_DOWN_COUNTER_M;
}
}
}
else //否则就处理之前是否有键是经过确认的
{ //如果已经有键按下,并确认消抖后则处理键值
if(Key_Down_flag==1)
{
Key_Down_flag = 0;//
Key_Data = Key_Value;
Key_flag = 1;
Key_Down_Counter = 0;
Key_flag_long=0;
}
if(Key_Release_flag==1)
{
Key_Release_flag=0;
Key_flag = 0;
}
}
Key_Scan_old = Key_Sample1; //保存这次的有效键值
}
Key_Sample2 = Key_Sample1; //保存当次的值
}
unsigned char Key_Get(void)
{
unsigned char KK=0;
if(Key_Release_flag==1) return KK;
if(Key_flag_long==1)
{
Key_flag_long=0;
switch(Key_Value)
{
/* case 0x0001: KK = 1;break;
case 0x0002: KK = 2;break;
case 0x0004: KK = 3;break;
case 0x0008: KK = 4;break;
case 0x0020: KK = 5;break;
case 0x0040: KK = 6;break;
case 0x0024: KK = 12;Key_Release_flag = 1; break;
case 0x0080: KK = 0x17; Key_Release_flag =1; break;
case 0x0100: KK = 0x18; Key_Release_flag =1; break;
case 0x0200: KK = 0x19; Key_Release_flag =1; break;
case 0x0400: KK = 0x1a; Key_Release_flag =1; break; */
default : KK=0;
}
if(KK!=0)
{
Key_flag=0;
return KK;
}
}
if(Key_flag!=0)
{
Key_flag=0;
Key_Down_Counter = 0;
Key_Down_flag = 0;
switch(Key_Data)
{
case 0x0001: KK = 1;break;
case 0x0002: KK = 2;break;
case 0x0004: KK = 3;break;
/* case 0x0008: KK = 4;break;
case 0x0020: KK = 5;break;
case 0x0040: KK = 6;break;
case 0x0080: KK = 7;break;
case 0x0100: KK = 8;break;
case 0x0200: KK = 9;break;
case 0x0400: KK = 10;break;
case 0x0800: KK = 11;break; */
default : break;
}
return KK;
}
else return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -