Buzz(); P1IFG &=~BIT4; } if((P1IFG&BIT5)!=0) { Blink2(); P1IFG &=~BIT5; } } 思考:如果用长导线将按键K5、K6 分别连接在P2.2 和P2.5 上,如何修改程序以实现 任务2 功能?
若用长导线将按键K5、K6 分别连接在P2.2 和P2.5 上,则只需将P2.2与P2.5设置为允许中断即可,具体代码如下: #include \#include \void delay( ) //延时函数 { unsigned int j; for (j=0;j<0xffff;j++); } void Blink( ) //LED闪 { P2OUT &=~BIT6; delay(); P2OUT |= BIT6; delay(); } void Blink2( ) //LED闪 { unsigned int i; for(i=0;i<3;i++) { P2OUT &=~BIT0; delay(); P2OUT |= BIT0; delay(); } } void Buzz( ) //蜂鸣响 { P1OUT &=~BIT7; delay(); P1OUT|= BIT7; delay(); } void main ( void ) { WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 _DINT(); //关闭总中断允许 P2IE &=~(BIT2+BIT5); //关闭分中断允许 //设置引脚P2.0、P2.6、P1.7输出,P2.0连接LED1,P2.6连接LED7,P1.7连接蜂鸣器 P2SEL &=~(BIT0+BIT6); P2SEL2 &=~(BIT0+BIT6); P1SEL &=~BIT7; P2SEL2 &=~BIT7; P2OUT|=(BIT0+BIT6); P2DIR|=(BIT0+BIT6); P1OUT|=BIT7; P1DIR|=BIT7; //设置端口P2.2、P2.5允许中断 P2SEL &=~(BIT2+BIT5); P2SEL2 &=~(BIT2+BIT5); P2OUT |=(BIT2+BIT5);; P2REN |=(BIT2+BIT5); P2DIR &=~(BIT2+BIT5); P2IES |=(BIT2+BIT5); P2IFG &=~(BIT2+BIT5); P2IE |=(BIT2+BIT5); _EINT(); //总中断允许 for (;;) //主循环 { Blink(); }; } #pragma vector=PORT2_VECTOR __interrupt void port_ISR( ) { if((P2IFG&BIT2)!=0) { Buzz(); P2IFG &=~BIT2; } if((P2IFG&BIT5)!=0) { Blink2(); P2IFG &=~BIT5; } } 思考:K5键连接的P1.4与K6键连接的P1.6均属于同一级优先级,因此当执行P1.4发出的中断子程时若按下K6再次发出中断申请,则程序会先处理完P1.4控制的中断程序,然后在执行完后执行P1.5控制的子程。若想要实现实时反馈,则可以将K6连接的端口改为P2.X,由于P2端口的中断优先级高于P1,因此程序会优先执行P2控制的中断程序。 3. 采用事件标志处理中断
阅读程序 L6_intA.c 和L6_intB.c(见后页),描述其实现功能。比较L6_intA.c 和L6_intB.c二者在编程实现上有何不同。
程序A和程序B实现的功能相同:用P1.0作为中断源,当P1.0接收到中断信号时,控制蜂鸣器响一声。不同的是程序A把控制蜂鸣器鸣叫的过程放在中断程序中,而程序B仅仅在中断程序中设置了一个事件标志,而把控制蜂鸣器鸣叫放在了while循环中,这样每当事件标志被响应时,蜂鸣器就会鸣一声。因此程序A的中断子程执行时间长于程序B。 用L6_intB.c 的方法,改写任务2 的编程。 具体代码如下: #include \#include \int flag=0; void delay( ) //延时函数 { unsigned int j; for (j=0;j<0xffff;j++); } void Blink( ) //LED闪 { P2OUT &=~BIT6; delay(); P2OUT |= BIT6; delay(); } void Blink2( ) //LED闪 { unsigned int i; for(i=0;i<3;i++) { P2OUT &=~BIT0; delay(); P2OUT |= BIT0; delay(); } } void Buzz( ) //蜂鸣响 { P1OUT &=~BIT7; delay(); P1OUT|= BIT7; delay(); } void main ( void ) { WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 _DINT(); //关闭总中断允许 P1IE &=~(BIT4+BIT5); //关闭分中断允许 //设置引脚P2.0、P2.6、P1.7输出,P2.0连接LED1,P2.6连接LED7,P1.7连接蜂鸣器 P2SEL &=~(BIT0+BIT6); P2SEL2 &=~(BIT0+BIT6); P1SEL &=~BIT7; P2SEL2 &=~BIT7; P2OUT|=(BIT0+BIT6); P2DIR|=(BIT0+BIT6); P1OUT|=BIT7; P1DIR|=BIT7; //设置端口P1.4、P1.5允许中断 P1SEL &=~(BIT4+BIT5); P1SEL2 &=~(BIT4+BIT5); P1OUT |=(BIT4+BIT5);; P1REN |=(BIT4+BIT5); P1DIR &=~(BIT4+BIT5); P1IES |=(BIT4+BIT5); P1IFG &=~(BIT4+BIT5); P1IE |=(BIT4+BIT5); _EINT(); //总中断允许 for (;;) //主循环 { Blink(); if(flag==1) { Buzz(); flag=0; } else if(flag==2) { Blink2(); flag=0; } } } #pragma vector=PORT1_VECTOR __interrupt void port_ISR( ) { if((P1IFG&BIT4)!=0) { flag=1; P1IFG &=~BIT4; } if((P1IFG&BIT5)!=0) { flag=2; P1IFG &=~BIT5; } } 4.(选做)按键抖动处理
为了去除这些毛刺带来的影响,进行按键消抖,需要在响应了第一次下降沿后,加入一定的延时,躲过其它电压毛刺的产生时间。具体代码如下: #include \#include %unsigned int number=0; //记录响应按键次数 void delay( ) //延时函数 { unsigned int j; for (j=0;j<0xffff;j++); } int main( void ) { WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 __disable_interrupt(); //_DINT(); 禁止总中断 P2SEL=0; //置P2为基本I/O功能 P2SEL2=0; // P2OUT=0xFF; //置P2输出的初值 P2DIR=0xFF; //置P2为输出方向 P1SEL &= BIT2; P1SEL2 &= BIT2; P1OUT |=BIT2;; P1REN |=BIT2; P1DIR &=~BIT2; P1IES |= BIT2; P1IFG &=~BIT2; P1IE |= BIT2; __enable_interrupt(); while(1){ }; } //_EINT(); 总中断运行
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库清华大学计算机硬件技术基础实验报告(2)在线全文阅读。
相关推荐: