📄 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++);
}
/***************************************************************************
函数名:ScanKey
功能:得到键盘的值
0-15的值的含义在KEY.H中定义,0XFF为无效。
双键按下的,没有定义;预留
参数:
作者:潘江长
日期: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);
//延时函数用来去抖动
ui16_keyval2= ((uint16)(*(uint8*)KeyGroup0_Address))+
(((uint16)(*(uint8*)KeyGroup1_Address))<<8);
if(ui16_keyval2==ui16_keyval1)//如果去掉抖动后,依然相等
{//在这里进行键处理
uint8 keydownNum,i;//这个是用来判断按下的键的个数
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已经被修改,现在在重新赋值
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已经被修改,现在在重新赋值
if(keydownNum==2)
{//双键按下,预留
uint8 x,y,z;//用来表示现在扫描到的是第几个按键
x=0;//用来表示现在扫描到的是第几个按键
y=0;//第一个键的值
z=0;//第二个键的值
for(i=0;i<16;i++)
{//
if((ui16_keyval2&0x0001)==0x0000)
{
x++;
if(x==1)
{
y=i;
}
if(x==2)//当有第2个键按下检测到的时候就退出
{
z=i;
rtnval=100+y+z;
break;
}
}
ui16_keyval2=ui16_keyval2>>1;
}
}
}
}
return rtnval;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -