?? key.c
字號(hào):
//========================================================================
// 文件名: Key.c
// 作 者: xinqiang Zhang(小丑) (email: xinqiang@Mzdesign.com.cn)
// 日 期: 2007/07/26
// 描 述: MzLH01-12864 LCD顯示模塊驅(qū)動(dòng)V1.0版
// 基本功能接口函數(shù)集
//
// 參 考: 無
// 版 本:
// 2007/07/26 First version Mz Design
//========================================================================
#include ".\Driver\Key_Service\Key_config.h"
unsigned int Key_Sample1=0; //當(dāng)前對(duì)按鍵采樣的值
unsigned int Key_Sample2=0; //上一次對(duì)按鍵采樣的值
unsigned int Key_Scan_old=0; //上一次有效的鍵值狀態(tài)
//(必需連續(xù)兩次的采樣值相同時(shí)才能載入該變量中)
unsigned char Key_Down_flag=0; //鍵盤按下標(biāo)識(shí),注意是經(jīng)過消抖后確認(rèn)的按下標(biāo)識(shí)
unsigned char Key_Down_Counter=0; //用于消抖
unsigned int Key_Value=0; //最終經(jīng)過確認(rèn)的鍵值
unsigned int Key_Data=0;
unsigned char Key_flag=0;
unsigned char Key_flag_long=0; //長(zhǎng)時(shí)按鍵標(biāo)識(shí)~
unsigned char Key_Down_Counter_l=0; //長(zhǎng)時(shí)按鍵計(jì)數(shù)器
unsigned char Key_Release_flag=0; //在有些按鍵中防止長(zhǎng)按鍵時(shí)重復(fù)響應(yīng)用的
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)
{ //連續(xù)兩次掃描的鍵值相同,有效,則處理
if(Key_Sample1) //是否有鍵按下?如有則處理
{
if(Key_Down_flag==0) //如果鍵值還沒有被消抖確認(rèn),則確認(rèn)是否與之前的鍵值一至
{
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; //將確認(rèn)的鍵值載入緩存器中,供鍵抬起后處理用
}
}
else
{
Key_Down_Counter = 0; //重新計(jì)數(shù),即重新消抖
Key_flag_long=0;
}
}
else //如已經(jīng)過消抖,則判斷是否有組合鍵按下?如無則直接退出處理
{
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 //否則就處理之前是否有鍵是經(jīng)過確認(rèn)的
{ //如果已經(jīng)有鍵按下,并確認(rèn)消抖后則處理鍵值
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; //保存當(dāng)次的值
}
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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -