700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > MSP430 MSP430单片机输入/输出模块 通用I/O端口GPIO LED按键

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

时间:2018-08-29 15:30:35

相关推荐

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

 DO OR DIE

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

一、原理图二、I/O端口常用操作C语言描述及常用C语言解析1、MSP430头文件中的标准位2、I/O端口常用操作C语言描述三、实验1、LED交替闪烁2、呼吸灯3、独立按键控制LED亮灭4、矩阵按键

一、原理图

 ●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 timerLED_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 600void LED_init(void);void main(void){volatile unsigned int delay;unsigned int tH;WDTCTL = WDTPW | WDTHOLD;// stop watchdog timerLED_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 timerLED_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){//S1P2DIR &= ~BIT1; //置0 ,方向输入(默认)P2REN |= BIT1; //置1 ,启用上下拉P2OUT |= BIT1; //置1 ,选择上拉//S2P1DIR &= ~BIT1; //置0 ,方向输入(默认)P1REN |= BIT1; //置1 ,启用上下拉P1OUT |= BIT1; //置1 ,选择上拉}

4、矩阵按键

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。