独立按键,多种方案

写的不知道好不好,有什么不对的地方还请指出,谢了。

对于独立按键,方法1是多次判断。方法2是利用了switch语句。

对于矩阵按键,直接就采用了switch语句了。

哪个计算器没有设计,等待后面闲着在整吧。

在主函数要是用按键,需要在配合循环语句。

//独立按键 S2		S3		 S4			S5
//分别对应 P30/TX	P31/RX	 P32/INTO	P33/INT1
#include"key.h"
#include "delay.h"

//独立按键,函数返回值为2、3、4、5分别对应按键2、按键3、按键4、按键5
unsigned char key(void)//返回2则按键2被按下,其他按键同理,本函数只循环扫描一次
{
	key_S2 = 1;
	key_S3 = 1;
	key_S4 = 1;
	key_S5 = 1;

	if (!key_S2)
	{
		delay_ms(10);//防抖滤波延迟
		if (!key_S2)
		{
			while (!key_S2);//按键松手检测
			return	2;
		}
	}
	if (!key_S3)
	{
		delay_ms(10);//防抖滤波延迟
		if (!key_S3)
		{
			while (!key_S3);//按键松手检测
			return 3;
		}
	}
	if (!key_S4)
	{
		delay_ms(10);//防抖滤波延迟
		if (!key_S4)
		{
			while (!key_S4);//按键松手检测
			return 4;
		}
	}
	if (!key_S5)
	{
		delay_ms(10);//防抖滤波延迟
		if (!key_S5)
		{
			while (!key_S5);//按键松手检测
			return 5;
		}
	}
}

//独立按键使用switch语句
unsigned char key2345(void) //函数返回值为2、3、4、5分别对应按键2、按键3、按键4、按键5,本函数只循环一次
{
	key_all = 0xff;
	if ((key_all&0x0f) != 0x0f)	//&与运算符没有!=不等于高  故需要加()括号
	{
		delay_ms(10);
		if ((key_all & 0x0f) != 0x0f)//忘记加{号了  哎
		{
			switch (key_all & 0x0f)
			{
			case 0x0e:while ((key_all & 0x0f) != 0x0f);return 2;	//while在这里进行松手检测  炒while松手检测忘记加;号了
			case 0x0d:while ((key_all & 0x0f) != 0x0f);return 3;	//while在这里进行松手检测
			case 0x0b:while ((key_all & 0x0f) != 0x0f);return 4;	//while在这里进行松手检测
			case 0x07:while ((key_all & 0x0f) != 0x0f);return 5;	//while在这里进行松手检测
			}
		}
	}
}

//矩阵按键真值表4行*4列计算器使用
unsigned char code key_true1[4][4] = { '+','-','*','/',
								   7,  8,  9,  0,
								   4,  5,  6,  0,
								   1,  2,  3, '=' };
//矩阵按键真值表4行*4列判断是哪个按键被按下
unsigned char code key_true2[4][4] = { 
									1,	2,	3,	4,
									5,  6,  7,  8,
									9,  10,	11,	12,
									13, 14,	15,	16
													};

unsigned char key16(void)//判断16个按键中哪个被按下,本函数只循环一次  若没有按键按下此函数会自动返回0
{
	unsigned char x = 0;
	unsigned char y = 0;
	key_all = 0x0f;
	if(key_all!=0x0f)
	{
		delay_ms(10);
		if (key_all!=0x0f)
		{
			switch (key_all)
			{
			case 0x0e:x = 0;break;
			case 0x0d:x = 1;break;
			case 0x0b:x = 2;break;
			case 0x07:x = 3;break;
			}
			key_all = 0xf0;
			switch (key_all)
			{
			case 0xe0:y = 0;break;
			case 0xd0:y = 1;break;
			case 0xb0:y = 2;break;
			case 0x70:y = 3;break;
			}
		while (key_all != 0xf0);//松手检测,检测上次赋值0xf0
		return key_true2[x][y]; //在这里函数返回1/2/3/..../16中按下的哪个按键值
	  }
  }
}
#ifndef __KEY_H__
#define __KEY_H__
#include <reg52.h>
//独立按键 
sbit key_S2 = P3^0;
sbit key_S3 = P3^1;
sbit key_S4 = P3^2;
sbit key_S5 = P3^3;

#define key_all P3

//按键占用P3口
unsigned char key(void);//返回2则按键2被按下,其他按键同理,本函数只循环扫描一次
unsigned char key2345(void); //函数返回值为2、3、4、5分别对应按键2、按键3、按键4、按键5,本函数只循环一次
unsigned char key16(void);//判断16个按键中哪个被按下,本函数只循环一次   炒while松手检测忘记加;号了

extern unsigned char code key_true2[4][4];//矩阵按键真值表4行*4列判断是哪个按键被按下
extern unsigned char code key_true1[4][4];//矩阵按键真值表4行*4列计算器使用

#endif // !__KEY_H__

猜你喜欢

转载自blog.csdn.net/qq_44829055/article/details/107428731