MSP430 MSP430单片机输入/输出模块 通用I/O端口GPIO LED&按键

 DO OR DIE
在这里插入图片描述




一、原理图

 ●MSP430F5529 LaunchPad实验板上仅有的两个独立按键和LED。
在这里插入图片描述


二、I/O端口常用操作C语言描述及常用C语言解析

1、MSP430头文件中的标准位

 在每一个具体的430型号单片机的头文件中都可以找到(如msp430F5529.h)。

/************************************************************
* STANDARD BITS
************************************************************/

#define BIT0                   (0x0001)
#define BIT1                   (0x0002)
#define BIT2                   (0x0004)
#define BIT3                   (0x0008)
#define BIT4                   (0x0010)
#define BIT5                   (0x0020)
#define BIT6                   (0x0040)
#define BIT7                   (0x0080)
#define BIT8                   (0x0100)
#define BIT9                   (0x0200)
#define BITA                   (0x0400)
#define BITB                   (0x0800)
#define BITC                   (0x1000)
#define BITD                   (0x2000)
#define BITE                   (0x4000)
#define BITF                   (0x8000)

/***********************************************************

2、I/O端口常用操作C语言描述

总结:
xxxx |= BITx //置1
xxxx &= ~BITx //置0

例1
将P1.0口定义为输出且为高电平:

P1DIR |= 0x01;
P1OUT |= 0x01;

或用标准位表示:

P1DIR |= BIT0;
P1OUT |= BIT0;

例2
将P1.7口定义为输入且为低电平:

P1DIR &= ~BIT7;
P1OUT &= ~BIT7;

或
P1DIR |= 0x7F;
P1OUT |= 0x7F;

例3
将P1.0,P1.1口定义为输出且为高电平:

P1DIR |= BIT0+BIT1;
P1OUT |= BIT0+BIT1;

或
P1DIR |= 0x03;
P1OUT |= 0x03;

例4
将P1.0,P1.1口定义为输入且为低电平:

P1DIR &= ~(BIT0+BIT1);
P1OUT &= ~(BIT0+BIT1);

或
P1DIR |= 0xfc;
P1OUT |= 0xfc;

例5
将一位或几位翻转,比如原来P1.0是高(低)电平,现在要变成低(高)电平

P1OUT ^= BIT0;

例6
检测一位或几位是否为1,一般用于条件或判断语句中。

if(P1IN & BIT0)   //检测P1.0是否为1

三、实验

1、LED交替闪烁

#include <msp430F5529.h>

void LED_init(void);

void main(void)
{
    volatile unsigned int delay;

	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	
	LED_init();

	while(1)
	{

	    P1OUT ^= BIT0;  //取反
	    P4OUT ^= BIT7;  //取反
	    for(delay=0;delay<50000;delay++);
	}
}


void LED_init(void)
{
   P1DIR |= BIT0;  //置1 ,方向输出
   P1OUT &= ~BIT0;  //输出0,灭灯

   P4DIR |= BIT7;  //置1 ,方向输出
   P4OUT |= BIT7;  //输出1,亮灯

}

2、呼吸灯

#include <msp430F5529.h>

#define Pulse_Width 600

void LED_init(void);

void main(void)
{
    volatile unsigned int delay;

    unsigned int tH;

	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	
	LED_init();

	while(1)
	{
	    for(tH=Pulse_Width;tH>0;tH--)   //由强到弱
	    {
             P1OUT |= BIT0;  //输出1,亮灯
             for(delay=0;delay<tH;delay++);

             P1OUT &= ~BIT0;  //输出0,灭灯
             for(delay=0;delay<(Pulse_Width - tH);delay++);
	     }

        for(tH=0;tH<Pulse_Width;tH++)  //由弱到强
        {
             P1OUT |= BIT0;  //输出1,亮灯
             for(delay=0;delay<tH;delay++);

             P1OUT &= ~BIT0;  //输出0,灭灯
             for(delay=0;delay<(Pulse_Width - tH);delay++);
         }
    }
}




void LED_init(void)
{
   P1DIR |= BIT0;  //置1 ,方向输出
   P1OUT &= ~BIT0;  //输出0,灭灯

   P4DIR |= BIT7;  //置1 ,方向输出
   P4OUT |= BIT7;  //输出1,亮灯

}

3、独立按键控制LED亮灭

 ●MSP430每个IO口都具有方向,读取外部电平时,需要先将IO口设置为输入方向,又由于板子上的按键没有接上拉电阻,为时使读取结果更加准确,使用内部上拉电阻。
 ●重点在void key_init(void);函数

 ●用软件延时去写长按短按,单击双击感觉误差挺大的,意义不大,不如用定时器去写。
 ●关于独立按键的原理可参考 独立按键的原理

#include <msp430F5529.h>

#define Delay10ms() for(delay=0;delay<500;delay++)

void LED_init(void);
void key_init(void);

void main(void)
{
    volatile unsigned int delay;



	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	
	LED_init();
	key_init();

	while(1)
	{
      if((P2IN & BIT1) == 0)
      {
          Delay10ms();
          if((P2IN & BIT1) == 0)
          {
              P1OUT ^= BIT0;  //取反
              P4OUT ^= BIT7;  //取反

              while(!(P2IN & BIT1));  //松手检测
          }
      }

    }
}




void LED_init(void)
{
   P1DIR |= BIT0;  //置1 ,方向输出
   P1OUT &= ~BIT0;  //输出0,灭灯

   P4DIR |= BIT7;  //置1 ,方向输出
   P4OUT &= ~BIT7;  //输出0,灭灯

}

void key_init(void)
{
    //S1
    P2DIR &= ~BIT1;  //置0 ,方向输入(默认)
    P2REN |= BIT1;  //置1 ,启用上下拉
    P2OUT |= BIT1;  //置1 ,选择上拉

    //S2
    P1DIR &= ~BIT1;  //置0 ,方向输入(默认)
    P1REN |= BIT1;  //置1 ,启用上下拉
    P1OUT |= BIT1;  //置1 ,选择上拉
}

4、矩阵按键

  • 3
    点赞
  • 0
    评论
  • 6
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页

打赏

#法外狂徒张三

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者