历史上的今天
返回首页

历史上的今天

今天是:2025年02月05日(星期三)

正在发生

2021年02月05日 | MSP430单片机输入/输出模块—通用I/O端口GPIO—LED&按键

2021-02-05 来源:eefocus

一、原理图

 ●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


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


#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

             P1OUT &= ~BIT0;  //输出0,灭灯

             for(delay=0;delay<(Pulse_Width - tH);delay++);

     }


        for(tH=0;tH        {

             P1OUT |= BIT0;  //输出1,亮灯

             for(delay=0;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


#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 ,选择上拉

}


推荐阅读

史海拾趣

Diotec Electronics Corp公司的发展小趣事

Diotec Electronics Corp公司成立于XXXX年,由一群富有激情的工程师和技术专家创立。在初创期,公司专注于研发高性能的电子元器件,以应对当时市场上对高效率和可靠性元件的迫切需求。通过不断的技术创新,Diotec成功开发出了一款具有革命性的整流二极管,该产品以其卓越的性能和稳定性迅速赢得了市场的认可,为公司的发展奠定了坚实的基础。

Giga公司的发展小趣事
通过定时控制LED灯的亮灭,实现视觉效果。
GSME Electronics公司的发展小趣事

随着生产设备的引进和技术团队的壮大,GSME Electronics开始专注于半导体器件的研发与生产。公司产品线逐渐丰富,涵盖了片式各种系列表面贴装的小信号三极管、中功率驱动三极管、肖特基、开关二极管及小功率可控硅等多种半导体分立器件。这些产品广泛应用于移动通信、计算机、消费类电子信息产品、家用电器、工业自动化控制设备等领域,满足了市场的多样化需求,推动了公司业务的快速增长。

振华(CEC)公司的发展小趣事

中国振华电子集团有限公司(简称振华)自成立之初,就致力于电子产品的研发与生产。初期,公司面临着技术落后、资金短缺等诸多困难,但创始人及团队凭借坚定的信念和不懈的努力,成功开发出了一系列具有市场竞争力的电子产品。随着产品质量的提升和市场份额的扩大,振华逐渐在电子行业中崭露头角。

Brainboxes公司的发展小趣事

Brainboxes公司成立于1984年,总部位于英国利物浦市。创立之初,公司专注于数据和I/O连接产品的设计和制造。凭借对串行通信技术的深刻理解,Brainboxes迅速在行业内崭露头角。其早期产品,如串口服务器和适配器,因高度可配置和可靠的特性而受到市场的欢迎。随着业务的发展,公司逐渐扩大产品线,涵盖IO模块等多个领域。

CNC Tech公司的发展小趣事

CNC Tech公司的创立源于几位电子工程领域的资深专家对于高精度数控加工技术的共同追求。他们发现,随着电子行业的快速发展,对高精度、高效率的数控加工技术的需求日益迫切。于是,他们决定集结力量,共同创立CNC Tech公司,专注于研发和生产先进的数控加工设备。凭借着对技术的执着和热情,CNC Tech在创立初期就成功开发出多款具有竞争力的产品,奠定了其在行业内的技术基石。

问答坊 | AI 解惑

再议Linux与WinCE

Linux是单体内核,即将图形、驱动及文件系统等功能全在操作系统内核中实现,运行在内核状态和同一地址空间,其优点是减少了进程间通信和状态切换的系统开销,获得较高的运行效率;缺点是内核比较庞大! WinCE是微内核,即在内核中实现基本功能, ...…

查看全部问答>

ad783怎么用?

本帖最后由 paulhyde 于 2014-9-15 09:40 编辑 我实在是不知道这个东东怎么用啊,大家帮一下我吧!  …

查看全部问答>

AVR辅助开发工具

有助于写显示驱动和通信程序…

查看全部问答>

请问这个是怎么理解的设置定时器定时时间

void vSetMotorTimer(unsigned short uiTime)// uiTime us   {      RCAP2LH = uiTime;  }  //重新载入定时数据   void vUpdateMotorTimer(void)  {      T2LH=RCAP2L ...…

查看全部问答>

有没有人研究过mini2440的BSP,其BSP是如何识别128M/256M等flash的?

因为我使用的是QQ2440,但是我发现最新的mini2440的BSP更新了很多驱动,我想移进去QQ2440使用,但是可惜烧写进去后不能启动。 我觉得想搞好这个bsp必须先知道如何使用其他flash时需要修改的代码,哪位高手知道的,麻烦指导下。…

查看全部问答>

求介绍一些wince编程书籍

求介绍一些wince编程书籍…

查看全部问答>

C#如何捕获inputPanel输入法改变的事件

我是初学,最近被此问题困扰了好多天, 打开inputPanel后,改变输入法,inputPanel的高度会改变,此时如何捕获该事件。 我使用C#,开发环境vs   2005,.net   CF   2.0。 希望解释能详细些,我是初学。 还有我的 ...…

查看全部问答>

PG128128A资料

研究了N就,PG128128A资料到底怎么驱动,谁有能提供详细资料 12864及以下的我会,就是不会PG128128A的 邮箱 zoujun224@qq.com…

查看全部问答>

惭愧啊,st网站上想找点东西太难了

                                 也不知道是自己笨还是网站不太合理,反正在他官网上从来都没找到自己想要的东西,搜到的许多野都是指向其官网,可 ...…

查看全部问答>

DSP2812 5V和3.3V接口电压转换芯片

请教大家有没有用过 5V和3.3V接口电压转换芯片,我需要DSP2812外接DS18B20和其他几个5V峰值的转速信号,需要做电平转换,但是不知道使用什么样的接口电压转换芯片,需要方向控制的就不要介绍了,比如:SN74LVC164245。我需要的是自动双向转换电平的 ...…

查看全部问答>