微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 按键程序 PORT中断程序

按键程序 PORT中断程序

时间:11-25 来源:互联网 点击:
MSP 430里面 P1口和P2口有中断功能。

我们的项目里面,P1口的1-7管脚做键盘,0脚做风速传感器的输入。P2口的0-4做键盘,5-7做其他用。


//键盘引脚配置
P1DIR=0x00; // P1 口为输入(0:风速传感器输入,1-7中断信号输入)

P2DIR&=~(BIT0+BIT1+BIT2+BIT3+BIT4); //把P2.0-P2.4设为输入
//下降沿触发是指按下的时候进入中断,上升沿触发是在放开按键的时候进入中断
P1IES|=BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7;//设置P1口中断边沿选择寄存器,置1为下跳沿,置0为

//上跳沿
P1IE=0xFE;//设置P1中断使能寄存器,置1为允许中断,置0为禁止中断

//(因为P1.0他用,为了不影响我们的按键的判断,所以P1.0脚的中断我们不打开,只开P1.1-P1.7,所以

//就是P1IE的bit置位是:1111 1110 =P1IE)
P2DIR=0x00;//设置P2口方向寄存器,置0为输入,置1为输出
P2IES|=BIT0+BIT1+BIT2+BIT3+BIT4;//设置P2口中断边沿选择寄存器,置1为下跳沿,置0为上跳沿
P2IE=0x1F; //设置P2中断使能寄存器,置1为允许中断,置0为禁止中断

(因为P2.5-P2.7他用,为了不影响我们的按键的判断,所以这些脚的中断我们不打开,只开P2.0-P2.4,所以就是P2IE的bit置位是:0001 1111 =P1IE)

I/O口的每一bit都可以单独设置,为了不影响其他管脚的工作,我们设定我们按键所需管脚的时候,都是使用位操作来设定相应的位,无关位保存原样,如:P2IES|=BIT0+BIT1+BIT2+BIT3+BIT4;只选择了P2.0-P2.4为下降沿触发,P2.5-P2.7保持原设置,否则容易相互干扰出错。

在头文件中我们可以找到P1口的中断向量集是:PORT1_VECTOR
P2口的中断向量集是:PORT2_VECTOR

所以中断函数可以写成:

#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR (void)
{
unsigned temp1; //局部变量:? //temp 暂时存放端口的中断标志寄存器中的值
//temp 暂时存放端口的中断标志寄存器中的值
delay(250000); // 消除抖动20ms延时(一般是10ms-20ms,看后面备注1)
if ((P1IN&0xFE)!=0xFE) //如果有键按下

{
temp1=P1IFG; //temp1 记录中断标志
switch(temp1)
{
case 1:
draw_circle(400,300,cyclenum*15,0,0xec);
break;
case 2:
draw_circle(600,300,cyclenum*15,0,0xec);
break;
case 4:
break;
case 8:
break;
case 16:
break;
case 32:
break;
case 64:
break;
case 128:
break;
//default: keyvaluep1=0;break;
}
}
P1IFG=0X00; //清除中断标志,返回主程序
}
//以下是port2的中断服务程序
#pragma vector=PORT2_VECTOR
__interrupt void PORT2_ISR (void)
{
unsigned char temp1;
__delay_cycles(250000);// 20MS消除抖动延时备注1:
if ((P2IN&0x1F)!=0x1F) //仅使用了0、1、2、3、4脚所以与0x1F

{
temp1=P2IFG;
switch(temp1)
{ case 1:
程序1;

break;
case 2:
程序2;

break;
case 4:
程序3;
break;
case 8:
break;
case 16:
break;
case 32:
break;
case 64:
break;
case 128:
break;
//default: keyvaluep2=0;break;
}
}
P2IFG=0X00;
}

备注1:

1、假如你的按键处理事件非常短,不做延时处理可能会判断有几次按键按下的可能!
按键也为机械接触开关,正常情况下,按一次按键,在按下瞬间,可能会有很多毛刺出现,就会有很多低平出现,所以要延时确认,即使没有这种情况,也要做延时处理,这样做是去干扰!正常情况下一个干扰脉冲也不可能会长达10-20MS.所以去干扰去抖动还是很有必要的。而这点时间对一个按键按下并不影响效果!

2、易出错的地方:

P1IES=0x01或 P1IES=1 易被当成 P1IES=0xFF 。 P1IES=0x01仅设置了P1.0

相关资料:

MSP430的端口有P1、P2、P3、P4、P5、P6、S和COM(型号不同,包含的端口也不仅相同,如MSP430X11X系列只有P1,P2端口,而MSP430X4XX系列则包含全部上述端口),它们都可以直接用于输入/输出。MSP430系统中没有专门的输入/输出指令,输入/输出操作通过传送指令来实现。端口P1`P6的每一位都可以独立用于输入/输出,即具有位寻址功能。常见的键盘接口可以直接用端口进行模拟,用查询或者中断方式控制。由于MSP430的端口只有数据口,没有状态口或控制口,在实际应用中,如在查询式输入/输出传送时,可以用端口的某一位或者几位来传送状态信息,通过查询对应位的状态来确定外设是否处于“准备好”状态。

端口的功能。(1)P1,P2端口: I/O,中断功能,其他片内外设功能如定时器、比较器;(2)P3,P4P5P6端口:I/O,其他片内外设功能如SPI、UART模式,A/D转换等;(3)S,COM端口:I/O,驱动液晶。

MSP430各端口具有丰富的控制寄存器供用户实现相应的操作。其中P1,P2具有7个寄存器,P3~P6具有4个寄存器。通过设置寄存器我们可以实现:(1)每个I/O位独立编程;(2)任意组合输入,输出和中断;(3)P1,P2所有8个位全部可以用作外部中断处理;(4)可以使用所以指令对寄存器操作;(5)可以按字节输入、输出,也可按位进行操作。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top