?? key.c
字號:
/****************************************Copyright (c)*******************************/
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: KEY.c
** Last modified Date: 2007-11-28
** Last Version: 1.0
** Descriptions: 掃描按鍵
**
**------------------------------------------------------------------------------------------------------
** Created by: 李錫清
** Created date: 2007-11-28
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
#define __SRC
#include"key.h"
#undef __SRC
#define KeyGroup0_Address 0x83FDFFFF //A17 //按鍵KEY0-KEY7的地址
#define KeyGroup1_Address 0x83FBFFFF //A18 //按鍵KEY8-KEY9的地址
void DelayNS_forKey(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<5000; i++);
}
/***************************************************************************
函數(shù)名:ScanKey
功能:得到鍵盤的值
0-15的值的含義在KEY.H中定義,0XFF為無效。
雙鍵按下的,沒有定義;預(yù)留
參數(shù):
作者:潘江長
日期:2008-1-1
****************************************************************************/
uint8 ScanKey(void)
{
uint16 ui16_keyval1,ui16_keyval2;
uint8 rtnval;
rtnval=KEY_NULL;
ui16_keyval1=0;
ui16_keyval2=0;
ui16_keyval1= ((uint16)(*(uint8*)KeyGroup0_Address))+
(((uint16)(*(uint8*)KeyGroup1_Address))<<8);
//這里得到KEY的值
if(ui16_keyval1!=0xffff)
{
DelayNS_forKey(2);
//延時函數(shù)用來去抖動
ui16_keyval2= ((uint16)(*(uint8*)KeyGroup0_Address))+
(((uint16)(*(uint8*)KeyGroup1_Address))<<8);
if(ui16_keyval2==ui16_keyval1)//如果去掉抖動后,依然相等
{//在這里進(jìn)行鍵處理
uint8 keydownNum,i;//這個是用來判斷按下的鍵的個數(shù)
i=0;
keydownNum=0;
for(i=0;i<16;i++)
{//移位16次,最后一次其實是無效的,這里要判斷16次是確定的
if((ui16_keyval2&0x0001)==0x0000)
{
keydownNum++;
}
ui16_keyval2=ui16_keyval2>>1;
}
ui16_keyval2=ui16_keyval1;//ui16_keyval2已經(jīng)被修改,現(xiàn)在在重新賦值
if(keydownNum==1)
{//單鍵按下
for(i=0;i<16;i++)
{//
if((ui16_keyval2&0x0001)==0x0000)
{
rtnval=i;
break;
}
ui16_keyval2=ui16_keyval2>>1;
}
}
ui16_keyval2=ui16_keyval1;//ui16_keyval2已經(jīng)被修改,現(xiàn)在在重新賦值
if(keydownNum==2)
{//雙鍵按下,預(yù)留
uint8 x,y,z;//用來表示現(xiàn)在掃描到的是第幾個按鍵
x=0;//用來表示現(xiàn)在掃描到的是第幾個按鍵
y=0;//第一個鍵的值
z=0;//第二個鍵的值
for(i=0;i<16;i++)
{//
if((ui16_keyval2&0x0001)==0x0000)
{
x++;
if(x==1)
{
y=i;
}
if(x==2)//當(dāng)有第2個鍵按下檢測到的時候就退出
{
z=i;
rtnval=100+y+z;
break;
}
}
ui16_keyval2=ui16_keyval2>>1;
}
}
}
}
return rtnval;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -