非常简单的一个程序,在F5529的开发板上用按键的IO中断控制LED的亮灭:
#include
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P1DIR |= BIT0; //将LED1对应的IO口P1.0设置为输出
P1OUT &= ~BIT0; //初始化该灯设置为灭
P1DIR &= ~BIT7; //将按键1对应的IO口P1.7设置为输入
P1IFG &= ~BIT7; //初始化清空中断标志位
P1IE |= BIT7; //P1.7中断使能
P1IES |= BIT7; //下降沿产生中断
P1OUT |= BIT7; //P1.7设置为上拉电阻:OUT = 1; REN = 1;
P1REN |= BIT7;
__enable_interrupt();
while(1);
}
#pragma vector = PORT1_VECTOR //固定格式,声明中断向量地址,不能变
__interrupt void LED(void) //函数名,可以任意定义
{
int i;
switch(__even_in_range(P1IV,18))
{
case 0x10:
for (i = 0; i < 12000; i++);
if ((P1IN & BIT7) == 0) //注意位运算的优先级!!!非常重要
P1OUT ^= BIT0;
break;
default:
break;
}
}
经验总结:
1. 按键需要延时消抖
2. 标志位需要手动清零 (此处不完全正确,还有问题需要考虑)
3. 中断程序格式:
#pragma vector = PORT2_VECTOR //固定格式,声明中断向量地址,不能变
__interrupt void fuck430(void) //函数名,可以任意定义
{
switch(__even_in_range(P2IV,18))
{
case 0x06:
…
break;
default:
break;
}
}
4. 主程序中要开总中断,然后有循环
5. 位运算的优先级很低,注意加括号
6. 按键的上拉电阻,OUT、REN、IES
一上午终于把IO中断弄懂了。吸取位运算优先级的教训。
上一篇:MSP430F5438时钟系统
下一篇:浅谈msp430f5529入门(1)——时钟模块DCO
推荐阅读最新更新时间:2024-11-17 10:36
设计资源 培训 开发板 精华推荐
- AS431可调精密并联稳压器的典型应用
- 使用 MaxLinear, Inc 的 SP6122 的参考设计
- 1.5V无线键鼠改充电方案
- DC143A-F,使用 LTC1475CMS8-5、5V @ 300mA 高效降压 DC/DC 转换器的演示板
- DC1538A,使用 LT6350CMS8 低噪声单端转差分放大器 SAR ADC 驱动器的演示板
- 使用 ROHM Semiconductor 的 BA80BC0FP-E2 的参考设计
- 7路红外循迹模块
- LT1937ES5 演示板,具有板载电池的单节白光 LED(4) 驱动器,输入电压 2.7V - 5V
- LT1071 正负降压/升压转换器的典型应用
- 小白入门级体验自制键盘——Az40_百变怪_V3