二、GPIO【MSP430学习笔记】

一、GPIO口配置

    MSP430F249有6组IO 端口,即P1~P6,每一组IO口都有8个可独立编程引脚,比如P1有P1.0 ~ P1.7。在MSP430所有的端口都有控制输入输出方向和进行输入、输出的能力。其中P1、P2口具有外部中断的功能,第二功能可通过寄存器进行控制,外部中断有三个寄存器,中断使能,中断触发控制,中断标志位。

在这里插入图片描述
端口P1具有输入/输出、中断和外部模块功能,这些功能可通过7个控制寄存器的设置来实现。下面介绍
各控制寄存器特点及其使用:
1、PxDIR 输入/输出方向寄存器
输入/输出方向寄存器
相互独立的8位分别定义了Px 口的8位的输入输出方向。
使用输入/输出功能时,应先定义端口方向。作为输入时,只能读;作为输出时,可读可写。
PxDIR.x:端口输入输出方向控制

  • 0:输入模式
  • 1:输出模式
    操作:
    P1DIR |=0x10; // P1.4作输出,其余各位端口方向不变。
    P1DIR &=0x7f; // P1.7作输入,其余各位端口方向不变。

2、PxIN 输入寄存器
l 输入寄存器
该寄存器是只读寄存器。只能通过读取该寄存器内容才能知道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位和第四位有效。

3、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输出高电平

4、上下拉电阻配置
上下拉电阻是否开启由PxREN寄存器决定,而上拉还是下拉是由PxOUT寄存器决定,在作为输出时,随着PxOUT的高低,自动选择上下拉,所以平时我们没有特别的去设置内部上下拉也可以输出高电平的原因,但作为输出的时候,这个配置就必需得有,可以人为的赋值PxOUT寄存器来得到上下拉,具体如下工作原理:
在这里插入图片描述

二、对寄存器的位操作

1、比如要设置

  • P1.0为高电平输出
  • P1.1为低电平输出
  • P1.2取反
  • P1.3读取的数据
    以下三种编写方法:
    (1)不依赖头文件编写
P1OUT | = 0X01;
P1OUT & = ~0X02;
P1OUT^ = 0X04;
if((P1OUT&0X08)==0)
{
//执行代码
}

(2)在IAR环境下编写,BIT0 ——BIT7 是 0x01——0x08 的宏定义。

P1OUT | = BIT0;
P1OUT & = ~BIT1;
P1OUT^ = BIT2;
if((P1OUT&BIT3)==0)
{
//执行代码
}

(3)不依赖头文件,移位的编写方法

P1OUT | = (1<<0);
P1OUT & = ~(1<<1);
P1OUT^ = (1<<2);
if((P1OUT&(1<<3))==0)
{
//执行代码
}

2、写位操作
对某个字节直接使用“=”进行写操作时,所有的位的值都将改变。如果先将原字节的值读出来,使用位操作对原字节进行赋值,就可以“等效”实现对单个位的写操作。

/* 设定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
                             异或操作可以实现对特定位取反*/

这样可以实现只对特定位进行操作而不影响其他位的值。
3、依赖头文件对位操作
另外为了方便操作在”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输出低电平

原文链接

三、实战例程

1、IO口控制LED灯

