OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4348|回复: 1

按键双击程序,未调试,有兴趣的童鞋帮忙调试一下万分感谢!

[复制链接]

7

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2014-7-5
在线时间
21 小时
发表于 2014-9-18 13:09:27 | 显示全部楼层 |阅读模式
5金钱
  //KEY1:PA15输入,key_zt:第,4-7位:单击标志,消抖定时器标志,长按定时器标志,双击定时器标志第,0-3位 双击,头击按键抬起,长按,短按
 vu8  key_zt
;(外部变量)
void EXTI15_10_IRQHandler(void)
{
    TIM2->CR1&=0xfe; //关定时器
switch(KEY1)
{
    case 0:
{   
  EXTI->IMR&=0x7f; //关中断
  Tim2_Init(100,7199);//10ms
  key_zt|=1<<5;   //消抖定时器标志设置
  TIM2->CR1|=0x01;    //使能定时器3
  if(key_zt&0x80);   //判定双击溢出,溢出了标志不变
  else
  key_zt&=0x7f;
}
case 1:
{  
 if(key_zt&0x20)//若长按时间未到 输出短按下降沿标志
  {
key_zt&=0xf0;
key_zt|=1<<3;
  }
 key_zt&=0xdf;//清除长按定时器标志
 Tim2_Init(3000,7199);//300ms
 key_zt|=1<<7;   //双击定时器标志设置
 TIM2->CR1|=0x01;    //使能定时器3 
}
EXTI->R=1<<15;     //清除LINE15上的中断标志位
}
}
    
//外部中断初始化程序
//初始化PA15为中断输入.
void EXTIX_Init(void)
{
RCC->APB2ENR|=1<<2;     //使能PORTA时钟
JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD   

//GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入  
//GPIOA->CRL|=0X00000008;   
GPIOA->CRH&=0X0F0FFFFF;//PA13,15设置成输入  
GPIOA->CRH|=0X80800000;   
GPIOA->ODR|=1<<15;   //PA15上拉
Ex_NVIC_Config(GPIO_A,15,FTIR);//下降沿触发
Ex_NVIC_Config(GPIO_A,15,RTIR);//下降沿触发
MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);//抢占2,子优先级2,组2   
}

void Tim2_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;//TIM3时钟使能    
  TIM2->ARR=arr;  //设定计数器自动重装值//刚好1ms    
TIM2->SC=psc;  //预分频器7200,得到10Khz的计数时钟 EXTI_IMR

TIM2->DIER|=1<<0;   //允许更新中断
TIM2->DIER|=1<<6;   //允许触发中断
   
//TIM2->CR1|=0x01;    //使能定时器3
  MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2  
}
//双击定时器key_zt高4位定时器标志低4位按键键值
void TIM2_IRQHandler(void)
{
 TIM2->CR1&=0xfe; //关定时器
 key_zt&=0xf0;
 switch(key_zt)
   {
  case 16:    //消抖
{
  EXTI->IMR|=1<<15; //开中断
  if(KEY1==0)    //键按下
   {   
    key_zt|=1<<0;//短按
Tim2_Init(10000,7199);//1秒
    key_zt|=1<<6;   //长按定时器标志设置
    TIM2->CR1|=0x01;    //使能定时器3 
   }
  key_zt&=0xef;  //清除消抖定时器标志   
}  
  case 32:          //长按
  if(KEY1==0)
 key_zt|=1<<2;
       key_zt&=0xdf;//清除长按定时器标志
       
case 64:         //双时间到 
key_zt|=1<<7;
case 90:{  //双击
  key_zt|=1<<4;
    key_zt&=0x6f;}
   }             
TIM2->SR&=~(1<<0);//清除中断标志位   
 }

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-9-18 13:35:10 | 显示全部楼层
怎么写得这么复杂?你能用就行了。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-2 01:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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