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

📄 mrv.c

📁 一款C语言编写的小家电程序
💻 C
📖 第 1 页 / 共 5 页
字号:
			break;
		}

	case	M_FRESHROLLMUFFIN:
	case	M_FROZENROLLMUFFIN:
	case	M_HOTCEREAL:
	case	M_TURKEYBREAST:
	case	M_PORKLOIN:
	case	M_MEATLOAF:
	case	M_COMPUGROUNDMEAT:
	case	M_STEAKCHOPSORFISH:
	case	M_CHICKENPIECES:
	case	M_ROAST:
	case	M_CASSEROLE:
	case	M_SOUP:
	case	M_FRMTIME:
		{
			computime();
			break;
		}
	}
}


void	__near	computime(void)
{
	R_SMode = M_FRMTIME;
	R_Temp[1] = 0x00; R_Temp[2] = 0x00;
	for( ; R_CompuPointer != R_Temp[1]; ) { if (TBL_CompuLB[R_Temp[2]] == 0xff) R_Temp[1]++; }
	R_Temp[2]++; R_Temp[3] = TBL_CompuLB[R_Temp[2]];

	switch(R_Temp[3])
	{
	case	0x00:
		{
			R_FenShu = R_Temp[0];
			R_LowWeight = TBL_CompuLB[R_Temp[2]+0x01]; R_HighWeight = TBL_CompuLB[R_Temp[2]+0x02];
			if ( R_Temp[0] < R_LowWeight || R_Temp[0] > R_HighWeight) return;
			R_CalBuf = R_FenShu * TBL_CompuLB[R_Temp[2]+0x03] + TBL_CompuLB[R_Temp[2]+0x04] + TBL_CompuLB[R_Temp[2]+0x05] * 0x10;
			R_CookSecond = R_CalBuf%0x3c; R_CookMinute = R_CalBuf/0x3c;
			R_VPCLevel = TBL_CompuLB[R_Temp[2]+0x06];
			break;
		}
	case	0x01:
		{
			R_FenShu = R_Temp[0];
			R_LowWeight = TBL_CompuLB[R_Temp[2]+0x01]; R_HighWeight = TBL_CompuLB[R_Temp[2]+0x02];
			break;
		}
	case	0x02:	break;
	case	0x03:
		{
			R_FenShu = R_Temp[0];
			R_LowWeight = TBL_CompuLB[R_Temp[2]+0x01]; R_HighWeight = TBL_CompuLB[R_Temp[2]+0x0d];
			break;
		}
	}
	beep1();
}


/**** 转盘按键的处理程式 ****/
 /*** 原来为在一些特定模式下,不处理 ***/
 /*** 如果在显示别的东西的情况下进入,备份原来的显示语句,否则则不更改备份 ***/
void	__near	kd_turntableonoff(void)
{
	if (F_DSBufEn == 0x00) { F_DSBufEn = 0x01; R_SPBuf = R_SPointer; }

	if (F_TurnStatus == 0x00) { F_TurnStatus = 0x01; R_SPointer = S_TURNTABLEON; }
	else { F_TurnStatus = 0x00; R_SPointer = S_TURNTABLEOFF; }
	sdispinit();
}


/**** 对MINUTEPLUS键的处理 ****/
 /*** 在RTC或快速烹调模式1秒内按此键,进入快速烹调模式 ***/
void	__near	kd_minuteplus(void)
{
	if (R_SMode != M_RTC && R_SMode != M_QUICK) return;

	beep1(); R_SMode = M_QUICK; R_VPCLevel = 0x0a; R_MCCnt = 0x10;

	if (R_CookMinute == 0x00 && R_CookSecond == 0x00)	{ R_CookSecond = 0x30; }
	else if (R_CookMinute == 0x00 && R_CookSecond == 0x30)	{ R_CookSecond = 0x00; R_CookMinute = 0x01; }
	else if (R_CookMinute < 0x09)	R_CookMinute++;
	else if (R_CookMinute >= 0x09)	R_CookMinute = 0x10;
}


/**** 对STOP/CLEAR键的处理 ****/
 /*** 在任何时候按此键,进入RTC模式 ***/
 /*** 以下专门用于烹调过程中的资料,在烹调过程过后全部清除 ***/
void	__near	kd_stopclear(void)
{
	if (R_SMode != M_HLPLOCKOFF && F_LockOn == 0x01) return;
	if (R_SMode == M_HLPLOCKOFF)
	{
		R_SMode = M_RTC; F_LockOn = 0x00;
		F_DSBufEn = 0x01; R_SPointer = S_LOCKOFF; sdispinit();
	}

	switch(R_SMode)
	{
	case	M_SNDONOFF:
		{
			if (F_BuzEn == 0x01)
			{
				R_SMode = M_RTC; F_BuzEn = 0x00;
				F_DSBufEn = 0x01; R_SPointer = S_SOUNDOFF; sdispinit();
			}
			break;
		}
	}

	beep1();
	cookinfclr();
}


