用SYSTICK定时器的时基,来做按键防抖(一个时序事件触发形的程序架构)

用定时器来做按键防抖(一个时序事件触发形的程序架构)

很多人做按键防抖的时候,都会使用delay让程序死在那里,这是一件很可怕的事情,一个delay都是几十毫秒,这对于一个指令周期频率上M的系统而言,这可是白白的浪费掉上万次的指令周期啊。所以系统中就有了分时复用的概念。

按键扫描,只是我系统中的一个任务,我可以定时的去check这个任务的状态,这样依然会防止按键的抖动

步骤

1.在用SYSTICK系统中做个时基

	LL_Init1msTick(HCLFREQUENCY); //初始化
	LL_SYSTICK_EnableIT();

在中断里让时基变量累加

void SysTick_Handler(void)
{
	Code_go ++;
}

2.主程序
你甚至可以在程序里这么写

switch(Code_flag)
{
	case 1:
		//这个时间点的任务
	break;
	
	case 2:
		//下个时间点的任务
	break;
	
	case 3:
		//下个时间点的任务
	break;
	
	default:
		//默认时间点的任务
	break;
}

我根据这个思想写的按键防抖的程序

void scanf_button(void)
{
	if(!LL_GPIO_IsInputPinSet(GPIOA,LL_GPIO_PIN_2))
	{
		button_loop ++;
		if(button_loop > 20)
		{
			button_flag1 = 1;
			button_flag = 0;
			button_loop = 0;
		}
		if(button_edge == 0)
		{
			button_flag = 1;
			button_edge = 1;
		}
	}
	else
	{
		button_edge = 0;
		button_loop = 0;
	}
}

主程序

int main(void)
{
	LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_AFIO);
	LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);

	NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

	SystemClock_Config();
	MX_GPIO_Init();
	
	LL_Init1msTick(HCLFREQUENCY);
	LL_SYSTICK_EnableIT();
	
	while (1)
	{
		while(Code_go < 100)
		{
			//正常时序的任务
		}
		Code_go = 0;
		scanf_button();//时序宽的任务
	}

}

总结

这种程序架构是很灵活的,结合大致的时间和事件可以处理很多事情

你可能感兴趣的:(单片机)