找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 117|回复: 0
打印 上一主题 下一主题
收起左侧

STM32系列单片机按键在定时器中的应用?包括单击、双击

[复制链接]
跳转到指定楼层
楼主
ID:945807 发表于 2025-6-12 13:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "stm32f10x.h"                  // Device header
  2. #include "Timer.h"
  3. #include "StaticData.h"
  4. #include "TM1637.h"
  5. #include "led.h"
  6. #include "can.h"


  7. uint16_t x,y;
  8. int count; //定时器计数
  9. int KeyStartcount;//长按事件计数
  10. uint8_t  UpdateState;                        //设置运行状态标志位
  11. uint8_t         RunState;                            //运行状态
  12. uint8_t         AwaitSetRunState;                    //设置运行状态
  13. int smg_Mode;  //数码管调节


  14. void TIM2_IRQHandler(void)
  15. {
  16.         if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
  17.         {
  18.         count++;
  19.         
  20.       
  21.         //启动停止
  22.         KeyTask(&KeyStartStop);
  23.         if(KeyStartStop.Event==LONG_PRESS)//长按
  24.         {   
  25.             if(KeyStartcount==0)
  26.             {
  27.                 UpdateState=1; //运行状态更新标志位
  28.                 if(RunState==0)    //运行状态
  29.                 {
  30.                     AwaitSetRunState=1;//启动
  31.                     RunState=1;
  32.                   
  33.                 }
  34.                 else
  35.                 {
  36.                     AwaitSetRunState=0;//停止
  37.                     RunState=0;
  38.                 }
  39.             }
  40.             KeyStartcount++; //长按一次只触发一次
  41.         }
  42.         else
  43.         {
  44.             KeyStartcount=0;//复位长按事件
  45.         }

  46.         
  47.                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
  48.         }
  49. }



  50. int16_t Encoder_Get(void)
  51. {

  52.         int16_t Temp;
  53.         if(AwaitSetRunState==1)
  54.     {
  55.       smg_Mode=1;
  56.         if(smg_Mode==1)
  57.         {
  58.            TIM_SetCounter(TIM3,96);
  59.         }
  60.        else
  61.         {
  62.             TIM_SetCounter(TIM3,0);
  63.           }
  64.     }
  65.      if(smg_Mode==1)
  66.      {
  67.        Temp = TIM_GetCounter(TIM3);
  68.           if(Temp>=96)
  69.             {
  70.                 Temp=96;
  71.                 TIM_SetCounter(TIM3,96);
  72.             }
  73.    
  74.             if(Temp<4)
  75.             {
  76.                 Temp=4;
  77.                 TIM_SetCounter(TIM3,4);
  78.             }
  79.         }
  80.         else
  81.         {
  82.             
  83.                 TIM_SetCounter(TIM3,0);
  84.            
  85.         }

  86.     return Temp;
  87. }









  88. int main()
  89. {
  90.     KeyHandlerInit();
  91.     Timer_Init();
  92.     TM1637_Init();       
  93.     LED_Init();
  94. //   
  95.    CAN_Configuration();
  96.    CAN_NVIC_Configuration(USB_LP_CAN1_RX0_IRQn,2,0); //CAN中断配置
  97.     while (1)
  98.     {
  99.         x=Encoder_Get()/4;
  100.         
  101.         TM1637_SetNum(5,x/10);//个位
  102.         TM1637_SetNum(4,x%10);//十位

  103.        TM1637_Display_INC();
  104.        TM1637_SetBrightness( 7 );
  105.         if(count%5==0)
  106.         {
  107.          CAN_Datasend(0xdd,0x00,0x50,0,0,0);
  108.         
  109.         }
  110.         if(AwaitSetRunState==1)
  111.         { GPIO_SetBits(LEDPORTb,DOT);
  112.            GPIO_SetBits(LEDPORTa,FIRE);
  113.              CAN_Datasend(0xdd,0x00,0x50,0,0,0);  
  114.              }
  115.        else
  116.            
  117.         { GPIO_ResetBits(LEDPORTb,DOT);
  118.            GPIO_ResetBits(LEDPORTa,FIRE);
  119.             CAN_Datasend(0xdd,0x42,0x50,0,0,0);  
  120.         }

  121.     }

  122. }
复制代码

原理图: 无
仿真: 无
代码: 长按短按实例.7z (188.59 KB, 下载次数: 0)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表