天天看点

蓝桥杯单片机(二)独立按键

接下来讲解开发板上的独立按键部分。如果你想从头看起,那么请看

蓝桥杯单片机(一)流水灯

我们依旧先从原理图看起:

蓝桥杯单片机(二)独立按键

这是开发板按键的原理图部分,这是一个4×4的矩阵键盘,我们今天讲解的是S4,S5,S6,S7组成的独立键盘。仔细观察会发现S4-S7一端接到P30-P33,另外一端接到了J5这个排针2,排针3接地,排针1接到了P37,如果要使用独立按键,就要将排针的2和3连接起来,也就是让S4-S7一端接引脚,另外一端接地,这样当我们按下按键,P30-P33就会检测到低电平。

所以首先需要将开发板上的跳线帽让排针上的2和3连接起来。

然后我们先来看独立按键的代码部分

void Dkey_scan(void)
{
	static unsigned char keybyte=0;
	static unsigned char key;
	if(((P3&0X0F)!=0X0F)&&(keybyte==0))
	{
		delayms(5);
		if((P3&0X0F)!=0X0F)
		{
			keybyte=1;key=P3&0x0f;
		}
	}
	if((keybyte==1)&&((P3&0X0F)==0X0F))
	{
		if((P3&0X0F)==0X0F)
		{
			switch(key)
			{
				case 0x0e:keybyte=0;break;
				case 0x0d:keybyte=0;break;
				case 0x0b:keybyte=0;break;
				case 0x07:keybyte=0;break;
			}
		}
	}
}
           

keybyte是static静态变量,只会被初始化一次。

这是一个按键扫描部分的代码,并且是松手检测,也就是按键松手才有效。

首先使用P3&0X0F来获得P3引脚前四位(P30,P31,P32,P33)的状态,如果有按键被按下P3&0X0F就不会等于0X0F,keybyte是状态标志位,如果等于0说明之前没有被按下,如果有按键被按下就会进入第一个if里面,然后延时5毫秒,这个作用是为了消除按键抖动(抖动时高低电平时不确定的),然后再进行判断,确定是不是真的被按下,然后将P3&0X0F的值赋给key,并且将keybyte状态变为1,认为被按下了。

如果松手了就会进入第二个判断语句里面,P3&0X0F= =0X0F意为没有按键被按下,也就是松手,然后通过switch语句进行对key筛选,如果key= =0xe,说明上一次是第一个按键被按下,然后就可以写入按键任务case里面,然后将keybyte重新置为0。这样按键扫描程序就写好了。

按下检测:

void Dkey_scan(void)
{
	static unsigned char key;
	if((P3&0X0F)!=0X0F)
	{
		delay5ms();
		if((P3&0X0F)!=0X0F)
		{
			key=P3&0x0f;
			switch(key)
			{
				case 0x0e:P2=0X80;P0=0XFE;
					break;
				case 0x0d:P2=0X80;P0=0XFD;
					break;
				case 0x0b:P2=0X80;P0=0XFB;
					break;
				case 0x07:P2=0X80;P0=0XF7;
					break;
			}
		}
		while((key&0X0F)!=0X0F)
		{
			key=P3&0x0f;
		}
	}
}
           

接下来写一个按键实验,使用按键控制LED的灯的亮灭。

作用是按下一个按键对应灯就会亮起

代码如下

#include <stc15f2k60s2.h>


void Dkey_scan(void);
void delay5ms(void);

void main(void)
{
	P2=0XA0;P0=0X00;
	while(1)
	{
		Dkey_scan();
	}
}

void Dkey_scan(void)
{
	static unsigned char keybyte=0;
	static unsigned char key;
	if(((P3&0X0F)!=0X0F)&&(keybyte==0))
	{
		delay5ms();
		if((P3&0X0F)!=0X0F)
		{
			keybyte=1;key=P3&0x0f;
		}
	}
	if((keybyte==1)&&((P3&0X0F)==0X0F))
	{
		if((P3&0X0F)==0X0F)
		{
			switch(key)
			{
				case 0x0e:P2=0X80;P0=0XFE;
					keybyte=0;break;
				case 0x0d:P2=0X80;P0=0XFD;
					keybyte=0;break;
				case 0x0b:P2=0X80;P0=0XFB;
					keybyte=0;break;
				case 0x07:P2=0X80;P0=0XF7;
					keybyte=0;break;
			}
		}
	}
}

void delay5ms(void)		//@11.0592MHz
{
	unsigned char i, j;

	i = 54;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}
           

我在按键扫描里面加入了对P0口的LED灯的控制,然后将按键扫描程序放入主函数就实现按键控制LED的程序

效果如下:

蓝桥杯单片机(二)独立按键

有不懂的可以评论或私信

继续阅读