#include "keyboard.h"<br /><br />KeyboardObj::KeyboardObj(void)<br />{<br /> Init();<br />}<br /><br />void KeyboardObj::Init(void)<br />{<br /> for (int i = 0; i < sizeof(PressCount); i ++)<br /> {<br /> PressCount = 0;<br /> }<br /> Count = 0;<br />}<br /><br />void KeyboardObj::Exec(void)<br />{<br />typedef void (KeyboardObj::*FunctionPtr)(void);//函数指针<br />static const FunctionPtr KeyboardCommandTab[3][KeyboardNumbers] =<br />{<br /> {<br /> &KeyboardObj::Key01,<br /> &KeyboardObj::Key02,<br /> &KeyboardObj::Key03,<br /> &KeyboardObj::Key04,<br /> &KeyboardObj::Key05,<br /> &KeyboardObj::Key06,<br /> &KeyboardObj::Key07,<br /> &KeyboardObj::Key08<br /> },//放键表<br /> {<br /> &KeyboardObj::Key11,<br /> &KeyboardObj::Key12,<br /> &KeyboardObj::Key13,<br /> &KeyboardObj::Key14,<br /> &KeyboardObj::Key15,<br /> &KeyboardObj::Key16,<br /> &KeyboardObj::Key17,<br /> &KeyboardObj::Key18<br /> },//短压表<br /> {<br /> &KeyboardObj::Key21,<br /> &KeyboardObj::Key22,<br /> &KeyboardObj::Key23,<br /> &KeyboardObj::Key24,<br /> &KeyboardObj::Key25,<br /> &KeyboardObj::Key26,<br /> &KeyboardObj::Key27,<br /> &KeyboardObj::Key28<br /> } //长压表<br />};<br />unsigned char KeyCount;<br /> Count %= KeyboardNumbers;<br /> KeyCount = PressCount[Count];//取压键次数<br /> if (Scan() == Count + 1)//有键压下<br /> {<br /> KeyCount ++;//压键计数 <br /> if (KeyCount >= KeyboardPushTimes)<br /> {<br /> if (KeyCount == KeyboardPushTimes)//短压键<br /> {<br />// System.BeepOn();<br /> (::Keyboard.*KeyboardCommandTab[1][Count])();<br /> }<br /> if (KeyCount == KeyboardLongPushTimes)//长压键<br /> {<br /> (::Keyboard.*KeyboardCommandTab[2][Count])();<br /> KeyCount = KeyboardPushTimes; <br /> }<br /> }<br /> }<br /> else//无键压下<br /> {<br /> if (KeyCount > 0)//以前有键压下<br /> {<br /> if (KeyCount > KeyboardPushTimes) <br /> {<br /> KeyCount = KeyboardPushTimes; <br /> }<br /> else<br /> {<br /> KeyCount --;//放键计数<br /> if (KeyCount == 0)//键释放<br /> {<br /> System.BeepOff();<br /> (::Keyboard.*KeyboardCommandTab[0][Count])();<br /> } <br /> }<br /> }<br /> else<br /> {<br /> KeyCount = 0;<br /> }<br /> }<br /> PressCount[Count] = KeyCount;<br /> Count ++;<br /> Count %= KeyboardNumbers;<br />}<br /><br />unsigned char KeyboardObj::Scan(void)<br />{<br />volatile unsigned char KeyVal = 0;<br /> Count %= KeyboardNumbers;<br /> KeyVal = LedKeyRegs;<br /> switch (Count)<br /> {<br /> case 0:<br /> if (!(KeyVal & ConstKEY1))<br /> {<br /> KeyVal = Count + 1;<br /> }<br /> break;<br /> case 1:<br /> if (!(KeyVal & ConstKEY2))<br /> {<br /> KeyVal = Count + 1;<br /> }<br /> break;<br /> case 2:<br /> if (!(KeyVal & ConstKEY3))<br /> {<br /> KeyVal = Count + 1;<br /> }<br /> break;<br /> case 3:<br /> if (!(KeyVal & ConstKEY4))<br /> {<br /> KeyVal = Count + 1;<br /> }<br /> break;<br /> case 4:<br /> if (!(KeyVal & ConstKEY5))<br /> {<br /> KeyVal = Count + 1;<br /> }<br /> break;<br /> case 5:<br /> if (!(KeyVal & ConstKEY6))<br /> {<br /> KeyVal = Count + 1;<br /> }<br /> break;<br /> case 6:<br /> if (!(KeyVal & ConstKEY7))<br /> {<br /> KeyVal = Count + 1;<br /> }<br /> break;<br /> case 7:<br /> if (!(KeyVal & ConstKEY8))<br /> {<br /> KeyVal = Count + 1;<br /> }<br /> break;<br /> }<br /> return KeyVal;<br />}<br /><br />//KEY1放键事件处理<br />void KeyboardObj::Key01(void)<br />{<br /> Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY1键释放事件");<br />}<br /><br />//KEY2放键事件处理<br />void KeyboardObj::Key02(void)<br />{<br /> Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY2键释放事件");<br />}<br /><br />//KEY3放键事件处理<br />void KeyboardObj::Key03(void)<br />{<br /> Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY3键释放事件");<br />}<br /><br />//KEY4放键事件处理<br />void KeyboardObj::Key04(void)<br />{<br /> Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY4键释放事件");<br />}<br /><br />//KEY5放键事件处理<br />void KeyboardObj::Key05(void)<br />{<br /> Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY5键释放事件");<br />}<br /><br />//KEY6放键事件处理<br />void KeyboardObj::Key06(void)<br />{<br /> Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY6键释放事件");<br />}<br /><br />//KEY7放键事件处理<br />void KeyboardObj::Key07(void)<br />{<br /> Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY7键释放事件");<br />}<br /><br />//KEY8放键事件处理<br />void KeyboardObj::Key08(void)<br />{<br /> Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY8键释放事件");<br />}<br /><br />//KEY1压键事件处理<br />void KeyboardObj::Key11(void)<br />{<br />//特别注意菜农的组合键用法,可以看出"零耗时键盘"的非典之处<br /> if (PressCount[7] >= KeyboardPushTimes)//KEY8已先压下<br /> {<br /> Key8_Key1();//执行KEY8_KEY1组合键事件<br /> }<br /> else<br /> {<br />// System.BeepOn();<br /> Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY1键单击事件");<br /> }<br />}<br /><br />//KEY2压键事件处理<br />void KeyboardObj::Key12(void)<br />{<br /> System.BeepOn();<br /> Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY2键单击事件");<br />}<br /><br />//KEY3压键事件处理<br />void KeyboardObj::Key13(void)<br />{<br /> System.BeepOn();<br /> Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY3键单击事件");<br />}<br /><br />//KEY4压键事件处理<br />void KeyboardObj::Key14(void)<br />{<br /> System.BeepOn();<br /> Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY4键单击事件");<br />}<br /><br /><br />//KEY5压键事件处理<br />void KeyboardObj::Key15(void)<br />{<br /> System.BeepOn();<br /> Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY5键单击事件");<br />}<br /><br /><br />//KEY6压键事件处理<br />void KeyboardObj::Key16(void)<br />{<br /> System.BeepOn();<br /> Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY6键单击事件");<br />}<br /><br /><br />//KEY7压键事件处理<br />void KeyboardObj::Key17(void)<br />{<br /> System.BeepOn();<br /> Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY7键单击事件");<br />}<br /><br />//KEY8压键事件处理<br />void KeyboardObj::Key18(void)<br />{<br />//特别注意菜农的组合键用法,可以看出"零耗时键盘"的非典之处<br /> if (PressCount[0] >= KeyboardPushTimes)//KEY1已先压下<br /> {<br /> Key1_Key8();//执行KEY1_KEY8组合键事件<br /> }<br /> else<br /> {<br />// System.BeepOn();<br /> Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY8键单击事件");<br /> }<br />}<br /><br />//KEY1长压键事件处理<br />void KeyboardObj::Key21(void)<br />{<br /> System.BeepOn();<br /> Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY1键长压事件");<br />}<br /><br />//KEY2长压键事件处理<br />void KeyboardObj::Key22(void)<br />{<br /> System.BeepOn();<br /> Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY2键长压事件");<br />}<br /><br />//KEY3长压键事件处理<br />void KeyboardObj::Key23(void)<br />{<br /> System.BeepOn();<br /> Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY3键长压事件");<br />}<br /><br />//KEY4长压键事件处理<br />void KeyboardObj::Key24(void)<br />{<br /> System.BeepOn();<br /> Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY4键长压事件");<br />}<br /><br />//KEY5长压键事件处理<br />void KeyboardObj::Key25(void)<br />{<br /> System.BeepOn();<br /> Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY5键长压事件");<br />}<br /><br />//KEY6长压键事件处理<br />void KeyboardObj::Key26(void)<br />{<br /> System.BeepOn();<br /> Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY6键长压事件");<br />}<br /><br />//KEY7长压键事件处理<br />void KeyboardObj::Key27(void)<br />{<br /> System.BeepOn();<br /> Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY7键长压事件");<br />}<br /><br />//KEY8长压键事件处理<br />void KeyboardObj::Key28(void)<br />{<br /> System.BeepOn();<br /> Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY8键长压事件");<br />}<br /><br />//KEY1-KEY8组合键事件处理<br />void KeyboardObj::Key1_Key8(void)<br />{<br /> Lcd.SetDisplayPos(1, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY1KEY8键事件");<br />}<br /><br />//KEY8-KEY1组合键事件处理<br />void KeyboardObj::Key8_Key1(void)<br />{<br /> Lcd.SetDisplayPos(1, 0);//汉字定位到上行左端<br /> Lcd.Display("KEY8KEY1键事件");<br />}<br />
|