首先呢,大家都知道:历年的蓝桥杯单片机组都会考到按键模块;对于省赛来说,考独立按键的概率远远高于矩阵键盘,所以必须将独立按键的用法吃透来(当然,同时准备矩阵键盘也是比较保险的做法)
现在来给大家介绍独立按键基本的使用方法——状态机
(有人也喜欢用三行代码的方法。当然这都无所谓,萝卜白菜各有所爱,只要别用主时序给按键消抖就行!)
1、要使用独立按键,那么开发板上的J5跳帽必须接到BTN(独立按键)。
2、独立按键相关原理图如下
跳帽使得pin2和pin3相连接,这使得按键的一端一直为低电平。
因此,我们可以通过单片机给按键的另一端为高电平;当按键按下的时候,对应I/O口的会检测到低电平。
同时,我们应该用状态机进行按键状态的判断,结合定时器中断的使用对按键进行定时扫描。
3、如下,附上独立按键状态机代码块。
#include "STC15F2K60S2.h"
#define u8 unsigned char
#define KEY_STATE0 0 //判断按键是否按下
#define KEY_STATE1 1 //按键按下标志
#define KEY_STATE2 2 //判断按键是否松开
void Timer0Init(void) //配置定时器0,1ms中断
{
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = 0xCD;
TH0 = 0xD4;
TF0 = 0;
TR0 = 1;
ET0=1;
EA=1;
}
unsigned char key_scan()//按键检测函数
{
static char KEY_STATE=KEY_STATE0;
u8 KEY=0;
u8 key_value=0;
P30=1;P31=1;P32=1;P33=1;
if(P30==0) KEY=7;
if(P31==0) KEY=6;
if(P32==0) KEY=5;
if(P33==0) KEY=4;
if((P30==1)&&(P31==1)&&(P32==1)&&(P33==1)) KEY=0;
switch(KEY_STATE) //判断按键状态
{
case KEY_STATE0:
if(KEY!=0)
{
KEY_STATE=KEY_STATE1; //成功获得键值,进入下一状态
}
break;
case KEY_STATE1:
switch(KEY)
{
case 4: key_value=4; break;
case 5: key_value=5; break;
case 6: key_value=6; break;
case 7: key_value=7; break;
}
KEY_STATE=KEY_STATE2;//自动转为下一状态
break;
case KEY_STATE2:
if(KEY==0)
{
KEY_STATE=KEY_STATE0;//按键弹开,重新回到最初状态
}
break;
}
return key_value;
}
bit key_flag; //按键读取标志位
u8 key_val; // 按键返回值
void main()
{
P0=~0X00;P2=0X80;P2=0X00; //关闭led外设
P2=0XA0;P0=0X00;P2=0X00; //关闭蜂鸣器以及寄存器外设
Timer0Init();
while(1)
{
if(key_flag)
{
key_flag=0; //按键读取标志位置0
key_val=key_scan();//读取键值
switch(key_val)
{
case 4: break; //任务1
case 5: break; //任务2
case 6: break; //任务3
case 7: break; //任务4
}
}
}
}
void Timer0() interrupt 1 //定时器0中断
{
static int key_count=0;
key_count++;
if(key_count==10)//十毫秒检测一次按键状态
{
key_count=0;
key_flag=1;
}
}
4、这只是独立按键最基本的操作,关于按键的按下与松开以及长按与短按等内容以后会提到。
祝大家在蓝桥杯比赛中获得优异的成绩!
——南昌大学 电子183刘昊