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

📄 key.c

📁 一个在嵌入式中使用的占资源很小的GUI
💻 C
字号:
//========================================================================
// 文件名:  Key.c
// 作  者: xinqiang Zhang(小丑)  (email: xinqiang@Mzdesign.com.cn)
// 日  期: 2007/07/26
// 描  述: MzLH01-12864 LCD显示模块驱动V1.0版
//			基本功能接口函数集
//
// 参  考: 无
// 版  本:
//      2007/07/26      First version    Mz Design
//========================================================================
#include ".\Driver\Key_Service\Key_config.h"

unsigned int Key_Sample1=0;					//当前对按键采样的值
unsigned int Key_Sample2=0;					//上一次对按键采样的值
unsigned int Key_Scan_old=0;				//上一次有效的键值状态
											//(必需连续两次的采样值相同时才能载入该变量中)
unsigned char Key_Down_flag=0;				//键盘按下标识,注意是经过消抖后确认的按下标识
unsigned char Key_Down_Counter=0;			//用于消抖

unsigned int Key_Value=0;					//最终经过确认的键值

unsigned int Key_Data=0;
unsigned char Key_flag=0;

unsigned char Key_flag_long=0;				//长时按键标识~
unsigned char Key_Down_Counter_l=0;			//长时按键计数器

unsigned char Key_Release_flag=0;			//在有些按键中防止长按键时重复响应用的


void Key_Initial(void)
{
/*	*Port_Key_Dir &= ~KEY_MASK;
	*Port_Key_Attrib &= ~KEY_MASK;
	*Port_Key_Buffer &= ~KEY_MASK; */
	Port_Key_Data = KEY_MASK;
}

void KeyScan_Service(void)
{
	Port_Key_Data = KEY_MASK;
	Key_Sample1 = Port_Key_Data&KEY_MASK;
	Key_Sample1 = Key_Sample1^KEY_MASK;
	if(Key_Sample1==Key_Sample2)
	{					//连续两次扫描的键值相同,有效,则处理
		if(Key_Sample1)				//是否有键按下?如有则处理
		{
			if(Key_Down_flag==0)  	//如果键值还没有被消抖确认,则确认是否与之前的键值一至
			{
				if(Key_Sample1==Key_Scan_old)
				{
					Key_Down_Counter++;
					if(Key_Down_Counter>=KEY_DOWN_COUNTER_S) 
					{
						Key_Down_Counter = 0;
						Key_Down_Counter_l=KEY_DOWN_COUNTER_S;
						Key_Down_flag = 1;
						Key_Value = Key_Sample1;	//将确认的键值载入缓存器中,供键抬起后处理用
					}
				}
				else
				{
					Key_Down_Counter = 0;		//重新计数,即重新消抖
					Key_flag_long=0;
				}
			}
			else					//如已经过消抖,则判断是否有组合键按下?如无则直接退出处理
			{
				Key_Down_Counter_l++;//
				if(Key_Down_Counter_l>=KEY_DOWN_COUNTER_L) 
				{
					Key_flag_long=1;
					Key_Down_Counter_l=KEY_DOWN_COUNTER_L-KEY_DOWN_COUNTER_M;
				}
			}
		}
		else						//否则就处理之前是否有键是经过确认的
		{							//如果已经有键按下,并确认消抖后则处理键值
			if(Key_Down_flag==1)
			{
				Key_Down_flag = 0;//
				Key_Data = Key_Value;
				Key_flag = 1;
				Key_Down_Counter = 0;
				Key_flag_long=0;
			}
			if(Key_Release_flag==1)
			{
				Key_Release_flag=0;
				Key_flag = 0;
			}
		}
		Key_Scan_old = Key_Sample1;			//保存这次的有效键值
	}
	Key_Sample2 = Key_Sample1;				//保存当次的值 
}

unsigned char Key_Get(void)
{
	unsigned char KK=0;
	if(Key_Release_flag==1) return KK;
	if(Key_flag_long==1)
	{
		Key_flag_long=0;
		switch(Key_Value)
		{
/* 			case 0x0001: KK = 1;break;
			case 0x0002: KK = 2;break;
			case 0x0004: KK = 3;break;
			case 0x0008: KK = 4;break;
			case 0x0020: KK = 5;break;
			case 0x0040: KK = 6;break;
			case 0x0024: KK = 12;Key_Release_flag = 1; break;
			case 0x0080: KK = 0x17; Key_Release_flag =1; break;
			case 0x0100: KK = 0x18; Key_Release_flag =1; break;
			case 0x0200: KK = 0x19; Key_Release_flag =1; break;
			case 0x0400: KK = 0x1a; Key_Release_flag =1; break; */
			default : KK=0;
		}
		if(KK!=0)
		{
			Key_flag=0;
			return KK;
		}
	}
	if(Key_flag!=0)
	{
		Key_flag=0;
		Key_Down_Counter = 0;
		Key_Down_flag = 0;
		switch(Key_Data)
		{
			case 0x0001: KK = 1;break;
			case 0x0002: KK = 2;break;
			case 0x0004: KK = 3;break;
			/* case 0x0008: KK = 4;break;
			case 0x0020: KK = 5;break;
			case 0x0040: KK = 6;break;
			case 0x0080: KK = 7;break;
			case 0x0100: KK = 8;break;
			case 0x0200: KK = 9;break;
			case 0x0400: KK = 10;break;
			case 0x0800: KK = 11;break; */
			default : break;
		}
		return KK;
	}
	else return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -