基于51单片机的计算器 v0.2 键盘驱动

By | 2014年8月22日

前面说到过,因为使用的开发板,所以按钮比较少

只有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类型就完了,何必那么麻烦呢?谁知道我之前怎么想的,但是我不想改了,就这样由他去吧

好了,键盘驱动到这里也就完成了

IMAG0096

发表评论

电子邮件地址不会被公开。 必填项已用*标注