泰凌微8258长按小灯开启\关闭(包含定时器)

具体要求:长按按键3秒时所有灯闪烁,再次长按按键3秒所有灯停止闪烁,返回到闪烁之前的状态 。(我只做了一个灯其他灯灯同理)

1、初始化引脚

	gpio_set_func(GPIO_PC4, AS_GPIO);       // 将小灯引脚设置为GPIO模式
	gpio_set_output_en(GPIO_PC4, 1);        // 设置小灯为输出模式
	gpio_set_input_en(GPIO_PC4,0);
	gpio_write(GPIO_PC4, 1);                //写入高电平,默认熄灭

	gpio_set_func(GPIO_PD3,AS_GPIO);
	gpio_set_input_en(GPIO_PD3, 1);      // 将按键引脚设置为输入模式
	gpio_setup_up_down_resistor(GPIO_PD3,1); // 设置按键的上拉电阻

2、这里用到定时器和标志位

定时器用来判断长按三秒时间的到达,定义一个开始时间start_tick用来接收按键按下的开始时间clock_time(),通过clock_time_exceed()函数来判断时间是否到达。

start_tick = clock_time(); // clock_time()返回 System Timer tick 值。
clock_time_exceed(start_tick, 3 * 1000 * 1000)

标志位默认为1小灯灭led_status=1,为了后续判断更加准确,因为题目里明确说明点亮闪烁后再次长按熄灭,所以第二次长按的判断应该嵌套在第一次点亮判断的里面。

u8 led_status = 1;  //1默认为小灯灭
if (gpio_read(GPIO_PD3)==0 && led_status)//按键第一次按下
if (gpio_read(GPIO_PD3)==0 && !led_status)//按键第二次按下

3、全部代码

void test3(void)//           长按三秒开灯,再次长按三秒关灯
{
	u8 led_status = 1;  //1默认为小灯灭

	gpio_set_func(GPIO_PC4, AS_GPIO);       // 将小灯引脚设置为GPIO模式
	gpio_set_output_en(GPIO_PC4, 1);        // 设置小灯为输出模式
	gpio_set_input_en(GPIO_PC4,0);
	gpio_write(GPIO_PC4, 1);

	gpio_set_func(GPIO_PD3,AS_GPIO);
	gpio_set_input_en(GPIO_PD3, 1);      // 将按键引脚设置为输入模式
	gpio_setup_up_down_resistor(GPIO_PD3,1); // 设置按键的上拉电阻
	while (1)
	{
		wd_clear();
		u8 i = 1;
		u32 start_tick = 0;
		u32 current_tick = 0;
		if (gpio_read(GPIO_PD3)==0 && led_status)
		{
			start_tick = clock_time(); // clock_time()返回 System Timer tick 值。
			while (i)
			{
				wd_clear();
				if( gpio_read(GPIO_PD3)==0 && clock_time_exceed(start_tick, 3 * 1000 * 1000))
				{
					while (i)
					{
						wd_clear();
						led_status = 0;
						gpio_write(GPIO_PC4,0);
						sleep_ms(500);
						gpio_write(GPIO_PC4,1);
						sleep_ms(500);
						if (gpio_read(GPIO_PD3)==0 && !led_status)
						{
							current_tick = clock_time(); // clock_time()返回 System Timer tick 值。
							while (i)
							{
								wd_clear();
								gpio_write(GPIO_PC4,0);
								sleep_ms(500);
								gpio_write(GPIO_PC4,1);
								sleep_ms(500);
								if (gpio_read(GPIO_PD3)==0 && clock_time_exceed(current_tick, 3 * 1000 * 1000))
								{
									led_status = 1;
									gpio_write(GPIO_PC4,1);
									i = 0;
									sleep_ms(900);//这里延时是去除按键抖动,放在这里的原因是小灯熄灭的现象需要立刻出现
								}
							}
						}
					}
				}
			}
		}
	}
}

如有不对的地方欢迎指正~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用STM32F4定时器控制小灯的步骤: 1. 首先,需要初始化定时器和GPIO引脚。在初始化GPIO引脚时,需要将其设置为输出模式。 2. 然后,需要配置定时器的时钟源和分频系数。这可以通过修改TIMx_CR1寄存器和TIMx_PSC寄存器来完成。 3. 接下来,需要配置定时器的自动重载寄存器(TIMx_ARR)和预分频器(TIMx_PSC)的值,以便生成所需的定时器中断时间。 4. 然后,需要使能定时器中断,并在中断处理程序中切换GPIO引脚的状态,以控制小灯的亮灭。 5. 最后,启动定时器,等待定时器中断触发。 下面是一个使用TIM2控制GPIOA.5引脚的例子: ```c #include "stm32f4xx.h" void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { GPIO_ToggleBits(GPIOA, GPIO_Pin_5); TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } } int main(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = 999; TIM_TimeBaseStructure.TIM_Prescaler = 8399; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); TIM_Cmd(TIM2, ENABLE); while (1) { } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值