蓝桥杯单片机必备知识-----(13)长按键识别

蓝桥杯单片机必备知识-----(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;
}


猜你喜欢

转载自blog.csdn.net/qq_43710889/article/details/110188754