一、实验内容:
1. MSP430单片机的复位中断和低功耗模式 2. 中断方式的按键控制实现
3. Lab8 按键中断方式控制led灯的亮灭
4. Lab9 动动手,P4.1中断方式控制P4.6的LED
二、实验步骤:
Lab8 按键中断方式控制led灯的亮灭
设置端口4.0为输入上拉电阻方式获取按键信号,端口4.5为输出方式,按键按下时开启一次中断,中断开启后修改4.5输出对应的LED灯状态,从而实现按键中断方式控制led灯的亮灭。
实现代码:
#include
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P4DIR |= BIT5; // Set P4.5 to output direction P4REN |= BIT0; // Enable P2.6 internal resistance P4OUT |= BIT0; // Set P2.6 as pull‐Up resistance
P4IES |= BIT0; // P4.0 Hi/Lo edge P4IFG &= ~BIT0; // P4.0 IFG cleared P4IE |= BIT0; // P P4.0 interrupt enabled __bis_SR_register(LPM4_bits + GIE); // Enter LPM4 w/interrupt __no_operation(); // For debugger }
#pragma vector=PORT4_VECTOR __interrupt void Port_4(void) {
P4OUT ^= BIT5; P4IFG &= ~BIT0; }
// P4.5 = toggle // P4.0 IFG cleared
思考题:
1、 Lab8和Lab2的执行结果有何不同?为什么?
答:Lab2的结果是按下按键则灯灭,松开按键灯亮;Lab8是按下按键灯亮\\灭,抬起按键不改变状态。
原因:本实验采用的是中断实现灯的暗灭,按下按钮之后,由于设置的中断条件为下降沿触发,此时中断标志置为1,执行中断程序,改变灯的状态,并清除中断标志,此时抬起按钮,为上升沿,并不会改变中断标志,灯维持之前的状态。Lab2中,按键的状态每转变一次,灯的状态随之改变,因此按下按键灯灭,抬起按键灯亮。
2、 在中断服务程序中,如果把下面的语句注释掉,程序是什么执行结果?为什么? P4IFG &= ~BIT0; // P4.0 IFG cleared
答:按下一次按键后再次按下按键,并不会改变灯的状态。
原因:执行中断程序之后没有清除中断标志,将不会再次执行中断程序。
Lab9 动动手,P4.1中断方式控制P4.6的LED
实现代码:
#include
WDTCTL = WDTPW + WDTHOLD; P4DIR |= BIT5; P4REN |= BIT1; P4OUT |= BIT1; P4IES |= BIT1; P4IFG &= ~BIT1; P4IE |= BIT1; __bis_SR_register(LPM4_bits + GIE); __no_operation(); }
#pragma vector=PORT4_VECTOR __interrupt void Port_4(void) {
P4OUT ^= BIT6; P4IFG &= ~BIT1; }
// Stop watchdog timer
// Set P4.5 to output direction // Enable P2.6 internal resistance // Set P2.6 as pull‐Up resistance // P4.1 Hi/Lo edge // P4.1 IFG cleared
// P4.1 interrupt enabled // Enter LPM4 w/interrupt // For debugger
// P4.6 = toggle // P4.1 IFG cleared
实验改进:
在实验过程中发现,按键时偶尔会产生灯闪烁的情况。因此在程序中增加消抖程序,从而消除按键抖动对实验结果造成的影响。
程序如下:
#include
P4OUT |= BIT1; P4IES |= BIT1; P4IFG &= ~BIT1; P4IE |= BIT1; __bis_SR_register(LPM4_bits + GIE); __no_operation(); }
#pragma vector=PORT4_VECTOR __interrupt void Port_4(void) { int temp=P4IN&BIT1; __delay_cycles(10000); if(P4IN&BIT1==temp)
{ P4OUT ^= BIT6; P4IFG &= ~BIT1; }
// Set P2.6 as pull‐Up resistance // P4.0 Hi/Lo edge // P4.0 IFG cleared
// P4.0 interrupt enabled // Enter LPM4 w/interrupt // For debugger
//消抖
// P4.5 = toggle // P4.0 IFG cleared
相关推荐: