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