标题:
STM32系列单片机按键在定时器中的应用?包括单击、双击
[打印本页]
作者:
tjdk2if
时间:
2025-6-12 13:56
标题:
STM32系列单片机按键在定时器中的应用?包括单击、双击
#include "stm32f10x.h" // Device header
#include "Timer.h"
#include "StaticData.h"
#include "TM1637.h"
#include "led.h"
#include "can.h"
uint16_t x,y;
int count; //定时器计数
int KeyStartcount;//长按事件计数
uint8_t UpdateState; //设置运行状态标志位
uint8_t RunState; //运行状态
uint8_t AwaitSetRunState; //设置运行状态
int smg_Mode; //数码管调节
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
count++;
//启动停止
KeyTask(&KeyStartStop);
if(KeyStartStop.Event==LONG_PRESS)//长按
{
if(KeyStartcount==0)
{
UpdateState=1; //运行状态更新标志位
if(RunState==0) //运行状态
{
AwaitSetRunState=1;//启动
RunState=1;
}
else
{
AwaitSetRunState=0;//停止
RunState=0;
}
}
KeyStartcount++; //长按一次只触发一次
}
else
{
KeyStartcount=0;//复位长按事件
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
int16_t Encoder_Get(void)
{
int16_t Temp;
if(AwaitSetRunState==1)
{
smg_Mode=1;
if(smg_Mode==1)
{
TIM_SetCounter(TIM3,96);
}
else
{
TIM_SetCounter(TIM3,0);
}
}
if(smg_Mode==1)
{
Temp = TIM_GetCounter(TIM3);
if(Temp>=96)
{
Temp=96;
TIM_SetCounter(TIM3,96);
}
if(Temp<4)
{
Temp=4;
TIM_SetCounter(TIM3,4);
}
}
else
{
TIM_SetCounter(TIM3,0);
}
return Temp;
}
int main()
{
KeyHandlerInit();
Timer_Init();
TM1637_Init();
LED_Init();
//
CAN_Configuration();
CAN_NVIC_Configuration(USB_LP_CAN1_RX0_IRQn,2,0); //CAN中断配置
while (1)
{
x=Encoder_Get()/4;
TM1637_SetNum(5,x/10);//个位
TM1637_SetNum(4,x%10);//十位
TM1637_Display_INC();
TM1637_SetBrightness( 7 );
if(count%5==0)
{
CAN_Datasend(0xdd,0x00,0x50,0,0,0);
}
if(AwaitSetRunState==1)
{ GPIO_SetBits(LEDPORTb,DOT);
GPIO_SetBits(LEDPORTa,FIRE);
CAN_Datasend(0xdd,0x00,0x50,0,0,0);
}
else
{ GPIO_ResetBits(LEDPORTb,DOT);
GPIO_ResetBits(LEDPORTa,FIRE);
CAN_Datasend(0xdd,0x42,0x50,0,0,0);
}
}
}
复制代码
原理图: 无
仿真: 无
代码:
长按短按实例.7z
(188.59 KB, 下载次数: 0)
2025-6-12 14:49 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1