矩阵按键识别的两种方法

描述

最近进度比较慢,马上要学习中断和计时器了。遇到一个很郁闷的问题,矩阵按键线反转法在proteus中用现成的模块就是实现不了,自己画的矩阵模块可以正常使用。不知道什么原因。

行列扫描---按键识别

计时器

原理比较简单:P2端口的低四位D0---D3置1,高四位D4-D7分别置0,顺序执行P2口的值

P2 端口的值 0xef 0xdf 0xbf 0x7f,利用按键底层驱动中Key_Scan()函数,得到返回键值

计时器

#define   KEYPAD P2
KEYPAD = 0xef;
		switch(Key_Scan())
		{
			case 1:
				LEDBuf[3]=1;break;
			case 2:
				LEDBuf[3]=2;break;
			case 3:
				LEDBuf[3]=3;break;
			case 4:
				LEDBuf[3]=4;break;
			default: break;
		
				
		}
		KEYPAD = 0xdf;
		switch(Key_Scan())
		{
			case 1:
				LEDBuf[3]=5;break;
			case 2:
				LEDBuf[3]=6;break;
			case 3:
				LEDBuf[3]=7;break;
			case 4:
				LEDBuf[3]=8;break;
			default: break;
		}
.........

线反转法--按键识别

1.首先,我们将所有行设置为逻辑0,将所有列设置为逻辑1。

P2口的低四位连接矩阵按键4行上,高四位连接矩阵按键4列上

2.每当我们按下一个按钮时,对应于该按钮的列和行都会短路,并使对应的列达到逻辑电平0。可以确定列号

3.同理我们将所有列设置为逻辑0,将所有行设置为逻辑1。按下一个按钮时,该按钮的列和行都会达到逻辑0.可以确定行号

4.把行号和列号通过逻辑与操作连接起来,和行列编码数组比较,得到按键返回值

计时器

计时器

计时器

计时器

计时器

#include "Key.h"

u8 Key_Scan()
{
	u8 temp,temp2,keycode,i;
	static u8 KeyNum = 0;//初始化显示0
	u8 KEYCODE[]=    //按键行列编码
	{0XEE,0XDE,0XBE,0X7E,
	0XED,0XDD,0XBD,0X7D,
	0XEB,0XDB,0XBB,0X7B,
	0XE7,0XD7,0XB7,0X77};
	
	KEYPORT = 0xf0;//4列置1,4行置0
	temp = KEYPORT ;//读P2口
	
	if(temp!=0xf0)//判断是否有按键按下
	{
		DelayXms(10);
		if(temp!=0xf0)//再次判断是否有按键按下
		{
			temp=KEYPORT & 0xf0;//取高4位,取列数
			KEYPORT = 0x0f;//低4位写1,高四位取0,线反转
			temp2 = KEYPORT & 0x0f;//取低四位,取行号	
			keycode =  temp | temp2;//高四位和第四位(行列)组合到一起
			for(i=0;i<16;i++)
			{
				if(keycode == KEYCODE[i])
				{
					KeyNum = i;
					return KeyNum;
				}
			}

		}
	
	}
	return KeyNum;
}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分