今天我们介绍一下蓝桥杯开发板独立按键的程序编写
在独立按键使用时注意跳线帽接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