前面说到过,因为使用的开发板,所以按钮比较少
只有16个矩阵键盘和4个独立键盘
但是我们的计算器需要有0~9十个数字,+-*/= 平方开方sin、cos……
直接使用这些键盘肯定不行
那么我们可以使用组合键,就像计算机中的Ctrl+c之类的,如此一来,可供选择的按键数量就超过了100,绝对够用
下面我们就来谈谈键盘驱动的实现
代码在此 点我下载
为了让按键的判断容易一点(直接判断io口的话处理组合键就比较麻烦了),我想了一个办法:用三个char类型保存键盘的信息,每一位就是扫描的时候对应键的状态,这样,不管是组合键还是单独的按键都有一个对应的数字(有点像windows上的虚拟键盘码)在判断按键的时候用一个switch就行了
check函数负责检查并返回按键状态
但是由于单片机的运行速度很快,我们按键的时候也几乎不可能在同一时间按下两个键。假设有AB两个按键,当你同时按下AB时,在单片机看来,你可能先按下了A,然后B也按下形成组合键AB,然后A弹起,B还是按下,最后B才弹起,这样就会产生三个按键。为了避免这个情况出现,我想了一个死办法
char getkey() { char key=check(),key1; if(key!=-1) //有一个键按下 { while(key==(key1=check())); //这个键发生变化 if(key1==-1) //按键弹起 return key; while(-1!=check()) ; //直到按键弹起 return key1; } return -1; }
当检测到一个键按下,不立即返回这个键,而是等待键盘状态发生变化时进行判断
如果变化后是一个按键,那么等到按键全部弹起再返回新键,否则就返回之前获取的按键。如此一来就解决了组合键的问题
还有一点要说一下,原本键盘状态信息是用三个char保存的,最后判断就需要移位,后来在某论坛上看到某高人的回复:“用共用体呀”,顿时豁然开朗然后就改成了共用体。
再后来,我才意识到其实直接用一个long类型就完了,何必那么麻烦呢?谁知道我之前怎么想的,但是我不想改了,就这样由他去吧
好了,键盘驱动到这里也就完成了