?????????????? ????????????
?????????????????????????????????????????
?????????ι?????????????????????????з???????????????????????????????????????????????????ǹ??????????????????????????????Ч?????????????κ?????????????????棬???C???????????????
????????????????Щ?????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????а?????????????hoho????????????????????齫???????????????????????????????飬?У????????????????
?????????C?????????????C?????????????????????????????????MCS-51??AVR??PIC????????ARM??????????????????????????????????????????ù???Ч?????????
???????????????????????????????????ɡ?????????AVR??MEGA8????????????????????????????????AVR???????????51?????51?????????о?????????????????м???????????????
????????
unsigned char Trg;
unsigned char Cont;
void KeyRead( void )
{
unsigned char ReadData = PINB^0xff; // 1
Trg = ReadData & (ReadData ^ Cont); // 2
Cont = ReadData; // 3
}
????????????????????о????????????????????????????????????????????
?????????????
Trg??triger?? ?????????????Cont??continue???????????????????
1????PORTB????????????????????ReadData ??????????汣????????
2????1??????????????????????λ?????????????????????????C????????????Trg??????????????????????????á?
3????2????????????????????
????????????“????????????????”??о??????????????????????????????????????????????????????????????????????ɡ?
????????????????????AVR??????????????????????????????????????????????????衣???????????а????????????????1???????????????????????0?????????????弸????????????????????????
??1?? ??а????????
????0xff??ReadData???????????????????????? 0x00 ???
Trg = ReadData & (ReadData ^ Cont); ??????????Cont????0?????????????????ReadData?0?????????κ???“????”?????????0???
Cont = ReadData; ????Cont ??????????ReadData???0??
????????
ReadData ?? 0??
Trg ?? 0??
Cont ?? 0??
??2?? ?????PB0????????
????????0xfe??ReadData???????????????????????? 0x01 ???
Trg = ReadData & (ReadData ^ Cont); ???????????????????Cont????ε???????0????????????????????????? Trg = 0x01 & (0x01^0x00) = 0x01
Cont = ReadData = 0x01??
????????
ReadData ?? 0x01??
Trg ?? 0x01??Trg?????????????λ????1??????????0
Cont ?? 0x01??
??3?? PB0?????????????????????
????????0xfe??ReadData????????????? 0x01 ???
Trg = ReadData & (ReadData ^ Cont); ????????????????????Cont????ε???????0x01???????????????? Trg = 0x01 & (0x01^0x01) = 0x00
Cont = ReadData = 0x01??
????????
ReadData ?? 0x01??
Trg ?? 0x00??
Cont ?? 0x01??
??????????????????????MCU???????????20ms??????????????????????????????е?????????????????????
ReadData ?? 0x01???????????????????????
Trg ?? ReadData & (ReadData ^ Cont) ?? 0x01 & (0x01 ^ 0x01) = 0 ???????????????????Trg????? 0 ??????
Cont ?? 0x01?????????????????????????0x01????
??4?? ????????????
????????0xff??ReadData????????????? 0x00 ???
Trg = ReadData & (ReadData ^ Cont) = 0x00 & (0x00^0x01) = 0x00
Cont = ReadData = 0x00??
????????
ReadData ?? 0x00??
Trg ?? 0x00??
Cont ?? 0x00??
????????????????????????????а????????????
??????????????????У???????????????
Trg ??????????????????????????????а?????????????1??0???????????Trg??????????λ??????????????????PB0??Trg????0x01??????????????PB7????????Trg ????????? 0x80 ???????????????У???????????Trg ?????????????????Σ???????????????????????????????????????????????????????У????????????????ж?????????????????Cont??????????????????PB0???????????Cont?????? 0x01????????PB7???????????Cont???????0x80????????????
?????????????????????????????????????????????ò?????????
????????????????????????????ú????????濴????
????????δ????????????
????PB0?????????????????????????beep??????????????????????????????????????????????????
#define KEY_BEEP 0x01
void KeyProc(void)
{
if (Trg & KEY_BEEP) // ??????????KEY_BEEP
{
Beep(); // ??з?????????????
}
}
???????????г??????????????Trg??????????????????????????Ρ????????°????????Trg & KEY_BEEP ?“??”?????????????Σ????????????????????????????????????У?hoho??????
????????????????????????????????????
???2?????????????
????о??????????Щ??????磺??????????????????й???A?????????2??????????й???B????????????3?????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????
???????????????????????????PB0????????????????л?????PB1??????????????????????????????????????????????????
#define KEY_MODE 0x01 // ??????
#define KEY_PLUS 0x02 // ??
void KeyProc(void)
{
if (Trg & KEY_MODE) // ??????????KEY_MODE?????????????????????
{ //?????????е???ε?? ?? ??????????????
Mode++; // ?????????1???????????????????????????????
// ??е??κδ???
}
if (Cont & KEY_PLUS) // ???“??”?????????????
{
cnt_plus++; // ???
if (cnt_plus > 100) // 20ms*100 = 2S ??????
{
Func(); // ?????????е????
}
}
}
???????λ?о???Σ?????????????????????????????????????
???3??????????????????????????
??????????????????????????????????????????????????????????Щ??????????????ǹ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????а?????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????Cont??OK??????????????????????????????????????????????????????????е??????????????????????????2???????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????? ??????ж??а????????????????????????20ms???????????????ζ??????????????????????????????????????????????????????????
???????????????delay??20????????????????????????????????????????????????????е???????ú??????????????????????????????????????????????????????????????????????“????”???????????????????????????????????????????????????????????????????У????????????????????????????????????????????????????
????????????????????
volatile unsigned char Intrcnt;
void InterruptHandle() // ?ж???????
{
Intrcnt++; // 1ms ?ж?1?Σ????
}
void main(void)
{
SysInit();
while(1) // ?20ms ?????δ????
{
KeyRead(); // ????????????????
KeyProc();
Func1();
Funt2();
…
…
while(1)
{
if (Intrcnt>20) // ?????????20ms???
{
Intrcnt="0";
break; // ?????????
}
}
}
}
ò??????????????????????????????????????????????????????????????????????????????????20ms???????????KeyRead()????????????Trg ?? Cont ?????????????????????????????
???????????????????????????????á?????????????????????????????????????????????????????????????????????????????ο????????????
?????????????????????????????????????????????????????????????绹???Щ??????
????ж????????????Trg ??Cont???0 ?????????????

????admin ?????????2018-05-18