蓝桥杯比赛单片机设计与开发(3) 独立按键

今天我们介绍一下蓝桥杯开发板独立按键的程序编写
蓝桥杯比赛单片机设计与开发(3) 独立按键_第1张图片
在独立按键使用时注意跳线帽接BTN(2和3)。
此程序的思想是将按键存储值放入定时其中进行时实时扫描,通过检测按键存储的状态变化来执行相应的操作。
代码如下:

# include "btn.h"
uchar keysta[4]={1,1,1,1};//按键值存储区
uchar keybackUP[4]={1,1,1,1};//按键值备份区
uchar code  keycodemap[4]={0x77,0x66,0x55,0x44};

void keyscan()//放入定时器中断进行实时扫描
{
	uchar i;
	static uchar  keybuf[4]={0xff,0xff,0xff,0xff};
	
	keybuf[0]=keybuf[0]<<1 |S7;
	keybuf[1]=keybuf[1]<<1 |S6;
	keybuf[2]=keybuf[2]<<1 |S5;
	keybuf[3]=keybuf[3]<<1 |S4;
	
	for(i=0;i<4;i++)
	{
		if(keybuf[i]==0xff)//按键松开
		{
			keysta[i]=1;
		}
		else if(keybuf[i]!=0xff)//按键按下
		{
			keysta[i]=0;
		}
		
		
	}
}
void keydriver(uchar keycode)//执行相应功能
{
	if(keycode==0x77)
	{
		P0=0XF0;
		enable138(LED);
	}
	else if(keycode==0x66)
	{
		P0=0X0F;
		enable138(LED);
	}
	...........
	
}

void keypress()//数据传参,放入while(1)中
{
	uchar i;
	for(i=0;i<4;i++)
	{
		if(keysta[i]!=keybackUP[i])
		{
			if(keybackUP[i]!=0)
			{
				keydriver(keycodemap[i]);
			}
			keybackUP[i]=keysta[i];
		}
		
	}
}

在第八届蓝桥杯省赛中有一个实现相应功能问题:
在这里插入图片描述
这个问题的解决方法我们可以对这个程序中的按键值存储区keysta[3](S4按键)的状态进行判断,当keysta[3]=0时候,说明按键按下,keysta[3]=1是表明按键松开,放入定时其中后进行判断。程序如下:

void KEYCONTROL()
{
	if(keysta[3]==0)
	{
		P0=0XF0;
		enable138(LED);
	}
	else if(keysta[3]==1)
	{
			P0=0X0f;
		enable138(LED);
	}
}

在这里我用S4按键按下后会改变灯亮的状态,和题目中功能实现方法相同。
这个程序可以用于后续矩阵按键的扩展。
btn.h中内容为:

#ifndef _btn_H_
#define _btn_H_

# include "include.h"

# define S7 P30
# define S6 P31
# define S5 P32
# define S4 P33

void keyscan();
void keypress();
void KEYCONTROL();




#endif 

下载链接:https://download.csdn.net/download/weixin_44874337/12306307

你可能感兴趣的:(蓝桥杯单片机组编程)