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

📄 keyprocess.c

📁 程序概述: 这是个具体产品程序
💻 C
📖 第 1 页 / 共 5 页
字号:
			UpdateDisp(TRUE);
			break;
		}
		case Key_Three:					// PageUp
		{
			// 向上翻2行
			for (i=1; i<(sizeof(SetupMenu)/sizeof(t_Menu)); i++)
			{
				if (SetupMenu[i].NextMenu == SystemStatus.lParam)
				{
					SystemStatus.lParam = i;
					break;
				}
			}
			for (i=1; i<(sizeof(SetupMenu)/sizeof(t_Menu)); i++)
			{
				if (SetupMenu[i].NextMenu == SystemStatus.lParam)
				{
					SystemStatus.lParam = i;
					break;
				}
			}
			InitDispBuffer(TRUE);
			UpdateDisp(TRUE);
			break;
		}
		case Key_Nine:					// PageDown
		{
			// 向下翻2行
			SystemStatus.lParam = SetupMenu[SystemStatus.lParam].NextMenu;
			SystemStatus.lParam = SetupMenu[SystemStatus.lParam].NextMenu;
			InitDispBuffer(TRUE);
			UpdateDisp(TRUE);
			break;
		}
		default:
			break;
		}

		break;
	}
	case Status_SetupTime:				// 如果是在设置时间的界面,数字键则表示修改时间
	{
		// 将按键的值放到缓冲区中
		if (KeyBuffer[0] < 10)
		{
			KeyBuffer[++KeyBuffer[0]] = nKey;
			// 更新显示缓冲
			DispBuffer[1][SetupTimeDispOrder[KeyBuffer[0]]] = nKey+0x30;
			DispBuffer[1][0] = 0x01;
			UpdateDisp(FALSE);
		}
		break;
	}
	case Status_SetupEnterPassword:
	case Status_SetupPasswordBefore:
	case Status_SetupPasswordFirst:
	case Status_SetupPasswordVerify:// 确认输入的密码
	{
		// 将按键的值放到缓冲区中
		if (KeyBuffer[0] < MAX_SYSTEM_PASSWORD_LENGTH)
		{
			KeyBuffer[++KeyBuffer[0]] = nKey;
			// 更新显示缓冲
			for (i=1; i<DISP_BUF_LENGTH; i++)
			{
				DispBuffer[1][i] = DispBuffer[1][i+1];
			}
			DispBuffer[1][DISP_BUF_LENGTH] = '*';   // 以*显示密码字符
			DispBuffer[1][0] = 0x01;
			UpdateDisp(FALSE);
		}
		break;
	}

	case Status_SetupAddTempCardByNum: 
	case Status_SetupDelTempCardByNum:
	{
		// 将按键的值放到缓冲区中
		if (KeyBuffer[0] < MAX_RFCARD_NUM_LENGTH)
		{
			KeyBuffer[++KeyBuffer[0]] = nKey;
			// 更新显示缓冲
			for (i=0; i<KeyBuffer[0]; i++)
			{
				DispBuffer[1][DISP_BUF_LENGTH-i] = KeyBuffer[KeyBuffer[0]-i]+0x30;
			}
			DispBuffer[1][0] = 0x01;
			UpdateDisp(FALSE);
		}
		break;
	}
	case Status_SetupAddTempCardDoor:	// 输入该卡持卡人所在的房间号
	{
		if (KeyBuffer[0] < 4)
		{
			KeyBuffer[++KeyBuffer[0]] = nKey;
			// 更新显示
			for (i=1; i<=KeyBuffer[0]; i++)
			{
				DispBuffer[1][SetupAddTempCardDoorDispOrder[i]] = KeyBuffer[i]+0x30;
			}
			DispBuffer[1][0] = 0x01;
			UpdateDisp(FALSE);
		}
		break;
	}
	case Status_SetupAddTempCardEndTime:// 输入射频卡的使用期限
	{
		if (KeyBuffer[0] < 10)
		{
			KeyBuffer[++KeyBuffer[0]] = nKey;
			// 更新显示缓冲
			DispBuffer[1][SetupTimeDispOrder[KeyBuffer[0]]] = nKey | 0x30;
			DispBuffer[1][0] = 0x01;
			UpdateDisp(FALSE);
		}
		break;
	}
	case Status_SetupDoubleClickTime:	// 设置按键双击间隔时间
	{
		if (KeyBuffer[0] < 2)
		{
			KeyBuffer[++KeyBuffer[0]] = nKey;
			// 更新显示缓冲
			DispBuffer[1][12] = DispBuffer[1][13];
			DispBuffer[1][13] = nKey | 0x30;
			DispBuffer[1][0] = 0x01;
			UpdateDisp(FALSE);
		}
		break;
	}
	case Status_SetupCheckDoorIntervalTime:
	{
		if (KeyBuffer[0] < 2)
		{
			KeyBuffer[++KeyBuffer[0]] = nKey;
			// 更新显示缓冲
			DispBuffer[1][12] = DispBuffer[1][13];
			DispBuffer[1][13] = nKey | 0x30;
			DispBuffer[1][0] = 0x01;
			UpdateDisp(FALSE);
		}
		break;
	}
	case Status_FindAlarmRecord:		// 查询报警记录的界面,数字键代替方向键
	{
		switch (nKey)
		{
		case Key_Two:					// 查询上一条报警记录
		{
			if (AlarmRecord.PreRecord == AlarmRecordStartAddr)  // 如果上一条记录是第一条空记录,则
			{
				I2CReadString(0x00, AlarmRecordStartAddr, I2CBuffer, sizeof(t_AlarmRecord));
				pAlarmRecord = (t_AlarmRecord *)(I2CBuffer);
				if (pAlarmRecord->PreRecord != AlarmRecordStartAddr)// 如果上面还有记录
				{
					I2CReadString(0x00, pAlarmRecord->PreRecord, (BYTE *)(&AlarmRecord), sizeof(t_AlarmRecord));
				}
			}
			else
			{
				I2CReadString(0x00, AlarmRecord.PreRecord, (BYTE *)(&AlarmRecord), sizeof(t_AlarmRecord));
			}
			break;
		}
		case Key_Eight:					// 查询下一条报警记录
		{
			if (AlarmRecord.NextRecord == AlarmRecordStartAddr) // 如果下一条记录是第一条记录,则
			{
				I2CReadString(0x00, AlarmRecordStartAddr, I2CBuffer, sizeof(t_AlarmRecord));
				pAlarmRecord = (t_AlarmRecord *)(I2CBuffer);
				if (pAlarmRecord->NextRecord != AlarmRecordStartAddr)// 如果下面还有记录
				{
					I2CReadString(0x00, pAlarmRecord->NextRecord, (BYTE *)(&AlarmRecord), sizeof(t_AlarmRecord));
				}
			}
			else
			{
				I2CReadString(0x00, AlarmRecord.NextRecord, (BYTE *)(&AlarmRecord), sizeof(t_AlarmRecord));
			}
			break;
		}
		case Key_Four:					// 退出
		{
			SystemStatus.Status = Status_Idle;
			break;
		}
		case Key_Six:					// 进入上下文菜单,即是否删除该菜单
		{
			SystemStatus.PreStatus = SystemStatus.Status;
			SystemStatus.Status = Status_DelAlarmRecordFirst;
			break;
		}
		case Key_Three:					// 到第一条报警记录
		{
			I2CReadString(0x00, AlarmRecordStartAddr, I2CBuffer, sizeof(t_AlarmRecord));
			pAlarmRecord = (t_AlarmRecord *)(I2CBuffer);
			if (pAlarmRecord->NextRecord != AlarmRecordStartAddr)// 如果下面还有记录
			{
				I2CReadString(0x00, pAlarmRecord->NextRecord, (BYTE *)(&AlarmRecord), sizeof(t_AlarmRecord));
			}
			break;
		}
		case Key_Nine:					// 到最后一条报警记录
		{
			I2CReadString(0x00, AlarmRecordStartAddr, I2CBuffer, sizeof(t_AlarmRecord));
			pAlarmRecord = (t_AlarmRecord *)(I2CBuffer);
			if (pAlarmRecord->PreRecord != AlarmRecordStartAddr)// 如果下面还有记录
			{
				I2CReadString(0x00, pAlarmRecord->PreRecord, (BYTE *)(&AlarmRecord), sizeof(t_AlarmRecord));
			}
			break;
		}
		default:
			break;
		}
		InitDispBuffer(TRUE);
		UpdateDisp(TRUE);
		break;
	}
	case Status_DelAlarmRecordFirst:	// 询问是否删除这项报警记录
	{
		switch (nKey)
		{
		case Key_One:					// 确认删除
		{
			I2CReadString(0x00, AlarmRecord.NextRecord, I2CBuffer+sizeof(t_AlarmRecord), sizeof(t_AlarmRecord));
			pAlarmRecord = (t_AlarmRecord *)(I2CBuffer+sizeof(t_AlarmRecord));
			I2CWriteString(0x00, pAlarmRecord->PreRecord, NullString, sizeof(t_AlarmRecord));	// 删除当前报警记录
			// 同时修改其前一条和后一条报警记录的指针
			pAlarmRecord->PreRecord = AlarmRecord.PreRecord;
			I2CWriteString(0x00, AlarmRecord.NextRecord, I2CBuffer+sizeof(t_AlarmRecord), sizeof(t_AlarmRecord));
			I2CReadString(0x00, AlarmRecord.PreRecord, I2CBuffer+sizeof(t_AlarmRecord), sizeof(t_AlarmRecord));
			pAlarmRecord->NextRecord = AlarmRecord.NextRecord;
			I2CWriteString(0x00, AlarmRecord.PreRecord, I2CBuffer+sizeof(t_AlarmRecord), sizeof(t_AlarmRecord));
			// 删除这条报警记录后显示上一条报警记录
			if (AlarmRecord.PreRecord == AlarmRecordStartAddr)	// 如果上一条记录是第一条空记录,则显示最后一条记录
			{
				if (pAlarmRecord->PreRecord != AlarmRecordStartAddr)	// 如果上面还有记录
				{
					I2CReadString(0x00, pAlarmRecord->PreRecord, I2CBuffer+sizeof(t_AlarmRecord), sizeof(t_AlarmRecord));
					memcpy((BYTE *)(&AlarmRecord), (BYTE *)pAlarmRecord, sizeof(t_AlarmRecord));
				}
				else					// 如果已经没有报警记录了,则显示提示
				{
					memcpy(&DispBuffer[0][1], "报警记录已经为空", DISP_BUF_LENGTH);
					memcpy(&DispBuffer[1][1], "请返回!        ", DISP_BUF_LENGTH);
					SystemStatus.PreStatus = Status_Idle;
					SystemStatus.Status = Status_ShowingMessage;
					MessageShowTimer = 200;		// 消息显示时间为2s
					break;
				}
			}
			else
			{
				memcpy((BYTE *)(&AlarmRecord), (BYTE *)pAlarmRecord, sizeof(t_AlarmRecord));
			}

			memcpy(&DispBuffer[0][1], "删除操作完成    ", DISP_BUF_LENGTH);
			memcpy(&DispBuffer[1][1], "请返回          ", DISP_BUF_LENGTH);
			SystemStatus.PreStatus = Status_FindAlarmRecord;
			SystemStatus.Status = Status_ShowingMessage;
			MessageShowTimer = 150;
			break;
		}
		case Key_Zero:					// 取消删除
		{
			SystemStatus.Status = Status_FindAlarmRecord;
			break;
		}
		default:
			break;
		}
		InitDispBuffer(TRUE);
		UpdateDisp(TRUE);
		break;
	}
	case Status_Alarming_F:				// 正在报警
	{
		break;
	}
	default:
		break;
	}
}

