⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key.c

📁 这个是一个带有IC卡
💻 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 + -