蓝桥杯综合实训平台 使用AIP15F2K61S2/STC89C52 控制矩阵键盘

矩阵键盘原理图如图

键盘原理图,通过跳线帽J5选择模式

J5的2,3相连的时候为独立键盘模式,1,2相连的时候为矩阵键盘模式

PS:上图为AIP15F2K61S2 为芯片,对于STC89C52 ,P42和P44变为P36和P37即可

键盘对应P3^0,P3^1,P3^2,P3^3,引脚,按键按下时,相应引脚会变为低电平。

按键状态检测及消除抖动代码如下:

#include "reg52.h"

sbit S7 = P3^0; 
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;

sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L4 = P0^3;




void delay(unsigned char t)
{
	while(t--);
}


	
unsigned char pp = 0 ;
void key(unsigned char i)
{
	if (S7 == 0)
	{
		delay(100);
		if(S7 == 0)
		{
			if (pp == 0)
				{
					L1 = 0;
					pp = 1;
				}	
			else if (pp == 1)
				{
					L1 = 1;
					pp = 0;
				}
				while(S7 == 0);
			}
	}
	
}

 

按键检测使用双if( )检测,使用delay(100)消抖,

使用while( )检测按键是否被松开

矩阵键盘通过挨个扫描来达到确认按键位置的目的

该代码可以使数码管显示对应矩阵键盘按键的位置,初始化为“00”,第一个按键可以使数码管上的数字-1,

#include "reg52.h"

sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;

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

unsigned char pp;
unsigned char code io[10] = 
{ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void HC573(unsigned char channel)
{
	switch(channel)
	{
		case 4:
			P2 = (P2 & 0x1f) | 0x80;
		break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;
		break;
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;
		break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;
		break;
	}
}

void delay(unsigned int t)
{
	while(t--);
}

void smg()
{
	HC573(6);
	P0 = 0x01;
	HC573(7);
	P0 = io[pp/10];
	delay(500);
	HC573(6);
	P0 = 0x01 << 1 ;
	HC573(7);
	P0 = io[pp%10];
	delay(500);
}

void key()
{
	R1 = 0;
	R2 = R3 = R4 = 1;
	C1 = C2 = C3 = C4 = 1;
		if(C1 == 0)
		{
			while(C1 == 0);
			pp = pp-1;
		}
		else if (C2 == 0)
		{
			while(C2 == 0);
			pp = 2;
		}
		else if (C3 == 0)
		{
			while(C3 == 0);
			pp = 3;
		}
		else if (C4 == 0)
		{
			while(C4 == 0);
			pp = 4;
		}
		
		R2 = 0;
	R1 = R3 = R4 = 1;
	C1 = C2 = C3 = C4 = 1;
		if(C1 == 0)
		{
			while(C1 == 0);
			pp = 5;
		}
		else if (C2 == 0)
		{
			while(C2 == 0);
			pp = 6;
		}
		else if (C3 == 0)
		{
			while(C3 == 0);
			pp = 7;
		}
		else if (C4 == 0)
		{
			while(C4 == 0);
			pp = 8;
		}
		
		R3 = 0;
	R1 = R2 = R4 = 1;
	C1 = C2 = C3 = C4 = 1;
		if(C1 == 0)
		{
			while(C1 == 0);
			pp = 9;
		}
		else if (C2 == 0)
		{
			while(C2 == 0);
			pp = 10;
		}
		else if (C3 == 0)
		{
			while(C3 == 0);
			pp = 11;
		}
		else if (C4 == 0)
		{
			while(C4 == 0);
			pp = 12;
		}
		
		R4 = 0;
	R1 = R2 = R3 = 1;
	C1 = C2 = C3 = C4 = 1;
		if(C1 == 0)
		{
			while(C1 == 0);
			pp = 13;
		}
		else if (C2 == 0)
		{
			while(C2 == 0);
			pp = 14;
		}
		else if (C3 == 0)
		{
			while(C3 == 0);
			pp = 15;
		}
		else if (C4 == 0)
		{
			while(C4 == 0);
			pp = 16;
		}
}
void main()
{
	while(1)
	{
		key();
		smg();
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值