/**** 对LIGHT的处理 ****/
 /*** 这个键应在任何时候都可以处理 ***/
 /*** 次序是:全部关掉,取高亮度,低亮度 ***/
void	__near	kd_lighthilo(void)
{
	beep1();
	R_LightStatus++;
	if (R_LightStatus >= 0x03) R_LightStatus = 0x00;
	switch(R_LightStatus)
	{
	case	0x00:	PIN_LOHILIGHTRL = 0x01; PIN_HILIGHTRL = 0x01;	break;
	case	0x01:	PIN_LOHILIGHTRL = 0x00; PIN_HILIGHTRL = 0x00;	break;
	case	0x02:	PIN_LOHILIGHTRL = 0x00; PIN_HILIGHTRL = 0x01;	break;
	}
}


/**** 对风速的处理 ****/
 /*** 这个键应在任何时候都可以处理 ***/
 /*** 次序是:无风,强风,弱风,无风 ***/
void	__near	kd_fanhilo(void)
{
	beep1();
	R_FanStatus++;
	if (R_FanStatus >= 0x03) R_FanStatus = 0x00;
	switch(R_FanStatus)
	{
	case	0x00:	PIN_LOWFANRL = 0x01; PIN_HIFANRL = 0x01;	break;
	case	0x01:	PIN_LOWFANRL = 0x00; PIN_HIFANRL = 0x00;	break;
	case	0x02:	PIN_LOWFANRL = 0x00; PIN_HIFANRL = 0x01;	break;
	}
}


/**** 键盘按键响应的共同处理 ****/
 /*** 每次按键盘后,都有一些共同的处理,可以放在具体键盘处理前处理 ***/
 /*** 但是必须要注意的就是,不能改变A值,因为A值代表具体按键 ***/
void	__near	kycomf(void)
{
	R_MCCnt = MC00;				// 每次按键后清掉系统时间计数
}


/**** 持续按键的处理 ****/
void	__near	kyhold(void)
{
 // 检查是否是处于按住键要处理情况,如果为0,则退出此模块
	if (R_KHType == KHDNO)	return;

 // 此时不为0,表示有无论哪一种的可以按住键的按键在被操作
 // 因为不可能同时有按键被按下,所以只可能有一个按键,所以用一组时间存储单元就已足够
	R_CntKHF--;
	if (R_CntKHF == 0x00)			// 这时时间已有够,所以要处理按住键足够时间的处理方式
	{
		switch(R_KHType)
		{
		case	KHDONCE:	{ testpin(); R_KHType = KHDNO;	break; }
		case	KHDMORE:	{ testpin(); R_CntKHF = T500MS;	break; }
		case	KHDCOMBIN:
			{
				switch(R_CurKey)
				{
				case	KY_K11:	break;
				case	KY_K12:	break;
				case	KY_COMBIN:	break;

				default:	break;
				}
				break;
			}

		default:	break;
		}
	}

 // 这时时间还未到,所以要判断按键是否有没有松开
 // 如果松开也要处理
 // 这时的处理用一个简单的处理,也即判断按键是否为0,如果没有按键表示松开,如果有按键表示仍按住键
 // 这个处理有一个问题:
 // 但这种处理方式有一个问题:当客户按住键不放的时候,如果再按第二个键,然后松开第一个键,这时也不会认为已松开过
 // 因此会当成按住不放处理
 // 这时再加了一个处理比较特别:就是不判断CURKEY的值,而是判断KEYBUF的值
 // 实际上,KEYBUF的值是CURKEY的值的前一次,也就是说再下一次按键扫描就会更前CURKEY
 // 但正因为这个关系,所以在KEYBUF已变的时候,我还可以利用CURKEY的值,因为它还没有变,也即最后一次没有去抖动
 // 但这已没有关系
	else
	{
		if (R_KeyBuf != NOKEY && R_KHType != KHDCOMBIN)	return;	// 如果仍未松开按键,退出

		switch(R_KHType)		// 这里已松开按键,这时要根据按键的类型来处理
		{
		case	KHDONCE:	{ testpin(); R_KHType = KHDNO;	break; }
		case	KHDMORE:	{ testpin(); R_KHType = KHDNO;	break; }
		case	KHDCOMBIN:
			{
				if (R_CurKey == KY_COMBIN) { testpin(); R_KHType = KHDNO; return; }
				else if (R_KeyBuf != NOKEY) return;
				switch(R_CurKey)
				{
				case	KY_K11:	break;
				case	KY_K12:	break;
				case	KY_COMBIN:	break;

				default:	break;
				}
				break;
			}

		default:	break;
		}
	}
}


