初级会员

- 积分
- 145
- 金钱
- 145
- 注册时间
- 2014-7-5
- 在线时间
- 21 小时
|
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);//清除中断标志位
}
|
|