(原创)Kinetis之智能车系列(二):按键处理的方法
0赞在讨论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.。。。
