<B>ClearPending(BIT_EINT8_23);<br />//这里BIT_EINT8_23是固定的值(0x1<<5)吗?为什么要在_irq IRQ_KEY函数里执行。<br />#define ClearPending(bit) {<br /> rSRCPND = bit; //设置中断源未决寄存器<br /> rINTPND = bit; //设置中断源未决寄存器<br /> rINTPND; //<font color=#FF0000>这是什么意思呢?</font><br /> } <br />//Wait until rINTPND is changed for the case that the ISR is very short.<br /><br />EINT_Init函数中<br />pISR_EINT8_23 = (unsigned int)IRQ_KEY;//这句话有什么作用?ClearPending(BIT_EINT8_23); // 清除中断标志位<font color=#FF0000>又清?</font></B><br /><br />阿南的源代码如下:<br />#include "2410addr.h"<br /><br />#define KEY1 (1 << 3)//GPG3,EINT11<br />#define KEY2 (1 << 6)//GPG6,EINT14//GPG7,EINT15<br />#define KEY3 (1 << 7)//GPG7,EINT15//GPG8,EINT16<br />#define KEY4 (1 << 11)//GPG11,EINT19<br /><br />#define LED1 (1 << 4)//GPF4<br />#define LED2 (1 << 5)//GPF5<br />#define LED3 (1 << 6)//GPF6<br />#define LED4 (1 << 7)//GPF7<br /><br />/*******************************************************************************************<br />函数原形:void __irq IRQ_KEY(void)<br />功能描述:键盘中断处理程序,当产生键盘中断后将读取键值,重新刷新LED显示<br />参 数:无 <br />*******************************************************************************************/<br />void __irq IRQ_KEY(void)<br />{<br /> unsigned int i;<br /> ClearPending(BIT_EINT8_23);<br /> rEINTPEND = 0xffffff;<br /> rGPGCON = rGPGCON & (~((3 << 6) | (3 << 12) | (3 << 14) | (3 << 22)));//设置为输入状态<br /> if (rGPGDAT & KEY1){//当KEY1被按下时,LED亮,否则灭<br /> rGPFDAT |= LED1;//熄灭LED1 <br /> }<br /> else {<br /> rGPFDAT &= ~LED1;//点亮LED1<br /> }<br /> if (rGPGDAT & KEY2){<br /> rGPFDAT |= LED2; <br /> }<br /> else {<br /> rGPFDAT &= ~LED2; <br /> }<br /> if (rGPGDAT & KEY3){<br /> rGPFDAT |= LED3; <br /> }<br /> else {<br /> rGPFDAT &= ~LED3; <br /> }<br /> if (rGPGDAT & KEY4){<br /> rGPFDAT |= LED4; <br /> }<br /> else {<br /> rGPFDAT &= ~LED4; <br /> }<br /> rGPGCON |= (2 << 6) | (2 << 12) | (2 << 14) | (2 << 22);//重新设置外部中断输入功能<br />}<br /> <br />/*******************************************************************************************<br />函数原形:void __irq IRQ_KEY(void)<br />功能描述:键盘中断初始化,将按键输入管脚设置成外部中断输入功能,双边沿触发,IRQ中断模式<br />参 数:无 <br />*******************************************************************************************/<br />void EINT_Init(void)<br />{<br /> rGPGCON &= (~((3 << 6) | (3 << 12) | (3 << 14) | (3 << 22)));<br /> rGPGCON |= (2 << 6) | (2 << 12) | (2 << 14) | (2 << 22);<br /> //rGPGCON[23:22],[15:14],[13:12],[7:6]=10b,即GPG[11,7,6,3]为外部中断输入功能<br /> rEXTINT1 = rEXTINT1 & (~((7 << 12) | (7 << 24) | (7 << 28))) | ((6 << 12) | (6 << 24) | (6 << 28));<br /> //EINT11,EINT14,EINT15下降沿触发中断 <br /> rEXTINT2 = rEXTINT2 & (~(7 << 12)) | (6 << 12);//EINT19下降沿触发中断 <br /> pISR_EINT8_23 = (unsigned int)IRQ_KEY;<br /> rPRIORITY = 0x00000000; // 使用默认的固定的优先级<br /> ClearPending(BIT_EINT8_23); // 清除中断标志位<br /> rEINTPEND = 0xffffff;<br /> rINTMOD = 0x00000000; // 所有中断均为IRQ中断<br /> rINTMSK &= (~BIT_EINT8_23); // 使能外部中断8_23 <br /> rEINTMASK &= (~((1 << 11) | (1 << 14) | (1 << 15) | (1 << 19)));//使用能EINT11,EINT14,EINT15,EINT17<br />}<br /><br />void Main(void){ <br /> rGPFCON = (rGPFCON & 0x00ff) | 0x5500;//设置GPF[7:4](LED[4:1])为输出功能<br /> rGPFDAT |= LED1 | LED2 | LED3 | LED4;<br /> EINT_Init();<br /> while (1);<br />}
|