/**** 实时时钟驱动程序 ****/
 /*** 格式为24小时制,60分60秒 ***/
 /*** 这里采用1位,这样能充分利用CPU资源,用两位未必简单 ***/
void	__near	rtc(void)
{
 // 当处于实时时钟状态及时钟使能情况下,方显示时钟,其它情况退出显示状态
 // 有时候如果未启动时钟使能,即使在时钟状态也不显示时钟及运行时钟,也即立即退出
	if (R_SMode != M_RTC || F_RTCEn == 0x00) return;

 // 仅仅实际可以用实际的存储单元作运算,但基于以下考虑,还是用暂存单元
 // 第一为了运算的统一安排,而且暂存器也很安全,第二为了防止引起不必要的干拢
	R_Temp[0] = R_CurSecond; n1add(); R_CurSecond = R_Temp[0]; if (R_CurSecond < MAXSECOND) return;

 // 从以上运算来看,清秒实在是没有必要的,但是为了安全考虑,清一下也是很好的
 // 因为有可有由于某种干拢,使得秒针值变得大于60,通常这种干拢不会出现,但是小心最好
 // 如果没有清0,则将错误很长时间,如果已清零,则无所谓
	R_CurSecond = 0x00;
	R_Temp[0] = R_CurMinute; n1add(); R_CurMinute = R_Temp[0]; if (R_CurMinute < MAXMINUTE) return;

 // 分钟小时都如同上面所述
 // 小时通常有两制式,一种是12小时制,一种是24小时制,具体如下:
 // 12小时制:值域从01:00到12:59,通常来说,采用12小时制的时候,时钟高位如为0则不显示12:XX时已为AM,PM转向
 // 24小时制:值域从00:00到23:59,通常来说,采用24小时制的时候,时钟高位都需要显示,此时没有AM,PM之说
	R_CurMinute = 0x00;
	R_Temp[0] = R_CurHour; n1add(); R_CurHour = R_Temp[0]; if (R_CurHour < MAXHOUR24) return;

 // 此程序采用的是24小时制式,所以最大值为23小时XX分钟
	R_CurHour = 0x00;
}


/**** 门状态检测 ****/
 /*** 如果门打开,任何烹调过程都停止,关断诸如微波,热流,烧烤等等的输出 ***/
void	__near	doorcheck(void)
{
	if (PIN_DOOR == 0x00) { if (F_DorPrev == 0x00) { F_DorPrev = 0x01; F_DorDeb = 0x00; return; } }
	else { if (F_DorPrev != 0x00) { F_DorPrev = 0x00; F_DorDeb = 0x00; return; } }

	if (F_DorDeb == 0x00) { F_DorDeb = 0x01; return; }

	if (F_DorPrev == 0x00) F_DoorStatus = 0x00;
	else F_DoorStatus = 0x01;
}


/**** 各种模式的自动转换 ****/
 /*** 放在62.5毫秒的事件里,按时间处理 ***/
 /*** 如果是在待机模式或是实时时钟模式,则不作处理,退出 ***/
 /*** 如果是大于某个时间之后,也不再做任何处理,直接退出 ***/
 /*** 如果是在其它的模式,则在一定的时间以后,退回到待机模式或实时时钟模式 ***/
 /*** 所以在这里的处理也都需要变成"时间点"的处理,而不能当成一个大于或等于的情况来处理 ***/

 /*** 系统内部所用的一个时钟,快慢时钟都会启动,专门用于做一个系统本身可能用的时间参考 ***/
 /*** 以前是采用的减法,现改为采用加法: ***/
 /*** 在每次按键后,清为000H,然后不论快慢时钟加01H,依时间递增,因程序在快慢时钟都要处理,所以要尽可能短 ***/
void	__near	modeconv(void)
{
	if (R_SMode == M_RTC || R_SMode == M_STANDBY) return;
	if (R_MCCnt >= MC8S) { R_MCCnt = MC8S; return; }
	
	if (R_MCCnt == MC5S) R_SMode = M_STANDBY;
	R_MCCnt++;
}


/**** Bep的设置方法 ****/
 /*** 短BEP一声 ***/
void	__near	beep1(void)
{
	R_BPType = 0x01; R_BPCounter = 0x08; R_BPOn = 0x08; R_BPOff = 0x00;
}

 /*** 长BEP四声 ***/
void	__near	beep4l(void)
{
	R_BPType = 0x07; R_BPCounter = 0x10; R_BPOn = 0x10; R_BPOff = 0x10;
}


/**** Beep声的驱动程式 ****/
 /*** 

⌨️ 快捷键说明

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