?? key.c
字號:
/******************************************************************
本程序只供學習使用,未經作者許可,不得用于其它任何用途
歡迎訪問我的USB專區:http://group.ednchina.com/93/
歡迎訪問我的blog: http://www.ednchina.com/blog/computer00
http://computer00.21ic.org
KEY.C file
作者:電腦圈圈
建立日期: 2008.06.27
修改日期: 2009.03.07
版本:V1.2
版權所有,盜版必究。
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;
/********************************************************************
函數功能:鍵盤初始化
入口參數:無。
返 回:無。
備 注:無。
********************************************************************/
void KeyInit(void)
{
KeyPress=0; //無按鍵按下
KeyNoChangedTime=0;
KeyOld=0;
KeyCurrent=0;
KeyLast=0;
KeyDown=0;
KeyUp=0;
KeyCanChange=1; //允許鍵值改變
}
/*******************************************************************/
/********************************************************************
函數功能:獲取按鍵值。
入口參數:無。
返 回:無。
備 注:按鍵值的位圖。
********************************************************************/
uint8 KeyGetValue(void)
{
int AdcKeyValue;
AdcKeyValue=*AT91C_ADC_CDR4; //讀回ADC結果
*AT91C_ADC_CR=(1<<1); //啟動下一次轉換
//對鍵盤的ADC值進行處理
if((AdcKeyValue>KEY0_VALUE-KEY_ERROR_RANGE)
&&(AdcKeyValue<KEY0_VALUE+KEY_ERROR_RANGE))return 0; //無按鍵按下
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/////////////////////////////
/********************************************************************
函數功能:鍵盤掃描程序
入口參數:無。
返 回:無。
備 注:在中斷函數中每5ms調用一次。
********************************************************************/
void KeyScan(void)
{
if(!KeyCanChange)return; //如果正在處理按鍵,則不再掃描鍵盤
//開始鍵盤掃描
//保存按鍵狀態到當前按鍵情況
//KeyCurrent總共有8個bit
//當某個開關按下時,對應的bit為1
KeyCurrent=KeyGetValue(); //讀取鍵值
if(KeyCurrent!=KeyOld) //如果兩次值不等,說明按鍵情況發生了改變
{
KeyNoChangedTime=0; //鍵盤按下時間為0
KeyOld=KeyCurrent; //保存當前按鍵情況
return; //返回
}
else
{
KeyNoChangedTime++; //按下時間累計
if(KeyNoChangedTime>=1) //如果按下時間足夠
{
KeyNoChangedTime=1;
KeyPress=KeyOld; //保存按鍵
KeyDown|=(~KeyLast)&(KeyPress); //求出新按下的鍵
KeyUp|=KeyLast&(~KeyPress); //求出新釋放的鍵
KeyLast=KeyPress; //保存當前按鍵情況
}
}
}
/*******************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -