单片机4*4矩阵按键控制数码管显示实验记录

在这里插入图片描述
关于实验内容1

void matrixkey()
{
	P3=smgwei[3];
	P2=smgduan[1];
	MTX_KEY=0x0f;
	if(MTX_KEY!=0x0f)
	{
		delay(100);//按键消抖
		if(MTX_KEY!=0x0f)
		{
			MTX_KEY=0x0f;
			switch(MTX_KEY)
			{
				case 0x0e: keyvalue=1;break;
				case 0x0d: keyvalue=1;break;
				case 0x0b: keyvalue=1;break;
				case 0x07: keyvalue=1;break;

			}
			MTX_KEY=0xf0; 
			switch(MTX_KEY)
			{
				case 0xe0: keyvalue=keyvalue,P3=smgwei[3];break;
				case 0xd0: keyvalue=keyvalue,P3=smgwei[3];break;
				case 0xb0: keyvalue=keyvalue,P3=smgwei[3];break;
				case 0x70: keyvalue=keyvalue,P3=smgwei[3];break;
			}
		}
		while(MTX_KEY!=0xf0)//消抖+没松手的时候数码管不变数字
		{
			delay(100);

		}
		
		
	}
	P2=smgduan[0];			
}

这是关于矩阵按键行列扫描的重要函数,其中遇到的问题是按键按下,数码管从0变1,
但是按键松开,数码管不会从1再变回0,此时我在子函数开头加了一个P3=smgwei[3];P2=smgduan[1];的代码,因为keyvalue我设置的是全局变量且一开始赋给其0,所以我一开始设置让他在数码管从左数第一位显示0,且第一次按下案件如果没有P2=那个代码的话,第一次按键按下是没有数字变化的!!!!再在最后加了一个P2=smgduan[0];的代码,以保证按键松开后使数字从1再变回0

void matrixkey()
{
	u16 a=0;
	MTX_KEY=0x0f;
	if(MTX_KEY!=0x0f)
	{
		delay(100);//按键消抖
		MTX_KEY=0x0f;//再确认以下按键有没有按下去
		if(MTX_KEY!=0x0f)
		{
			MTX_KEY=0x0f;
			switch(MTX_KEY)
			{
				case 0x0e: keyvalue=4;break;
				case 0x0d: keyvalue=3;break;
				case 0x0b: keyvalue=2;break;
				case 0x07: keyvalue=1;break;

			}
			MTX_KEY=0xf0; 
			switch(MTX_KEY)
			{
				case 0xe0: keyvalue=keyvalue+12,P3=smgwei[0];break;
				case 0xd0: keyvalue=keyvalue+8,P3=smgwei[1];break;
				case 0xb0: keyvalue=keyvalue+4,P3=smgwei[2];break;
				case 0x70: keyvalue=keyvalue,P3=smgwei[3];break;
			}
		}
		while((a++<50)&&(MTX_KEY!=0xf0))//消抖+及时切换数字和位置
		{
			delay(100);
		}

	}		
}

这是关于矩阵按键行列扫描的重要函数,主要是让对应位(1、2、3、4)对应显示1、2、3、4行的数字(对应实验内容2)。此代码加了个a=0;a++<50;同时让后者工作在while循环里,是因为要及时切换数字和位置,不能发生位置变了数字还延迟着没变的现象,这就给人一种不严谨、瞎眼的感觉。

这个十六进制对应按键研究了好半天,其实仔细对应好就ok,具体的根据proteus上连线方式来对应即可!

2020.4.10
遇到一个新的问题,如果实验内容2中我想在按下按键再松开后数码管不显示任何值,该怎么做呢?目前没有思路,调试N遍也不行~

发布了18 篇原创文章 · 获赞 1 · 访问量 241

猜你喜欢

转载自blog.csdn.net/weixin_45910408/article/details/105423127