//IO口定义
#define LED_H P5OUT | = BIT7;//熄灭LED灯
#define LED_L P5OUT & = ~BIT7;//点亮LED灯
#define LED_HL P5OUT ^ = BIT7;//翻转LED灯状态
//函数声明
void led_Init(void);
//LED灯初始化
void led_Init(void)
{
P5SEL & = ~BIT7;//设置P5.7IO为普通的I/O口
P5DIR | = BIT7;//设置P5.7IO口方向为输出 
P5OUT | = BIT7;//初始化设置P5.7IO口为高电平

2、按键输入控制LED灯

void Key_Init(void)
{
 P1SEL& = ~BIT0;  //设置P1.0的IO口为普通IO口模式
 P1DIR& = ~BIT0;  //p1.0的IO口方向为输入
 P1REN | = BIT0;  //使能P1.0内部电阻
 P1OUT | = BIT0;  //设置P1.0为内部上拉电阻为上拉方式
 
 P6SEL& = ~BIT3;  //设置P1.0的IO口为普通IO口
 P6DIR& = ~BIT3;  //设置P6.3的IO口方向为输入
 P6REN | = BIT3;  //使能P6.3的内部电阻
 P6OUT | = BIT3;  //设置P6.3内部电阻为上拉电阻方式
}
//按键扫描
u8 Kek_Scan(void)
{
static u8 KeyUpFlag = 1;
if (KeyUpFlag && (!KEY1_I || !KEY2_I))
	{
		Delay_ms(10;//延时消抖
		KeyUpFlag = 0;
		if(!KEY1_I ) return 1;
		if(!KEY2_I ) return 2;
	}
else if  (!KEY1_I || !KEY2_I)) 
	 KeyUpFlag = 1;
	 return 0;
}
//========外部中断控制LED灯=========
//独立按键底层驱动头文件
#ifndef KEY_ Н
#define KEY_ H
#include "msp430type.h'
//IO口定义
#define KEY1_ _I (P1IN & BITO)  //按键1输入
#define KEY2_ _I (P6IN & ВIT3)  //按键2输入

//按键初始化
void Key_ Init(void);
//按键扫描
u8 Kek_ Scan(void);
# endif
//主程序
#include <msp430f249.h>
#include "msp430type.h"
#include "system.h"
#include "delay.h"
#include "led.h"
#include "key.h"
//主函数
void main(void)
{
	u8Key=0;
	Wdt_ _Off();/ /关闭看门狗
	Clock_ Init();/ /系统时钟初始化Led_ Init();/ /led灯初始化
	Key_ Init();/ /按键初始化
	while(1)
	{
	Key = Kek_ Scan(); // 按键扫描
	switch(Key)
	   {
		case 1 :
		LED_ L;// 点亮led灯break;
		case 2:
		LED_ H;/ /kÉX led 'Jbreak;
		default:
		break;
		}
	}
}

3、外部中断控制LED灯状态翻转
在这里插入图片描述在这里插入图片描述
**注意:**中断函数的写法:

#pragma vector = 中断想向,
_interruot void + 函数名。

在这里插入图片描述
在这里插入图片描述

很高兴您对MSP430F149感兴趣!MSP430F149是德州仪器(Texas Instruments)推出的一款低功耗、高性能的16位微控制器。以下是一些MSP430F149的学习笔记1. 架构和特性:MSP430F149采用了精简指令集(RISC)架构,具有低功耗特性和较高的运算性能。它具有16位数据总线和16位地址总线,支持多种外设和通信接口。 2. 开发环境:在开始学习MSP430F149之前,您需要安装MSP430开发环境。您可以使用MSP430 LaunchPad开发板,以及TI的MSP430编译器和调试工具。 3. 编程语言:MSP430F149可以使用C语言或汇编语言进行编程。C语言是更常用的编程语言,可以提高开发效率和可移植性。 4. GPIO控制:MSP430F149具有多个通用输入输出引脚(GPIO),可以用于连接外部设备或传感器。您可以使用编程方法来控制这些引脚的输入和输出。 5. 定时器和计数器:MSP430F149内置了多个定时器和计数器模块,用于定时、计数和产生脉冲。您可以使用这些模块来实现定时任务和测量时间间隔。 6. 串口通信:MSP430F149支持多种串行通信接口,如UART、SPI和I2C。您可以使用这些接口与其他设备进行数据交换和通信。 7. 中断处理:MSP430F149具有强大的中断系统,可以响应外部事件和优先级处理。您可以使用中断来处理实时事件和提高系统的响应性能。 这些是关于MSP430F149的一些学习笔记,希望对您有所帮助!如果您有任何具体的问题,欢迎继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值