突然发现IceAge的键盘程序是糊弄人的!根本不能运行,只能算个设计参考,关键地方不写。拿出来唬人呢。根本不是他写的!
他留下一堆垃圾不管了,我倒有个建议。我和楼上古道热肠版主一起把它修改好,其实此程序设计思想对于进一步学习C语言挺好,(可惜不是他写的,他也不会修改。)(还有最终代码可能要比其他设计方法长,不愿意这样设计,把简单的事情复杂化,故意让学生看不懂。)但是不能用。连意思概要都算不上,因为程序连状态机的框架都没有。
如果我另外那贴上抄的国际教材上的范例程序不算数,那么看出并修改好IceAge的垃圾错误算不算溜了一圈?如果你认为不算?那我只好另写一个,当然还是参考教本上的,我不可能比书上还写得好。(别人思考过的问题我没必要重复思考。)IceAge的程序你来改,我写新的。都写完善,提供2个给学友作为键盘标准模块好不好?不过,中国人无论怎么做,都不如我已经贴出的那个英文键盘状态机简洁。那个才应该是设计应用典范。
2天?3天?反正IceAge 也不会改,咱们没什么着急的,慢慢来吧。你上面的程序是自己思考出来的?那不如看看书上怎么设计的。浪费这时间个人思考,没什么必要,书上都有。一天就设计出来了,自己想2星期?还不如用这时间来给自己多充电。
48楼IceAge: 一个键盘处理的例子,看看state machine 的威力
假设 mcu 每20 ms 中断一次,每次执行 keyboard().
void keyboard() { (*functions[state])();}
FUNTION_POINTER functions[] = { state0, state1, state2, ... stateN }; struct StructKey { bool pressed; int value; } key;
void state0() { key.pressed = false; state++; } void state1() { if (ScanKeyboard() != 0) state++; } //如果有健按下则去下一状态,利用20ms 间隔去抖。
void state2() { int temp = ScanKeyboard(); if (temp != 0) { key.pressed = true; //有健按下 key.value = temp; state++; } else state--; //回 state1 }
void state3() { if (ScanKeyboard() == 0) state++; } //waiting for key releasing.
void state4() { if (ScanKeyboard() != 0) state--; else state = 0; }
这回糗大了。 |