蓝桥杯单片机必备知识-----(13)长按键识别
计数超过400即为长按键(经验值,暂时没有想到更好的方法)
//按键扫描函数
unsigned char read_key(void)
{
static unsigned int press_counter = 0; //长短按键计数器
static unsigned char status = 0;
unsigned char key_val = 0xFF;
switch(status){
case 0:
if(P30 == 0){
status = 1;
}
break;
case 1:
if(P30 == 0){
if(press_counter < 400){
press_counter++;
}
}else{
if(press_counter > 20){
status = 2;
}else{
status = 0; //抖动
press_counter = 0;
}
}
break;
case 2:
if(P30 == 1){
if(press_counter < 400){
key_val = 1; //短按键
}else{
key_val = 2 ; //长按键
}
status = 0;
press_counter = 0;
}
break;
}
return key_val;
}
整个代码粘贴
#include "stc15f2k60s2.h" //定义51单片机特殊功能寄存器
unsigned char read_key(void);
//关闭蜂鸣器
void cls_buzz()
{
P2 = (P2&0x1F|0xA0);
P0 = 0x00;
P2 &= 0x1F;
}
//关闭指示灯
void cls_led()
{
P2 = (P2&0x1F|0x80);
P0 = 0xFF;
P2 &= 0x1F;
}
//主函数
void main(void)
{
unsigned char temp;
unsigned char mov = 0;
unsigned int scan_period = 0;
cls_buzz();
cls_led();
while(1)
{
if(++scan_period == 1000){
scan_period = 0;
temp = read_key();
if(temp != 0xff)
{
if(temp == 1){
P0 = ~(1<<mov);
if(++mov == 8){
mov = 0;
}
}else{
P0 = 0xFF;
}
P2 = (P2 & 0x1F | 0x80);
P2 &= 0x1F;
}
}
}
}
//按键扫描函数
unsigned char read_key(void)
{
static unsigned int press_counter = 0; //长短按键计数器
static unsigned char status = 0;
unsigned char key_val = 0xFF;
switch(status){
case 0:
if(P30 == 0){
status = 1;
}
break;
case 1:
if(P30 == 0){
if(press_counter < 400){
press_counter++;
}
}else{
if(press_counter > 20){
status = 2;
}else{
status = 0; //抖动
press_counter = 0;
}
}
break;
case 2:
if(P30 == 1){
if(press_counter < 400){
key_val = 1; //短按键
}else{
key_val = 2 ; //长按键
}
status = 0;
press_counter = 0;
}
break;
}
return key_val;
}