历史上的今天
今天是:2025年02月28日(星期五)
2020年02月28日 | MSP430系列嵌入式实验教程---GPIO
2020-02-28 来源:eefocus
端口控制寄存器
端口P1具有输入/输出、中断和外部模块功能,这些功能可通过7个控制寄存器的设置来实现。下面介绍
各控制寄存器特点及其使用:
PxDIR 输入/输出方向寄存器

相互独立的8位分别定义了Px 口的8位的输入输出方向。
使用输入/输出功能时,应先定义端口方向。作为输入时,只能读;作为输出时,可读可写。
PxDIR.x:端口输入输出方向控制
0:输入模式
1:输出模式
操作:
P1DIR |=0x10; // P1.4作输出,其余各位端口方向不变。
P1DIR &=0x7f; // P1.7作输入,其余各位端口方向不变。
PxIN 输入寄存器

该寄存器是只读寄存器。只能通过读取该寄存器内容才能知道Px 口的输入信号的状态。
读出此寄存器的内容中,只有Px口设为输入的数据位有效。
对于 Px口设为输出的那些位,一般来说,PxIN.x = PxOUT.x
PxIN.x:端口输入的电平
0:端口输入低电平
1:端口输入高电平
操作:
unsigned char Temp;
P1DIR &=0x77 ; // P1.3和P1.7输入
Temp = P1IN; // Temp为在已定义的一变量,Temp 中只要第7位和第四位有效。
PxOUT 输出寄存器

