MSP430F5529学习笔记2

通过不同按键操作控制led闪烁

源码

主函数

//按下P2.1,LED1亮1s,快速按下P2.1两次,LED2亮1s

#include "msp430f5525.h"

unsigned int n=0;

int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer

    //DIR方向寄存器
    P1DIR |= BIT0;   //led1.0作为输出
    P4DIR |= BIT7;   //led4.7作为输出
    P2DIR &= ~BIT1;
    P2REN |= BIT1;   //上下拉寄存器
    P2OUT |= BIT1;
    P1OUT &= ~BIT0;
    P4OUT &= ~BIT7;

    P2IE |= BIT1;     //中断使能寄存器
    P2IES |= BIT1;
    P2IFG &= ~BIT1;   //中断标志寄存器
    _EINT();

    while(1)
    {
        if(n==0)     //两灯都不亮
        {
            P1OUT &= ~BIT0;
            P4OUT &= ~BIT7;
        }
        else if(n==1)    //P1.0亮
        {
            P1OUT |= BIT0;
            P4OUT &= ~BIT7;
            __delay_cycles(1000000);
            n=0;
        }
        else if(n==2)  //P4.7亮
        {
            P1OUT &= ~BIT0;
            P4OUT |= BIT7;
            __delay_cycles(1000000);
            n=0;
        }
    }
    return 0;
}

中断函数

控制按键与led灯闪烁

#pragma vector = PORT2_VECTOR
__interrupt void Port2()
{
    unsigned int i=0;
    if(!(P2IN & BIT1))        //如果2.1按键没有按下
    {
        __delay_cycles(5000);      //消抖
        if(!(P2IN & BIT1))
        {
            //__delay_cycles(5000);       //如果还是处于按下的状态,即视作未松手,第一次按下
            while(!(P2IN & BIT1)){}           //第一次松手
            n = 1;
            P2IFG &= ~BIT1;
            //__delay_cycles(50000);         //500ms后如果有按键按下,视作第二次按下
            while((P2IN & BIT1))            //500ms-1000ms内如果不按下,视为只按一次
            {
                i++;
                __delay_cycles(1000);
                if(i>1000)
                    return;
             }                              //程序因按下按键在此处跳出
             if(!(P2IN & BIT1))
             {
                 __delay_cycles(5000);       //消抖
                 if(!(P2IN & BIT1))
                 {
                     while(!(P2IN & BIT1)){}           //第二次松手
                     n = 2;
                     P2IFG &= ~BIT1;
                 }
             }
        }
    }
}

各种寄存器名称及用法

PxDIRPxRENPxOUTI/O功能
00x输入
010输入带下拉电阻
011输入带上拉电阻
1xx输出
  • 方向寄存器PxDIR
    BIT = 0 输入
    BIT = 1 输出
    无论使用I/O功能还是其他功能(比如中断,比较器,定时器),方向寄存器都必须初始化

  • 输入寄存器PxIN
    BIT = 1 输入为高
    BIT = 0 输入为低
    PxIN为只读寄存器,当尝试对这些寄存器进行写操作时,会消耗大量电流

  • 输出寄存器PxOUT
    BIT = 0 输出为低
    BIT = 1 输出为高
    当引脚设定为IO功能,输入方向,上下拉寄存器使能时,
    BIT = 0 下拉
    BIT =1 上拉

  • 输出驱动强度寄存器PxDS
    BIT = 0 弱驱动(默认)
    BIT = 1 强驱动
    使用强驱动会增强I/O口的驱动能力。但MSP430属于超低功耗系列单片机,驱动能力有限,多个I/O工作于强驱动模式可能会导致电磁兼容问题甚至损坏单片机,不推荐使用强驱动模式。

  • 功能选择寄存器PxSEL
    BIT = 0 I/O功能
    BIT = 1 外围模块功能
    注意:当PxSEL = 1时,P1和P2的中断功能被关闭

  • 中断标志寄存器PxIFG
    BIT = 0 清除中断标志
    BIT = 1 出现中断,标记

  • 中断使能寄存器PxIE
    BIT = 1 进行使能
    P1IE |=0x01;//引脚P1.0中断使能

  • 中断触发边沿选择PxIES
    BIT = 0 上升沿触发
    BIT = 1 下降沿触发
    注意:当向PxIES写入时,当前的PxIN状态将会影响中断触发

PxIESPxINPxIFG
0→10触发
0→11不触发
1→00不触发
1→01触发
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我会为您提供关于 MSP430F5529 的 ADC12 学习笔记MSP430F5529 是德州仪器(Texas Instruments)公司推出的一款低功耗微控制器,它具有 12 位的模数转换器(ADC12)模块,可以用于采集模拟信号。 ADC12 模块具有多个配置选项和功能,下面是一些相关的学习笔记: 1. ADC12 基本配置:首先,您需要对 ADC12 进行基本的配置。这包括选择参考电压源、设置采样保持时间、选择转换时钟源等。可以通过配置控制寄存器(ADC12CTL0 和 ADC12CTL1)来完成这些设置。 2. 通道选择:ADC12 可以选择多个输入通道进行采样。您可以使用 ADC12MCTLx 寄存器来选择所需的输入通道,并进行相关的配置,如参考电压源、输入通道的输入方式(单端或差分)等。 3. 触发方式:ADC12 可以通过软件触发或外部触发进行转换。您可以使用 ADC12CTL0 寄存器来选择触发方式,并设置相应的触发源。 4. 转换结果:ADC12 转换后的结果可以通过 ADC12MEMx 寄存器进行读取。对于 12 位的转换结果,您可以直接读取 ADC12MEMx 寄存器的值。 5. 中断和DMA:ADC12 可以使用中断或 DMA 来处理转换完成后的结果。通过配置 ADC12CTL0、ADC12CTL1 和相关中断/ DMA 控制寄存器,您可以实现转换完成后的中断或 DMA 传输。 请注意,上述仅为一些基本的学习笔记MSP430F5529 的 ADC12 模块还有更多高级功能和配置选项。您可以参考 MSP430F5529 的用户手册和相关文档,以深入了解 ADC12 模块的更多细节和应用。 希望这些笔记能对您有所帮助!如果您对其他问题感兴趣,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值