//在系统上实现按一次按键,对应的发光二极管状态改变一次
#include <msp430x14x.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P2DIR = 0XfF; //全部P2口设置为输出
P2OUT = 0Xff; // 全部P2口设置为高电平 灯全灭
P1OUT = 0Xff; //P1口全部设置为高电平
P1DIR = 0Xf0; //全部P1口按键设置为输入,其他的为输出
P1IES = 0X0f; //P1口按键设置为下降沿触发
P1IFG = 0; //设置P1口全部无中断请求
P1IE = 0X0f; //P1.0~P1.3中断允许
_EINT(); //开总中断
while(1)
_BIS_SR(LPM4_bits); //进入低功耗模式4
}
//#pragma它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。
/*MSP430内部有一个中断向量表,只要往里面对应向量(实际也是某地址)填相应函数的首地址,
该中断发生时,就能根据填入的函数首地址自动跳转到该函数。
#pragma vector=这句话就是给这个中断向量表进行赋值的。
#pragma vector=PORT1_VECTOR表示给这个向量表中的外部端口中断所对应的地址进行赋值,
并赋值为函数void Port_1(void)的首地址。
其中,关键字__interrupt则表示这个函数是中断服务函数这种特殊函数。*/
#pragma vector = PORT1_VECTOR //“告诉”编译器把PORT1_VECTOR作为中断函数处理
__interrupt void PORT1_ISR(void) //键盘中断
{
unsigned int i;
unsigned char temp;
temp = P1IFG;
for(i=0;i<0x1fff;i++); //按键消抖
if((P1IN&temp) == (!temp)) //判断按键是否按了一次
{
switch(temp)
{
case 1: P2OUT ^= 0X01;break; //P2.0状态改变,即LED1状态改变
case 2: P2OUT ^= 0X02;break; //P2.1状态改变,即LED2状态改变
case 3: P2OUT ^= 0X04;break; //P2.2状态改变,即LED3状态改变
case 4: P2OUT ^= 0X08;break; //P2.3状态改变,即LED4状态改变
}
}
P1IFG = 0; //清楚中断请求位,为什么要清楚中断请求位
//中断标志位不清除, 结果是完成中断处理程序后,
//它就继续再进中断, 根本不会回到主程序。
}
msp430学习笔记_按键点亮LED(每个代码都有详解,也就是为什么这么做)
最新推荐文章于 2023-06-06 10:15:17 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)