MSP430端口与中断,键盘程序的模板

来源:互联网 发布:新手淘宝开店教程视频 编辑:程序博客网 时间:2024/04/25 01:46

一、端口P1,P2

 

Ø  P1DIRP2DIR:P1、P2 端口方向寄存器

0: I/O 引脚被切换成输入模式

1: I/O 引脚被切换成输出模式

复位后默认为

         

Ø  P 1INP2IN:P1、P2 端口输入寄存器

 

Ø  P1OUTP2OUT:P1、P2 端口输出寄存器

 

Ø  P1IEP2IE:P1、P2 端口引脚中断允许寄存器

其中:P1IE、P2IE 的各位定义如下:

 

0:禁止该位中断

1:允许该位中断

 

Ø P1IESP2IES:P1、P2 端口引脚中断触发沿选择寄存器

如果允许P0 口的某个引脚中断,还须定义该引脚的中断触发沿,该寄存器的8位分别定义了P0 口的8 条引脚的中断触发沿

0:对应引脚由低到高的电平跳变(上升沿)使相应标志置位

1:对应引脚由高到低的电平跳变(下降沿)使相应标志置位

 

Ø  P1IFGP2IFG:P1、P2 端口中断标志寄存器 

 

Ø  P1SELP2SEL:P1、P2 功能选择寄存器

 

P1、P2 两端口还有其它片内外设功能,考虑减少引脚,将这些功能与芯片外的联系

通过复用P1、P2 引脚的方式以实现。P1SEL、P2SEL 用来选择引脚的I/O(输入/输

出)端口功能与外围模块功能。

0:选择引脚为I/O 端口

1:选择引脚为外围模块功能

 

二、端口P3、P4、P5、P6

 

    这些端口没有中断能力,其余功能与 P1、P2 一样

 

三、外部中断写法

 

主程序语句如下:

void main(void)

{

WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗

P5DIR |= 0x0F; // 设置 P5.0-P5.3 为输出方向

P1DIR = 0x0F; // 设置P1.4 -P1.7 为输入方向

P1IE = 0xf0; // 设置P1.4 -P1.7 可以中断

P1IES = 0xf0; // 设置P1.4 -P1.7 为下降沿中断

_BIS_SR(LPM3_bits + GIE); // 进入最低功耗睡眠,打开总中断开关

for (;;)

{

}

}

        

         语句“#pragma vector=PORT1_VECTOR”指明中断函数是为什么中断服务的,即中断向量。本程序将为端口P1 服务,所以使用PORT1_VECTOR 中断向量,该PORT1_VECTOR 的含义在头文件中有明显表述,请仔细查阅。

语句“__interrupt void  p1int(void)”为中断函数的函数声明。

需要注意的是:P1 的中断标志不能自动清除,需要人为清除,所以程序最后需要清除端口P1 的中断标志,否则会引起中断嵌套,引起死循环。

 

#pragma vector=PORT1_VECTOR

__interrupt void p1int(void)

{

if((P1IN&BIT5) == BIT5)

P5OUT &= ~BIT1 ;

else

P5OUT |= BIT1;

if((P1IN&BIT6) == BIT6)

P5OUT &= ~BIT2;

else

P5OUT |= BIT2;

if((P1IN&BIT7) == BIT7)

P5OUT &= ~BIT3;

else

P5OUT |= BIT3;

P1IFG = 0 ;

}

 

四、键盘检测写法

 

综合起来,一般的键盘程序有如下三个步骤:

A 消除按键抖动(如果使用硬件,则可略);

B 判断是哪个按键按下,识别键码;

C 等待按键松开。

 

 

Ø         主程序:(提供端口设置,使之能进入中断)

unsigned char keybuf; // 全局变量,键值缓存

……

WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗

P1DIR = 0x0F; // 设置P1.4 -P1.7 为输入方向

P1IE = 0xf0; // 设置P1.4 -P1.7 可以中断

P1IES = 0xf0; // 设置P1.4 -P1.7 为下降沿中断

_BIS_SR(LPM3_bits + GIE); // 进入最低功耗睡眠,打开总总断开关

……

 

Ø         判键子程序

unsigned char p1keyj(void) // 判键子程序

{

unsigned char x;

x=(P1IN&0Xf0); // P14--P17 接有按键

return(x); // 有按键返回非全 1

}

 

Ø  中断服务程序:

#pragma vector=PORT1_VECTOR

__interrupt void p1int(void)

{

 //端口1 的中断服务程序

while(p1keyj()!=0xf0) //没有按键按下,返回全1――0xf0

{

delay(500); //延时消除抖动

while(p1keyj()!=0xf0)

{

keybuf = keycode();//确信有按键按下,找按键得键值,送到全局变量keybuf

while(p1keyj()= =0) //等待按键松开

; //做对应键盘的事务

}

}

}

 

 

中断响应时间

中断的响应时间就是中断的响应过程的时间,中断的响应过程是当有事件产生,进入中断之前必须先记住当前正在做的事情,然后去处理发生的事情,处理这个过程的时间,叫做中断相应时间。

  计算机中也是采用的这种方法,五个中断源,每个中断产生后都到一个固定的地方去找处理这个中断的程序,当然在去之前首先要保存下面将执行的指令的地址,以便处理完中断后回到原来的地方继续往下执行程序。

公示定义

计算机接收到中断信号到操作系统作出响应,并完成切换转入中断服务程序的时间。对于占先式内核,要先调用一个特定的函数,该函数通知内核即将进行中断服务,使得内核可以跟踪中断的嵌套。占先式内核的中断响应时间由下式给出:

  中断响应时间=关中断的最长时间 +保护CPU内部寄存器的时间 +进入中断服务函数的执行时间+开始执行中断服务例程(ISR)的第 一条指令时间

原创粉丝点击