// 按下"取消"按键
void CancelKeyPress(void)
{
	BYTE i;

	if((SystemStatus.Status == Status_SetupAddTempCardByCard)
	  ||SystemStatus.Status == Status_SetupDelTempCardByCard)
	{
		KeyBuffer[0] = 0x00;
		CardBuffer[0] = 0x00;
	}  	
		
	if (SystemStatus.Status == Status_ShowingMessage)	// 如果当前正在显示提示消息
	{
		SystemStatus.PreStatus = Status_Idle;
		SystemStatus.Status = Status_Idle;//SystemStatus.PreStatus;
		InitDispBuffer(TRUE);
	}
	else if (KeyBuffer[0] > 0x00)		// 前面的输入当中输入了数字
	{
		if ((SystemStatus.Status == Status_Alarming_F)			// 正在响应分机报警
		 || (SystemStatus.Status == Status_Alarming_M))			// 正在响应门口机报警
		{
			SystemStatus.Status = SystemStatus.PreStatus;
			SystemStatus.PreStatus = Status_Idle;
			InitDispBuffer(TRUE);
			ClosePower();				// 关闭报警电源
		}
		else if (LastKeyTimer < DoubleKeyPressTimer)	// 如果两次按"取消"键的时间间隔小于设置的时间间隔,则认为是双击
		{
			// 双击"取消"按键
			switch (SystemStatus.Status)
			{
				case Status_SetupTime:
				case Status_SetupPasswordBefore:
				case Status_SetupPasswordFirst:
				case Status_SetupPasswordVerify:
				case Status_SetupAddTempCardByNum:
				case Status_SetupDelTempCardByNum:
					SystemStatus.Status = Status_SetupMenu;
					break;
				case Status_SetupAddTempCardEndTime:
				case Status_SetupAddTempCardDoor:	// 确认该卡所在的房间号
					break;
				case Status_SetupCheckDoorIntervalTime:
					break;
				default:
					SystemStatus.Status = Status_Idle;
					SystemStatus.lParam = 0x00;
					SystemStatus.wParam = 0x00;
					break;
			}
			KeyBuffer[0] = 0;
			// 更新显示缓冲
			InitDispBuffer(TRUE);
		}
		else
		{
			switch (SystemStatus.Status)
			{
				case Status_ViewBefore:				// 在按下监视键之后的数字输入见面
				{
					i = ViewBeforeDispOrder[KeyBuffer[0]];
					DispBuffer[1][i] = '_';
					break;
				}
				case Status_CallBefore:				//
				{
					i = CallBeforeDispOrder[KeyBuffer[0]];
					DispBuffer[1][i] = '_';
					break;
				}
				case Status_SetupTime:				// 设置时间
				{
					i = SetupTimeDispOrder[KeyBuffer[0]];
					DispBuffer[1][i] = '_';
					break;
				}
				case Status_Idle:					// 空闲情况
				case Status_SetupEnterPassword:		// 进入设置菜单之前的输入管理员密码的阶段按取消键
				case Status_SetupPasswordBefore:
				case Status_SetupPasswordFirst:
				case Status_SetupPasswordVerify:
				case Status_SetupAddTempCardByNum:
				case Status_SetupDelTempCardByNum:
				{
					// 全体数字右移一位
					for (i=DISP_BUF_LENGTH; i>1; i--)
					{
						DispBuffer[1][i] = DispBuffer[1][i-1];
					}
					DispBuffer[1][1] = ' ';			// 前面补空格
					break;
				}
				case Status_SetupAddTempCardDoor:	// 确认该卡所在的房间号
				{
					i = SetupAddTempCardDoorDispOrder[KeyBuffer[0]];
					DispBuffer[1][i] = '_';
					break;
				}
				case Status_SetupAddTempCardEndTime:
				{
					i = SetupTimeDispOrder[KeyBuffer[0]];
					DispBuffer[1][i] = '_';
					break;
				}
				case Status_SetupDoubleClickTime:	// 设置按键双击间隔时间
				case Status_SetupCheckDoorIntervalTime:		// 设置管理机轮检门口机的时间间隔
				{
					DispBuffer[1][13] = DispBuffer[1][12];
					DispBuffer[1][12] = '_';
					break;
				}
				default:							//
				{
					SystemStatus.Status = Status_Idle;
					SystemStatus.lParam = 0x00;
					SystemStatus.wParam = 0x00;
					break;
				}
			}
			DispBuffer[1][0] = 0x01;
			KeyBuffer[0] --;
		}
	}
	else  if (KeyBuffer[0] == 0x00)		// 如果按键缓冲区中没有按键值,
	{
		switch (SystemStatus.Status)
		{

⌨️ 快捷键说明

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