📄 mrv.c
字号:
// 当没有按键的时候,虽然此标志为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 + -