?? key.c
字號:
/******************************************************************
本程序只供學習使用,未經作者許可,不得用于其它任何用途
歡迎訪問我的USB專區:http://group.ednchina.com/93/
歡迎訪問我的blog: http://www.ednchina.com/blog/computer00
http://computer00.21ic.org
感謝PCB贊助商——電子園: http://bbs.cepark.com/
KEY.C file
作者:電腦圈圈
建立日期: 2008.06.27
修改日期: 2008.06.27
版本:V1.2
版權所有,盜版必究。
Copyright(C) 電腦圈圈 2008-2018
All rights reserved
*******************************************************************/
#include "Key.h"
#include "MyType.h"
#include "config.h"
volatile uint8 idata KeyCurrent,KeyOld,KeyNoChangedTime;
volatile uint8 idata KeyPress;
volatile uint8 idata KeyDown,KeyUp,KeyLast;
volatile uint8 KeyCanChange;
/********************************************************************
函數功能:定時器0初始化,用來做鍵盤掃描。
入口參數:無。
返 回:無。
備 注:無。
********************************************************************/
void InitTimer0(void)
{
TMOD&=0xF0;
TMOD|=0x01;
ET0=1;
TR0=1;
}
/*******************************************************************/
/********************************************************************
函數功能:鍵盤初始化
入口參數:無。
返 回:無。
備 注:無。
********************************************************************/
void InitKeyboard(void)
{
KeyIO=0xFF; //鍵盤對應的口設置為輸入狀態
KeyPress=0; //無按鍵按下
KeyNoChangedTime=0;
KeyOld=0;
KeyCurrent=0;
KeyLast=0;
KeyDown=0;
KeyUp=0;
InitTimer0(); //初始化定時器
KeyCanChange=1; //允許鍵值改變
}
/*******************************************************************/
/********************************************************************
函數功能:定時器0中斷處理。
入口參數:無。
返 回:無。
備 注:22.1184M晶體約5ms中斷一次。
********************************************************************/
void Timer0Isr(void) interrupt 1
{
//定時器0重裝,定時間隔為5ms,加15是為了修正重裝所花費時間
//這個值可以通過軟件仿真來確定,在這里設置斷點,調整使兩次運行
//時間差剛好為5ms即可。
TH0=(65536-Fclk/1000/12*5+15)/256;
TL0=(65536-Fclk/1000/12*5+15)%256; //
if(!KeyCanChange)return; //如果正在處理按鍵,則不再掃描鍵盤
//開始鍵盤掃描
//保存按鍵狀態到當前按鍵情況
//KeyCurrent總共有8個bit
//當某個開關按下時,對應的bit為1
KeyCurrent=GetKeyValue(); //讀取鍵值,GetKeyValue()其實是個宏,不是函數,
//這里故意寫成函數的樣子,美觀。它的定義在
//key.h文件中
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 + -