|
楼主 |
发表于 2014-9-23 14:49:06
|
显示全部楼层
本帖最后由 lingergz 于 2014-9-23 15:25 编辑
- #pragma vector=TIMER0_A0_VECTOR
- __interrupt void Timer_A (void)
- {
- cnt++;
- if(cnt>1) //按键按下后40ms,改变引脚为 上升沿触发,从而避免抖动
- {
- P2IES &= ~ E_BTN ; //P2.1 & P2.2 LO/HI edge
-
- P2IE |= E_BTN; //开启引脚中断
-
- }
- }
- #pragma vector=PORT2_VECTOR
- __interrupt void PORT2_ISR(void)
- {
-
- if(P2IFG & E_BTN)
- {
- P2IE &= ~E_BTN; //禁止引脚中断
- P2IFG &= ~ E_BTN;
-
- pin_flag ++;
- LPM4_EXIT; //退出中断
-
-
- }
-
- }
- void Timer0_init() //定时器0初始化,上数模式:定时器计数增加至 TACCR0触发中断
- {
- CCTL0 = CCIE;
-
- TACTL = TASSEL_2 + MC_1; // SMCLK, contmode
- }
- void main(void)
- {
-
- WDTCTL = WDTPW + WDTHOLD; // Stop WDT
-
- ConfigureClocks();
- ConfigureSwitches();
- Timer0_init(); //系统初始化
-
- ConfigureOLED();
- Clear_Screen();
- Write_HZ((unsigned char *)HZ,4,0);
-
- pin_flag = 0; //全局变量,用于判断上升沿触发,还是下降沿触发
- cnt = 0; //全局变量,定时器计数器
-
- __bis_SR_register( GIE);
- LPM4; //开启总中断并进入低功耗模式4
-
- while(1)
- {
- if(pin_flag==1) //下升沿中断,说明是按键开始按下,开启定时器计时
- {
- CCR0 = 20000;
- pin_flag=2;
-
- }
- else if(pin_flag==3) //上升沿中断,证明按键释放。
- {
- CCR0 = 0; //停止定时器,清零判断上升沿和下降沿的标志位
- pin_flag=0;
-
- if(cnt>150) //long longpress //开始判断长按和短按
- {
- cnt = 0;
- Clear_Screen();
- Write_HZ((unsigned char *)HZ,10,1);
- }
- else if(cnt>50)//long press
- {
- cnt= 0;
- Clear_Screen();
- Write_HZ((unsigned char *)HZ,5,1);
- }
- else // short press
- {
- cnt = 0;
- Clear_Screen();
- Write_HZ((unsigned char *)HZ,6,1);
- }
-
-
- P2IES |= E_BTN ; //P2.1 & P2.2 LO/HI edge,按键判断完毕,开启按键下降沿触发
- P2IE |= E_BTN;
-
- LPM4;
- }
-
- }
- }
复制代码
|
|