📄 mrv.c
字号:
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 + -