蓝桥杯比赛板实现单机双击长按(纯代码分享)

#include "STC15F2K60S2.H"
#include "bsp_key.h"
#include "bsp_led.h"
#include "timer.h"

#define uint8 unsigned char 
#define doublekey_time_define  60
#define longkey_time_define    200 //>255就等于255,变量只有8位

//按键的状态
#define key_up   0
#define key_down 1

//LED的位定义
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;

//定时器
uint8 count = 0;
//状态变量,记录当前时刻的状态
uint8 key_state = key_up;//默认是抬起状态
//区分第一次进去key_up还是第二次
bit first_key = 0;
//存结果
bit one_key = 0;
bit double_key = 0;
bit long_key = 0;
bit total_key = 0;
//500ms倒计时
bit timer_doublekey_start = 0;
uint8 timer_doublekey_time = doublekey_time_define;
//2s倒计时
bit timer_longkey_start = 0;
uint8 timer_longkey_time = longkey_time_define;

//bit timer_start = 0
void main()
{
	P0 = 0XFF;
	P2 = P2 & 0x1F | 0x80; // 0x80,选通Y4,也就是LED的锁存器,将数据透传过去
	//P2 &= 0x1F; //将打开的锁存器关闭,使任何一个锁存器都不打开
	EA = 1;
	Timer0Init();		//1毫秒@12.000MHz
	while(1){
	}
}

void timer0( ) interrupt 1 //10ms一次
{
	count++;                    
	if(timer_doublekey_start == 1&&timer_doublekey_time!= 0) timer_doublekey_time--;
	if(timer_longkey_start == 1&&timer_longkey_time!= 0) timer_longkey_time--;
	//50ms检测一次按键的电平状态
	if(count >= 5){
		count = 0;
		switch(key_state){
			case key_up:  
				if(Key_Read_BTN() == 7){
					key_state = key_down;
					//第一次按下
					if(first_key == 0){
						timer_doublekey_start = 1; 
						timer_longkey_start = 1;
						first_key = 1;
					}
					//第二次按下
					else{
							double_key = 1;
							total_key = 1;
					}
				}
				//第二次进去key_up
				else{
					if(first_key == 1&&timer_doublekey_time <= 0){
						one_key = 1;
						total_key = 1;
					}
				}
				
				break;
			case key_down:
				if(Key_Read_BTN() == 0){
					key_state = key_up;
				}else{
					if(timer_longkey_time <= 0){
						long_key = 1;
						total_key = 1;
					}
				}
				break;
		}
		//为下次作准备
		if(total_key == 1){
			if(one_key == 1){
				LED1 = !LED1;
			}
			if(double_key == 1){
				LED2 = !LED2;
			}
			if(long_key == 1){
				LED3 = !LED3;
			}
			//相关变量回到初始状态
			first_key = 0;
			one_key = 0;
			double_key = 0;
			long_key = 0;
			total_key = 0;

			timer_doublekey_start = 0;
			timer_doublekey_time = doublekey_time_define;

			timer_longkey_start = 0;
			timer_longkey_time = longkey_time_define;
		}
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

废话文学创始人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值