蓝桥杯按键处理解决办法


前瞻知识

1.如何生成stc的头文件
在这里插入图片描述
直接点保存文件到你建的目录下方就行了,就可以直接使用这个头文件了

2.按键知识

在这里插入图片描述
这个是按键的原理图
可以简单的理解成,按下按键的时候,按的那个按键为**“0”**
没按下的“1”就行了
所以我们写程序的时候根据这个逻辑写就行了
写矩阵的时候先行后列或者先列后行的判断是哪一个按键就行了

keyscan是什么

我们只用判断keyscan的值就可以判断是那个按键按下了,这个只是一个变量
你想叫啥就直接命名就行了,不一定要一模一样

列矩阵按键写法

sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;

char anjian()
{
	int keyscan;
	P3=0x0f;P42=P44=0;                 //注意这种写法,头文件是用stc生成的
	if(s4==0||s5==0||s6==0||s7==0)	  
	{
		delay(10);						//消抖
		P34=P35=P42=P44=1;             
		P44=0;						  //如果是P44这行按下了
		if(s4==0) keyscan=4;		  //如果是s4这个按键按下了
		else if(s5==0) keyscan=5;	  //如果是s5这个按键按下了
		else if(s6==0) keyscan=6;	  //如果是s6这个按键按下了
		else if(s7==0) keyscan=7;	  //如果是s7这个按键按下了
		P42=0;
		if(s4==0) keyscan=8;
		else if(s5==0) keyscan=9;
		else if(s6==0) keyscan=10;
		else if(s7==0) keyscan=11;
		P35=0;
		if(s4==0) keyscan=12;
		else if(s5==0) keyscan=13;
		else if(s6==0) keyscan=14;
		else if(s7==0) keyscan=15;
		P34=0;
		if(s4==0) keyscan=16;
		else if(s5==0) keyscan=17;
		else if(s6==0) keyscan=18;
		else if(s7==0) keyscan=19;
	}
		P3=0x0f;P42=P44=0;       		     
	  while(s4==0||s5==0||s6==0||s7==0);   //消抖
	  return keyscan;
}
	}


行矩阵按键写法

//这个和列矩阵差不多
sbit R1=P3^0;
sbit R2=P3^1;
sbit R3=P3^2;
sbit R4=P3^3;

sbit C4=P3^4;
sbit C3=P3^5;
sbit C2=P4^2;
sbit C1=P4^4;

char key_scan()
{
	int i;
	{
	R1=0;
	R2=R3=R4=1;
	C1=C2=C3=C4=1;
	if(C1==0)i=0;
	else if(C2==0)i=1;
	else if(C3==0)i=2;
	else if(C4==0)i=4;
	
	R2=0;
	R1=R3=R4=1;
	C1=C2=C3=C4=1;
	if(C1==0)i=5;
	else if(C2==0)i=6;
	else if(C3==0)i=7;
	else if(C4==0)i=8;
	
	R3=0;
	R2=R1=R4=1;
	C1=C2=C3=C4=1;
	if(C1==0)	i=8;
	else if(C2==0)i=9;
	else if(C3==0)i=10;
	else if(C4==0)i=11;
	
	R4=0;
	R2=R3=R1=1;
	C1=C2=C3=C4=1;
	if(C1==0)i=12;
	else if(C2==0)i=13;
	else if(C3==0)i=14;
	else if(C4==0)i=15;
}
return i;
}


矩阵键盘写法

void key_scan()
{
	R1=0;
	R2=R3=R4=1;
	C1=C2=C3=C4=1;
	if(C1==0)
	{
		while(C1==0);
		//自己添加的按键按下后的代码
	}
	else if(C2==0)
	{
		while(C2==0);
		//自己添加的按键按下后的代码
	}
	else if(C3==0)
	{
		while(C3==0);
		//自己添加的按键按下后的代码
	}
	else if(C4==0)
	{
		while(C4==0);
		//自己添加的按键按下后的代码
	}

	R2=0;
	R1=R3=R4=1;
	C1=C2=C3=C4=1;
	if(C1==0)
	{
		while(C1==0);
		//自己添加的按键按下后的代码
	}
	else if(C2==0)
	{
		while(C2==0);
		//自己添加的按键按下后的代码
	}
	else if(C3==0)
	{
		while(C3==0);
		//自己添加的按键按下后的代码
	}
	else if(C4==0)
	{
		while(C4==0);
		//自己添加的按键按下后的代码
	}
	
	R3=0;
	R2=R1=R4=1;
	C1=C2=C3=C4=1;
	if(C1==0)
	{
		while(C1==0);
		//自己添加的按键按下后的代码
	}
	else if(C2==0)
	{
		while(C2==0);
		//自己添加的按键按下后的代码
	}
	else if(C3==0)
	{
		while(C3==0);
		//自己添加的按键按下后的代码
	}
	else if(C4==0)
	{
		while(C4==0);
		//自己添加的按键按下后的代码
	}
	
	R4=0;
	R2=R3=R1=1;
	C1=C2=C3=C4=1;
	if(C1==0)
	{
		while(C1==0);
		//自己添加的按键按下后的代码
	}
	else if(C2==0)
	{
		while(C2==0);
		//自己添加的按键按下后的代码
	}
	else if(C3==0)
	{
		while(C3==0);
		//自己添加的按键按下后的代码
	}
	else if(C4==0)
	{
		while(C4==0);
		//自己添加的按键按下后的代码
	}
}


独立按键写法1

比较推荐这个写法

sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;

char anjian()
{
	char keyanjian;
	if(s4==0||s5==0||s6==0||s7==0)
	{
		delay(10);
		if(s4==0)keyanjian=4;
		else if (s5==0)keyanjian=5;
		else if (s6==0)keyanjian=6;
		else if (s7==0)keyanjian=7;
	}while(s4==0||s5==0||s6==0||s7==0);
	return keyanjian;
}


独立按键写法2

sbit s6=P3^1;

void anjian()
{
	if(s6 == 0)
	{
	 delay(100);
	 if(s6==0)
	  {
	    EA=~EA;
	    while(s6 == 0);
	    {
		  //自己添加的按键按下后的代码
	    }
	  }
}
	
//后面以此类推


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值