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

📄 key_scan.c

📁 ARM嵌入式常用模块的原理图和源码
💻 C
字号:
#include "GloblDef.h"
#include "key.h"

struct SKeyValue xdata KeyValue[KEY_NUM]={	
	{1,{0}},	//功能键1	KEY_FUN1
	{1,{1}},	//退格键	KEY_C
	{1,{2}},	//功能键2	KEY_FUN2
	{2,{'1','.'}},
	{4,{'2','a','b','c'}},
	{4,{'3','d','e','f'}},
	{4,{'4','g','h','i'}},
	{4,{'5','j','k','l'}},
	{4,{'6','m','n','o'}},
	{5,{'7','p','q','r','s'}},
	{4,{'8','t','u','v'}},
	{5,{'9','w','x','y','z'}},
	{1,{'0'}}
};

BYTE xdata ScanKeyInterval;				//键扫描时间
BYTE xdata PreTimeKeyPressed;				//上一次键是否按下
BYTE xdata WhichKey;						//按下了什么键
BYTE xdata IndexInWhichKey;				//采用这个键的第几个键值
BYTE xdata TimeIntervalOfNoKeyPress;	//没有键按下的时间间隔
BYTE xdata KeyOutPort _at_ KEY_ADDRESS;

sbit KeyPort0 = KEY_PORT0;
sbit KeyPort1 = KEY_PORT1;

void KeyInitial()
{
	ScanKeyInterval = 0;
	PreTimeKeyPressed = FALSE;
	WhichKey = 0;
	IndexInWhichKey = 0;
	TimeIntervalOfNoKeyPress = 0;
}
												//是否处于按下状态
BYTE IsKeyPressed()
{
												//373给高低电平
	KeyOutPort = 0;
	KeyPort0 = 1;
	KeyPort1 = 1;
												//输入端口是否出现 0
	if(KeyPort0 == 0 || KeyPort1 == 0)
		return TRUE;
	else
		return FALSE;
}

BYTE GetKey()
{
	BYTE i,veil;
	KeyPort0 = 1;
	KeyPort1 = 1;
												//假设键值,port0为0-7,port1为8-15
	for(i = 0, veil = 0xFE; i < 8; i++, veil <<= 1)
	{
		KeyOutPort = veil;
		if(KeyPort0 == 0 || KeyPort1 == 0)
			break;
	}
	if(KeyPort1 == 0)
		i += 8;
	return i;
}
											// 返回ASCII码
BYTE GetKeyValue()
{
	return KeyValue[WhichKey].value[IndexInWhichKey];
}

BYTE ScanKey()
{
	BYTE tWhichKey;
											//检测是否ScanKeyInterval==0
	if(ScanKeyInterval != 0)
		return SCAN_KEY_NO_KEY_PRESSED;
	else
	{
		#ifdef KEY_DEBUG
		printf(".");
		#endif
					//是则表明从上次检测到键盘按下一个SCAN_KEY_INTERVAL时间已到
					//将ScanKeyInterval置成SCAN_KEY_INTERVAL
		ScanKeyInterval = SCAN_KEY_INTERVAL;

		tWhichKey = GetKey();

					//检测键盘是否按下,而且键值要有效(防止后面出错)
		if(IsKeyPressed() && (tWhichKey >= 0 && tWhichKey < KEY_NUM))
		{
			#ifdef KEY_DEBUG
			printf("\npressed");
			#endif
					//检测PreTimeKeyPressed是否为0
			if(PreTimeKeyPressed == TRUE)
			{
				return SCAN_KEY_NO_KEY_PRESSED;
			}
			else
			{
							//是则表明这是一次新的按下
				#ifdef KEY_DEBUG
				printf("\nagain");
				#endif
				PreTimeKeyPressed = TRUE;
				
				if(tWhichKey == WhichKey && TimeIntervalOfNoKeyPress > 0)
				{
					#ifdef KEY_DEBUG
					printf("\nshift");
					#endif
																//是,改变键值
					IndexInWhichKey++;
					if(IndexInWhichKey == KeyValue[WhichKey].ValueNum)
						IndexInWhichKey = 0;
					
					TimeIntervalOfNoKeyPress = TIME_INTERVAL_CHANGE_KEY_VALUE;	
					return SCAN_KEY_CHANGE_KEY_VALUE;
				}
				else
				{
													//否,新的键
					WhichKey = tWhichKey;
					IndexInWhichKey = 0;
					
					TimeIntervalOfNoKeyPress = TIME_INTERVAL_CHANGE_KEY_VALUE;	
					return SCAN_KEY_NEW_KEY_PRESSED;
				}
			}	
		}
		else
		{
											//将PreTimeKeyPressed置0
			PreTimeKeyPressed = FALSE;
								//TimeIntervalOfNoKeyPress减一,最小到0
			if(TimeIntervalOfNoKeyPress > 0)
				TimeIntervalOfNoKeyPress--;
			return SCAN_KEY_NO_KEY_PRESSED;
		}
	}

⌨️ 快捷键说明

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