fzjz

(原创)Kinetis之智能车系列(二):按键处理的方法

0
阅读(5049)

        在讨论K60版智能车的按键处理之前,谈谈我以前的按键处理方法。刚接触单片机那会,我也做个按键,控制个小灯啥的。以前我处理按键,先是主循环查询,然后delay滤波,最后处理按键的内容。后来,我知道有啥叫做控制周期的,如果再在主循环里加上个10ms的延时滤波的话就不行了。再想想,按键不是个频繁的东西,每次在主循环里做同样的查询工作是蛮浪费资源的,没必要时刻去查询它,那就用外部触发来做按键好了。

        以上大概就是我对按键的认识的发展史了,呵呵,其他好想法求交流。开始切题,K60的按键处理,和很多带外部中断的芯片有共性,同时它也有自己的个性。

        首先,大体的程序流程:1、按键模块初始化  2、外部中断触发  3、相应中断向量,进入中断处理函数  4、处理完毕,清除中断标志  5、退出中断,回归主循环。

        下面我贴上源代码,就代码分析流程:

        1、初始化

         SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK; //打开PORTC端口的时钟,我用了C端口

          PORTC_DFER|=PORT_DFER_DFE_MASK;  //使能输入滤波器,这是特色啊 

          PORTC_DFCR|=PORT_DFCR_CS_MASK;   //选择 LDO 作为滤波器的时钟, LDO:1khz

          PORTC_DFWR=PORT_DFWR_FILT(10);       //这就设置时间了(小括号),相当于我们以前的delay(),时间多长,自己算

          PORTC_PCR7=PORT_PCR_MUX(1)|PORT_PCR_IRQC(0xA)|PORT_PCR_PE_MASK|PORT_PCR_PS_MASK;

          PORTC_PCR8=PORT_PCR_MUX(1)|PORT_PCR_IRQC(0xA)|PORT_PCR_PE_MASK|PORT_PCR_PS_MASK;     

           PORTC_PCR9=PORT_PCR_MUX(1)|PORT_PCR_IRQC(0xA)|PORT_PCR_PE_MASK|PORT_PCR_PS_MASK;

          //以上三句,你选择的端口,初始化,设置触发边沿。可参考datasheet   P290

         2、中断设置

         enable_irq (89);            //开启按键外部触发中断,C端口,对应89号中断。端口对应中断向量,大家可参阅datasheet

         void portc_isr(void) ;    //在中断处理中,写好对按键中断的处理

         extern void porta_isr(void);    

         #define VECTOR_105      portc_isr       // 0x0000_01A4 105   89     Port control module Pin Detect (Port C)

         //以上两句,写在中断向量列表,替代相应的中断号

        3、中断处理函数:

       DisableInterrupts;           //关闭总中断
       if(PORTC_ISFR==128)   //PTC7发生中断,ISFR:中断标志号
        {
            key_num1++;
            LCD_P8x16_number(0,0,key_num1);
            PORTC_ISFR=0xFFFFFFFF;     //清除中断标志位
        }
  
       if(PORTC_ISFR==256)  //PTC8发生中断
        {
            key_num2++;
            LCD_P8x16_number(0,0,key_num2);
            PORTC_ISFR=0xFFFFFFFF;     //清除中断标志位
        }
       if(PORTC_ISFR==512)  //PTC9发生中断
        {
           key_num3++;
           LCD_P8x16_number(0,0,key_num3);
          PORTC_ISFR=0xFFFFFFFF;     //清除中断标志位
       }
      EnableInterrupts;          //打开总中断

    在古代的话,我应该说差不多一炷香的时间过去,我终于把这个比较简单的按键处理写完了。觉着自己的效率不高啊,写个东西太犹豫了,嗯,看来下次想到啥写啥,不能再磨磨蹭蹭了。。。TO   BE  CONTINUED.。。。