?? key.c
字號(hào):
/******************************************************************
本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途
歡迎訪問(wèn)我的USB專區(qū):http://group.ednchina.com/93/
歡迎訪問(wèn)我的blog: http://www.ednchina.com/blog/computer00
http://computer00.21ic.org
KEY.C file
作者:電腦圈圈
建立日期: 2008.06.27
修改日期: 2009.03.07
版本:V1.2
版權(quán)所有,盜版必究。
Copyright(C) 電腦圈圈 2008-2018
All rights reserved
*******************************************************************/
#include <AT91SAM7S64.H>
#include "Key.h"
#include "MyType.h"
volatile uint8 KeyCurrent,KeyOld,KeyNoChangedTime;
volatile uint8 KeyPress;
volatile uint8 KeyDown,KeyUp,KeyLast;
volatile uint8 KeyCanChange;
/********************************************************************
函數(shù)功能:鍵盤初始化
入口參數(shù):無(wú)。
返 回:無(wú)。
備 注:無(wú)。
********************************************************************/
void KeyInit(void)
{
KeyPress=0; //無(wú)按鍵按下
KeyNoChangedTime=0;
KeyOld=0;
KeyCurrent=0;
KeyLast=0;
KeyDown=0;
KeyUp=0;
KeyCanChange=1; //允許鍵值改變
}
/*******************************************************************/
/********************************************************************
函數(shù)功能:獲取按鍵值。
入口參數(shù):無(wú)。
返 回:無(wú)。
備 注:按鍵值的位圖。
********************************************************************/
uint8 KeyGetValue(void)
{
int AdcKeyValue;
AdcKeyValue=*AT91C_ADC_CDR4; //讀回ADC結(jié)果
*AT91C_ADC_CR=(1<<1); //啟動(dòng)下一次轉(zhuǎn)換
//對(duì)鍵盤的ADC值進(jìn)行處理
if((AdcKeyValue>KEY0_VALUE-KEY_ERROR_RANGE)
&&(AdcKeyValue<KEY0_VALUE+KEY_ERROR_RANGE))return 0; //無(wú)按鍵按下
if(AdcKeyValue>KEY1_VALUE-KEY_ERROR_RANGE)return KEY1; //KEY1按下
if((AdcKeyValue>KEY2_VALUE-KEY_ERROR_RANGE)
&&(AdcKeyValue<KEY2_VALUE+KEY_ERROR_RANGE))return KEY2; //KEY2按下
if((AdcKeyValue>KEY3_VALUE-KEY_ERROR_RANGE)
&&(AdcKeyValue<KEY3_VALUE+KEY_ERROR_RANGE))return KEY3; //KEY3按下
if((AdcKeyValue>KEY4_VALUE-KEY_ERROR_RANGE)
&&(AdcKeyValue<KEY4_VALUE+KEY_ERROR_RANGE))return KEY4; //KEY4按下
if((AdcKeyValue>KEY5_VALUE-KEY_ERROR_RANGE)
&&(AdcKeyValue<KEY5_VALUE+KEY_ERROR_RANGE))return KEY5; //KEY5按下
if((AdcKeyValue<KEY6_VALUE+KEY_ERROR_RANGE))return KEY6; //KEY6按下
//其它情況,返回0
return 0;
}
/////////////////////////End of function/////////////////////////////
/********************************************************************
函數(shù)功能:鍵盤掃描程序
入口參數(shù):無(wú)。
返 回:無(wú)。
備 注:在中斷函數(shù)中每5ms調(diào)用一次。
********************************************************************/
void KeyScan(void)
{
if(!KeyCanChange)return; //如果正在處理按鍵,則不再掃描鍵盤
//開始鍵盤掃描
//保存按鍵狀態(tài)到當(dāng)前按鍵情況
//KeyCurrent總共有8個(gè)bit
//當(dāng)某個(gè)開關(guān)按下時(shí),對(duì)應(yīng)的bit為1
KeyCurrent=KeyGetValue(); //讀取鍵值
if(KeyCurrent!=KeyOld) //如果兩次值不等,說(shuō)明按鍵情況發(fā)生了改變
{
KeyNoChangedTime=0; //鍵盤按下時(shí)間為0
KeyOld=KeyCurrent; //保存當(dāng)前按鍵情況
return; //返回
}
else
{
KeyNoChangedTime++; //按下時(shí)間累計(jì)
if(KeyNoChangedTime>=1) //如果按下時(shí)間足夠
{
KeyNoChangedTime=1;
KeyPress=KeyOld; //保存按鍵
KeyDown|=(~KeyLast)&(KeyPress); //求出新按下的鍵
KeyUp|=KeyLast&(~KeyPress); //求出新釋放的鍵
KeyLast=KeyPress; //保存當(dāng)前按鍵情況
}
}
}
/*******************************************************************/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -