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

📄 mrv.c

📁 一款C语言编写的小家电程序
💻 C
📖 第 1 页 / 共 5 页
字号:
 // 当没有按键的时候,虽然此标志为0,但按键值也为0,所以也不会处理
 // 这样,总共只处理了一次
	if (F_KeyAction != 0x00) return;		// 按住未放手
	if (R_CurKey == 0x00) return;			// 没有按键
	F_KeyAction = 0x01;				// 有新按键,处理一次,以后不再处理

 // 检查当前是否处于锁定状态,如果是只响应K00键,其它键不响应
 // 也即如果是其它键,检查是否在锁定状态,如果在,不响应
	if (R_CurKey != KY_K15 && F_LockOn == 0x01) return;

 // 这里已有按键产生,并且这个按键是要进行处理的
 // 所以这里首先要进行按键的公共功能的处理,然后再区别是哪一个按键所对应的功能
	kycomf();					// 按键响应的公共处理

	switch(R_CurKey)				// 根据按键值处理
	{
	case	KY_K15:	kd_lock();	break;

 // 该键有两种功能如下所述:
 // 当按一下键时,为某种功能,由于它有第二种按住不放的功能,所以只能在放开键后才处理此项功能
 // 当按住不放,时间长过两秒后,它起另一种功能,但该功能只做一次就不再处理,之后直至放开键
	case	KY_K10:	{ R_KHType = KHDONCE; R_CntKHF = T2S;	break; }

 // 如果在0.5秒同时按下下面两个键时,做同时按键的处理,否则则做两种不同功能的按键处理
 // 通常这种按键的选择是选同一个输出口,不同的输入口,读键时特别处理一下这个按键!!!
	case	KY_K11:
	case	KY_K12:	{ R_KHType = KHDCOMBIN; R_CntKHF = T500MS;	break; }

	case	KY_K13:
	case	KY_K14:

	case	KY_K00:
	case	KY_K01:
	case	KY_K02:
	case	KY_K03:
	case	KY_K04:
	case	KY_K05:
	case	KY_K06:
	case	KY_K07:
	case	KY_K08:
	case	KY_K09:	kd_number();	break;

 // 现实条件中,很难预料到会有什么情况产生
 // 所以在写程序的时候,不但要写什么情况下会怎么样,还要考虑到不在这些情况下应该怎么样
	default:	break;
	}
}


/**** 锁定键的键盘处理程序 ****/
void	__near	kd_lock(void)
{	
}


/**** 各种菜单的处理 ****/
 /*** 只有在RTC模式下按这些菜单键才有作用 ***/
 /*** 之所以用缓冲而不用R_CurKey,是因为担心如果改动其值是否会影响到按键判断,小心为好 ***/
 /*** POPCORN: 在适时时钟模式下按此键进入第一次状态,在此状态下再按则进入第二次状态,再按无效 ***/
 /*** FRESHVEGETABLE: 在适时模式按此键进入第一次状态,在此状态下再按则进入第二次状态,再按无效 ***/
void	__near	kd_menu(void)
{
	R_Temp[0] = R_CurKey;

	if (R_Temp[0] == KY_POPCORN)
	{
		if (R_SMode == M_POPCORN1) R_Temp[0] = KY_TEMP1;
		else if(R_SMode != M_RTC && R_SMode != M_POPCORN2) return;
	}
	else if (R_Temp[0] == KY_FRESHVEGETABLES)
	{
		if (R_SMode == M_FRESHVEG1) R_Temp[0] = KY_TEMP2;
		else if(R_SMode != M_RTC && R_SMode != M_FRESHVEG2) return;
	}
	else if (R_Temp[0] == KY_REHEAT)
	{
		if (F_TurnStatus == 0x01) { if (R_SMode != M_RTC) return; }
		else if (R_SMode == M_RTC || R_SMode == M_REHEAT3) R_Temp[0] = KY_TEMP3;
		else if (R_SMode == M_REHEAT2) R_Temp[0] = KY_TEMP4;
		else return;
	}
	else if (R_Temp[0] == KY_BAKEDPOTATO)		{ if (R_SMode != M_RTC) return; }
	else if (R_Temp[0] == KY_FROZENVEGETABLES)	{ if (R_SMode != M_RTC) return; }
	else if (R_Temp[0] == KY_FISHSEAFOOD)		{ if (R_SMode != M_RTC) return; }
	else if (R_Temp[0] == KY_FROZENENTREES)		{ if (R_SMode != M_RTC) return; }
	else if (R_Temp[0] == KY_RICE)			{ if (R_SMode != M_RTC) return; }
	else if (R_Temp[0] == KY_GROUNDMEAT)		{ if (R_SMode != M_RTC) return; }
	
	if (F_DoorStatus == 0x00) return;

 // 到这里要准备读数据表格
 // 这里用一种别的方法,即个数确定的读表方法
 // 因为R_Temp[0]已经在前面用了,所以这里如果需要用的话就要用R_Temp[1]了
 // 找到对应的菜单应取的值表格的起始位置,得到相应的模式和显示句子
	for(R_Temp[1] = 0x00; R_Temp[0] != TBL_MenuInf[R_Temp[1]]; R_Temp[1] += 0x09) {}
	R_SMode = R_Temp[1]/0x09 + M_POPCORN1;
	R_SPointer = R_Temp[1]/0x09 + S_REGULARPRESSAGAINFORSNACK;
	F_Menu = 0x01;
	sdispinit();

 // 到这里,R_Temp[0]的作用已经没有了,所以在这里可以使用这个暂存器
	for(R_Temp[0] = 0x00; R_Temp[0] < 0x08; R_Temp[0]++)
	{
		R_CookData[R_Temp[0]] = TBL_MenuInf[R_Temp[1] + R_Temp[0] + 0x01];
	}

 // 这里同上一样要做一个读表,按上述方法做
 // 这里R_Temp[0]及R_Temp[1]已经全部都可以用了
	for(R_Temp[0] = 0x00; R_SMode != TBL_MenuMaxTime[R_Temp[0]]; R_Temp[0] += 0x07) {}
	R_MenuMaxTimL = TBL_MenuMaxTime[R_Temp[0]+0x01]; R_MenuMaxTimH = TBL_MenuMaxTime[R_Temp[0]+0x02];
	if (F_LBKG == 0x00)
	{
		R_LowWeight = TBL_MenuMaxTime[R_Temp[0]+0x03]; R_HighWeight = TBL_MenuMaxTime[R_Temp[0]+0x04];
	}
	else
	{
		R_LowWeight = TBL_MenuMaxTime[R_Temp[0]+0x05]; R_HighWeight = TBL_MenuMaxTime[R_Temp[0]+0x06];
	}
	if (R_SMode == M_REHEAT1 || R_SMode == M_REHEAT2 || R_SMode == M_REHEAT3) return;
	F_TurnStatus = 0x01; 
}


/**** COMPU解冻共六种模式 ****/
void	__near	kd_compudefrost(void)
{
	if (R_SMode != M_RTC) return;
	R_SMode = M_COMPUDEF; F_Def = 0x01; R_CompuPointer = 0x00;
	R_SPointer = S_SELECTFOODNUMBERSEELABEL; sdispinit();
	F_TurnStatus = 0x01;
}


/**** 开始及按住不放计时按键 ****/
 /*** 如果按此键就进入烹调模式的话,那之前要判断是否关门,如未关则不反应 ***/
void	__near	kd_starttouchon(void)
{
	switch(R_SMode)
	{
	case	M_DIGITCOOK:
	case	M_ADJPWRLVL:	{ sdispinit(); F_CookEn = 0x01; R_SMode = M_COOKING; break; }
	case	M_HLPLOCKON:
		{
			R_SMode = M_RTC; F_LockOn = 0x01;
			F_DSBufEn = 0x01; R_SPointer = S_LOCKON; sdispinit();
			break;
		}
	case	M_SNDONOFF:
		{
			if (F_BuzEn == 0x00)
			{
				R_SMode = M_RTC; F_BuzEn = 0x01;
				F_DSBufEn = 0x01; R_SPointer = S_SOUNDON; sdispinit();
			}
			break;
		}
	case	M_TMROK:	{ R_SMode = M_RTC; sdispinit(); F_TimerEn = 0x01; break; }
	}
}


/**** 帮助按键 ****/
void	__near	kd_customhelp(void)
{
	if (R_SMode != M_RTC) return;
	if (F_LockOn == 0x00)
	{
		R_SMode = M_HELP;
		R_SPointer = S_LOCKPRESS1SOUNDONOFFPRESS2AUT;
	}
		else
		{
			R_SMode = M_HLPLOCKOFF;
			R_SPointer = S_TOCANCELLOCKPRESSCLEAR;
		}
	sdispinit();
}


/**** 定时器及时钟设定按键 ****/
void	__near	kd_kitchentimerclock(void)
{
	if (R_SMode == M_RTC)
	{
		R_SMode = M_TMRCLK;
		R_SPointer = S_TOSETKITCHENPRESS1TOSETCLOCKP; sdispinit();
	}
	else if (R_SMode == M_CLKOK) { R_SMode = M_RTC; sdispinit(); F_RTCEn = 0x01; }
}


/**** POWER/LEVEL按键的处理程式 ****/
 /*** 有以下的反应: ***/
 /*** 如果是在RTC模式:
 /*** 如果是在按了数字键后再按:
 /*** 其它模式应该不响应 ***/
void	__near	kd_powerlevel(void)
{
	switch(R_SMode)
	{
	case	M_DIGITCOOK:	{ R_SMode = M_ADJPWRLVL; R_SPointer = S_PRESSPOWERLEVELNUMBER; sdispinit(); break; }
	}
}


/**** 数字按键的处理程式 ****/
void	__near	kd_number(void)
{
 // 将按键按值分配取得相当的值即0,1,2,3,4,5,6,7,8,9
 // 在这只是判断取值,所以for语句里面不必做任何事情
 // 因为下面要用到R_Temp[0],R_Temp[1],所以这里用R_Temp[3]用暂存
	for(R_Temp[0] = 0x00; R_CurKey != TBL_KyConv[R_Temp[0]] || R_Temp[0] >= 0x09; R_Temp[0]++) {  }

	switch(R_SMode)
	{
	case	M_ADJPWRLVL:
		{
			R_VPCLevel = R_Temp[0];
			R_SMode = M_ADJPWRLVL; R_SPointer = S_PRESSSTART; sdispinit();
			break;
		}

	case	M_RTC:
	case	M_DIGITCOOK:
	case	M_TMRSET:
	case	M_TMROK:
	case	M_CLKSET:
	case	M_CLKOK:
		{
			switch(R_SMode)
			{
			case	M_RTC:
			case	M_DIGITCOOK:
				{
					R_VPCLevel = 0x0A;
					R_SMode = M_DIGITCOOK; R_SPointer = S_PRESSSTARTORPOWERLEVEL;
					R_Temp[3] = R_Temp[0];
					R_Temp[0] = R_CookSecond; R_Temp[1] = R_CookMinute; n2shift();
					R_CookSecond = R_Temp[0]; R_CookMinute = R_Temp[1];
					break;
				}
			case	M_TMRSET:
			case	M_TMROK:
				{
					F_TimerEn = 0x01; R_SMode = M_TMROK; R_SPointer = S_PRESSSTART;
					R_Temp[3] = R_Temp[0];
					R_Temp[0] = R_TMRSecond; R_Temp[1] = R_TMRMinute; n2shift();
					R_TMRSecond = R_Temp[0]; R_TMRMinute = R_Temp[1];
					break;
				}
			case	M_CLKSET:
			case	M_CLKOK:
				{
					R_SMode = M_CLKOK; R_SPointer = S_PRESSSTART;
					R_Temp[3] = R_Temp[0];
					R_Temp[0] = R_CurMinute; R_Temp[1] = R_CurHour; n2shift();
					R_CurMinute = R_Temp[0]; R_CurHour = R_Temp[1];
					break;
				}
			}
			sdispinit();
			break;
		}

	case	M_HELP:
		{
			switch(R_Temp[0])
			{
			case	0x01:
				{
					R_SMode = M_HLPLOCKON;
					R_SPointer = S_TOSETLOCKONPRESSSTART; sdispinit();
					break;
				}
			case	0x02:
				{
					R_SMode = M_SNDONOFF;
					if (F_BuzEn == 0x00) R_SPointer = S_TOTURNONSOUNDPRESSSTART;
					else R_SPointer = S_TOTURNOFFSOUNDPRESSCLEAR;
					sdispinit();
					break;
				}
			case	0x03:	break;
			case	0x04:	break;
			}
		}
	case	M_TMRCLK:
		{
			switch(R_Temp[0])
			{
			case	0x01:
				{
					R_SMode = M_TMRSET;
					R_SPointer = S_ENTERTIME; sdispinit();
					break;
				}
			case	0x02:
				{
					R_SMode = M_CLKSET;
					R_SPointer = S_ENTERTIME; sdispinit();
					break;
				}
			}
		}

 // 这里又是一些比较独特的写法
 // 对于COMPUDEF来说,它没有break,所以运行完后就进入COMPUCOOK程序
	case	M_COMPUDEF:
	case	M_COMPUCOOK:
		{
			if (R_Temp[0] >= 0x07 || R_Temp[0] < 0x01) return;
			if (R_SMode == M_COMPUDEF) R_CompuPointer = 0x06; 
			R_CompuPointer += R_Temp[0] - 0x01;
			R_SMode = R_CompuPointer + M_FRESHROLLMUFFIN;
			R_SPointer = R_CompuPointer + S_FRESHROLLHOWMANYPRESSNUMBER;
			sdispinit();

⌨️ 快捷键说明

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