该寄存器可读可写,读取时,其内容与Px 口引脚定义无关。改变方向寄存器的内容,此寄存器内容不受
影响。
PxOUT.x:端口输出的电平
0:端口输出低电平
1:端口输出高电平
注意:
P1OUT.0 = 1(P1.0输出高),但是P1DIR.0 = 0(该引脚为输入模式),则此时P1.0为输入;
如果将P1DIR.0 = 1(该引脚为输出模式),则此时P1.0为输出,并且输出为高电平。
操作:
P1DIR |=0x88; // P1.3和P1.7输出
P1OUT |=0x88; // P1.3和P1.7输出高电平
MSP430的位操作
RISC精简指令集
MSP430属于RISC型处理器,与普通51类型的复杂指令集的区别在于RISC型处理器不能进行位操作,也就上内存寻址只能到字节不能到位。举个例子来说,一栋楼只有一个邮政编码,快递员送东西只送到楼,显然比送到户要快,但至于包裹具体是哪户人家的就得再想点办法了。
写位操作
对某个字节直接使用“=”进行写操作时,所有的位的值都将改变。如果先将原字节的值读出来,使用位操作对原字节进行赋值,就可以“等效”实现对单个位的写操作。
/* 设定P1OUT原始值为b'0101 1010 */
P1OUT |= 0x01; /* P1OUT = P1OUT | b'0000 0001
b'0101 1010 //P1OUT:0x5A
| b'0000 0001 //0x01
_________________
b'0101 1011 //P1OUT:0x5B
或操作可以实现对特定位置1 */
P1OUT &= ~0x10; /* P1OUT = P1OUT & b'1110 1111
b'0101 1011 //P1OUT:0x5B
& b'1110 1111 //0xEF
_________________
b'0100 1011 //P1OUT:0x4B
与操作可以实现对特定位置0 */
P1OUT ^= 0x02; /* P1OUT = P1OUT ^ b'0000 0010
b'0100 1011 //P1OUT:0x4B
& b'0000 0010 //0x02
_________________
b'0100 1001 //P1OUT:0x49
异或操作可以实现对特定位取反*/
这样可以实现只对特定位进行操作而不影响其他位的值。
另外为了方便操作在”msp430xxx.h"里还包含了各种宏定义来辅助位操作。
#define BIT0 (0x0001u)
#define BIT1 (0x0002u)
#define BIT2 (0x0004u)
#define BIT3 (0x0008u)
#define BIT4 (0x0010u)
#define BIT5 (0x0020u)
#define BIT6 (0x0040u)
#define BIT7 (0x0080u)
#define BIT8 (0x0100u)
#define BIT9 (0x0200u)
#define BITA (0x0400u)
#define BITB (0x0800u)
#define BITC (0x1000u)
#define BITD (0x2000u)
#define BITE (0x4000u)
#define BITF (0x8000u)
有了BIT0-BITF后,可以方便地对寄存器的各位进行设置,不用再一个一个去数二进制的位数了。上述代码可以改写为:
P1OUT |= BIT0; //P1.0 输出高电平
P1OUT &= ~BIT4 //P1.4 输出低电平
P1OUT ^= BIT1; //P1.1 电平取反
另外也可以多个位一起操作:
P1OUT | = BIT3 + BIT5 +BIT6; //P1.3 P1.5 P1.5 输出高电平
P2OUT & = ~BIT2 + ~BIT4 + ~BIT7; //P2.2 P2.4 P2.7 输出低电平
读位操作
if((P1IN&BIT6) == BIT6) //如果P1.6输入高电平 b'0100 1010 & b'0100 0000 = b'0100 0000
// b'0000 1010 & b'0100 0000 = b'0000 0000
P2OUT |= BIT0; //P2.0输出高电平
else
P2OUT &= ~BIT0; //P2.0输出低电平
其他功能寄存器后请查阅后续教程
史海拾趣
|
百度的答案,还请大家深入说说: RFIC是RF System 里的Block做成IC ,,基本上成品就是IC ; 而RFID是Radio-frequency identification 是一个系统,有特定的规范。 二者是否有确定的包含与被包含的关系呢?… 查看全部问答> |
|
Lazarus是一个类似Delphi的IDE,其语言是Free Pascal,开发方式就是RAD,自从2.2.0 FPC(Free Pascal Compile)开始,就支持WINCE -ARM平台。使用Lazarus开发,界面可以比C#丰富,且更为简单,但是速度会快很多,因为Lazarus生成的是二进制EXE,而 ...… 查看全部问答> |
|
安装CE6的SP1出错toolMsmCA(Error):Setup package issue or CoreCon。。。 安装CE6的SP1是出错 “ToolMsmCA(Error):Setup package issue or CoreCon DataStore corrupted:CDeviceSDKInstallShin Add/Remove failed.HR=0x80004005. 我之前装了VS2005。 这几天才装这个,不知怎么出错,安装进度停在Installing the Gene ...… 查看全部问答> |
|
各位,最近在开发一个驱动的时候需要检测内存泄漏,于是自己重载了new/delete,在win32下测了一下没问题,于是决定将其加入到当前的驱动下。可是,问题来了,总是出现LNK2005的错误,我查了一下这个错,应该是连接顺序的问题,出错信息显示在DDK中 ...… 查看全部问答> |
|
市场有一款是uc/os 8 位的代码打印机。 可以接扫描枪,扫入条码,然后按键。打印出一个新条码。 现在想开发这样的东东。谁做过啊? 着急啊。请求指点,合作都可以… 查看全部问答> |
|
近来老板搞了点垃圾产品,在生产时用的是BSOB,但第二点不是翘线就是打不上,很多参数都用过了,不知还有哪里没想到的。求教怎样可以使ASM eagle60 W/B 的BSOB达到最佳。… 查看全部问答> |
|
之前用过MDK4.22版的 反正觉得有点问题,编译的时候 似乎没有错会报错 于是就换成了4.21版本的 附件是一个被压缩的工程包,此工程包过对PWM、定时器、串口、OLED(基于GR_LIB)、按键、LED等模 块的使用。建工程就不说了 相信用keil软件的 ...… 查看全部问答> |
|
单片机适用于电子玩具、工业控制、民用电器、机电一体化产品、航天航海等众多领域,而单片机的应用开发不单是软件的开发,其开发语言和硬件密切相关。所以只有开发者对单片机的内部结构非常了解,才能编好软件。而单片机的开发应用还涉及到硬件扩展 ...… 查看全部问答> |




