在DSP2812上的"零耗时键盘"演示C++程序
/*-----------------------------------------------------<br /> 在DSP2812上的"零耗时键盘"演示C++程序<br />本演示程序在Study-2812增强版上通过运行测试<br /><br />菜农HotPower@126.com 2008.4.25 于西安大雁塔菜地<br />------------------------------------------------------*/<br />#include "main.h"<br /><br />class SystemObj System;<br />class TimerObj Timer;<br />class LcdObj Lcd;<br />class KeyboardObj Keyboard;<br /><br />int main(void)<br />{<br /> Lcd.SetDisplayPos(0, 0);//汉字定位到上行左端<br /> Lcd.Display("汉字显示演示12");<br /> Lcd.SetDisplayPos(1, 0);//汉字定位到上行左端<br /> Lcd.Display("汉字显示演示34");<br /> Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端<br /> Lcd.Display("汉字显示演示56");<br /> Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端<br /> Lcd.Display("汉字显示演示78");<br /><br /> EALLOW;<br />// PieCtrlRegs.PIEACK.all = 0xFFFF;//PIEACK_GROUP1;<br /> PieCtrlRegs.PIEACK.bit.ACK7 = 1;<br /> EDIS;<br /> <br /> EINT; // Enable Global interrupt INTM<br /> ERTM; // Enable Global realtime interrupt DBGM<br /> for(;;)<br /> {<br /> asm(" nop");<br /> // Reset the watchdog counter<br /> KickDog();<br /> }<br />}<br /><br /><br /> 相关链接:<a href='http://blog.**/hotpower/109373/message.aspx#'>http://blog.**/hotpower/109373/message.aspx#</a>keyboard.cpp
#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 =<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;//取压键次数<br /> if (Scan() == Count + 1)//有键压下<br /> {<br /> KeyCount ++;//压键计数 <br /> if (KeyCount >= KeyboardPushTimes)<br /> {<br /> if (KeyCount == KeyboardPushTimes)//短压键<br /> {<br />// System.BeepOn();<br /> (::Keyboard.*KeyboardCommandTab)();<br /> }<br /> if (KeyCount == KeyboardLongPushTimes)//长压键<br /> {<br /> (::Keyboard.*KeyboardCommandTab)();<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)();<br /> } <br /> }<br /> }<br /> else<br /> {<br /> KeyCount = 0;<br /> }<br /> }<br /> PressCount = 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 >= 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 >= 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 />有没有流程图,思路也要看呀
哈哈,学习。。。。。
这么好的帖子也不穿个裤子?
哈哈~~~山野村夫怎敢穿裤子进城???~~~
大叔又发威了
好久没过来看,支持一下顶 大叔
顶 大叔请问大叔以后会倒塌arm不?
请问大叔以后会倒塌arm不?哈哈~~对ARM的感冒已过~~~
实际学什么都一样----只要**就会成功~~~原创发裤子……
哈哈~~~夏天来了,穿裤子太热~~~
大叔的努力精神让人佩服
re
大叔又用dsp,又用c++。。。。。。<br />大叔应该改天出个研究c++,c在dsp上的效率分析。<br />我认为只是启动代码可能不如C,运行起来完全一样没什么区别
我倾向于用c,呵呵
如果c++做到c的效率,那就简化成c了,反过来,我也同意c++很适合做系统,可是dsp我觉得不能称之为系统,最多就是dsp模块哈哈~~~在AVR/ARM/DSP5402上用习惯了~~~
我的看法
如果是控制,就没必要用dsp。<br />如果是信号处理,那就得考虑效率了。c++不知道合适不合适<br />DSP做为控制确实没必要~~~信号处理估计C都慢~~~
是啊,我用DSP都用的是汇编,C C++都来不及的...
页:
[1]
2