历史上的今天
今天是: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 ,选择上拉 }
史海拾趣
Linux是单体内核,即将图形、驱动及文件系统等功能全在操作系统内核中实现,运行在内核状态和同一地址空间,其优点是减少了进程间通信和状态切换的系统开销,获得较高的运行效率;缺点是内核比较庞大!
WinCE是微内核,即在内核中实现基本功能, ...… 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时需要修改的代码,哪位高手知道的,麻烦指导下。… 我是初学,最近被此问题困扰了好多天,
打开inputPanel后,改变输入法,inputPanel的高度会改变,此时如何捕获该事件。
我使用C#,开发环境vs 2005,.net CF 2.0。
希望解释能详细些,我是初学。
还有我的 ...… 研究了N就,PG128128A资料到底怎么驱动,谁有能提供详细资料
12864及以下的我会,就是不会PG128128A的
邮箱 zoujun224@qq.com… 请教大家有没有用过 5V和3.3V接口电压转换芯片,我需要DSP2812外接DS18B20和其他几个5V峰值的转速信号,需要做电平转换,但是不知道使用什么样的接口电压转换芯片,需要方向控制的就不要介绍了,比如:SN74LVC164245。我需要的是自动双向转换电平的 ...…




