二、GPIO【MSP430学习笔记】

发布者:月光男孩最新更新时间:2020-05-18 来源: eefocus关键字: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

#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 + 函数名。

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

关键字:GPIO  MSP430  学习笔记 引用地址:二、GPIO【MSP430学习笔记】

上一篇:MSP430单片机的中断机制
下一篇:msp430单片机GPIO基础理解

推荐阅读最新更新时间:2024-11-10 22:15

stm32学习笔记——独立看门狗
独立看门狗知识点: 关键字寄存器IWDG_KR: a、写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET); b、写入0xAAAA(无论何时), IWDG_RLR中的值就会被重新加载到计数器中从而避免产生看门狗复位; c、写入0x5555,取消寄存器IWDG_PR和IWDG_RLR的保护功能
[单片机]
stm32<font color='red'>学习</font><font color='red'>笔记</font>——独立看门狗
51单片机学习笔记【八】——步进电机
一.步进电机基础 1.定义 步进电机是将电脉冲转化为角位移的执行机构,主要使用永磁性步进电机,本实验使用的步进电机为四线双性步进电机; 步进电机的相数指产生不同极性N,S磁场的激磁线圈对数,常用m表示; 步进电机的拍数指完成一个磁场周期性变化所需脉冲数,以四线二相电机为例: 单向四拍:A/-B-A-B/ 双向四拍:A/B-AB-AB/-A/B/ 单&双八拍:A/-A/B-B-AB-A-AB/-B/-A/B/ 步进角指定子没改变一次通电状态,转子转过的角度,与磁极数,定子相数,通电方式节拍成负相关。计算 360/(m*Z*C) m–定子向数 Z–转子磁极数 C–通电方式 C=1 单或双轮流通电 C=2 单和双轮流通电 2.步进电
[单片机]
51单片机<font color='red'>学习</font><font color='red'>笔记</font>【八】——步进电机
MSP430-中断的使用
因为MSP430的操作是在寄存器上进行直接操作的,所以学习起来有一点繁琐,不像32,他有自己分装好的库可以提供大家使用,介绍中断,那就要了解下中断有关的寄存器: 这里写按键中断作为测试程序: #ifndef __CLOCK_H #define __CLOCK_H #define uchar unsigned char #define uint unsigned int void Int_Clk(void); #endif #include msp430f149.h #include clock.h /*****************************************************
[单片机]
<font color='red'>MSP430</font>-中断的使用
学习笔记 从零开始学单片机(2) 全八段数码管显示
开发板上有八个八段数码管,现在把它点亮它。数码管显示有动态和静态两种,本质上没有什么区别,由于单片机接口有限,不可能一对一,所以依次让每一个数码管点亮,那么从视觉角度上看就是一起亮起来。但是动态显示时,亮度较低。 下面的图是一个八段数码管的原理图,有共阴极和共阳极两种解法,这里是共阴极接法。a,b,c,d,e,f,g,dp分别对应八个数码管。 为了让八个数码管连起来,该开发板使用了两个八进制三态非反转透明锁存器,74HC573。 它的特性是: ×输出能直接接到 CMOS,NMOS 和 TTL 接口上 ×操作电压范围:2.0V~6.0V ×低输入电流:1.0uA ×CMOS 器件的高噪声抵抗特性 D0
[单片机]
<font color='red'>学习</font><font color='red'>笔记</font> 从零开始学单片机(2) 全八段数码管显示
STM32F4学习笔记4——外部中断
EXTI每个中断/事件都有独立的触发和屏蔽,每个中断线专用的状态位,支宽度持多达23个软件的中断/事件请求,在检测脉冲宽度低于APB2时钟宽度的外部信号参见数据手册中的电气特性部分。 STM32F4xx可以处理外部或内部事件来唤醒内核(WFE),唤醒事件可以在外设的控制寄存器使能一个中断,但不在NVIC中使能,同时在M4的FPU系统控制寄存器中使能SEVONPEND位,当CPU从内核WFE中恢复后,取药清楚相应外设的中断刮起位和外设NVIC中断通道挂起位;或者配置一个外部或内部EXTI线为事件模式,当CPU从WFE恢复后,因为对应时间的挂起为没有被置位,不必清除相应外设的中断挂起位或NVIC中断通道挂起位。 要产生中断必须先配置好
[单片机]
初识畅学系列MSP430F149单片机开发板
1、畅学MSP430单片机核心板 畅学系列六合一MSP430单片机核心板板载贴片封装的MSP430F149单片机芯片,芯片IO全部引出2组,既可以直接插到畅学系列多功能开发学习板/实验箱底板直接扩展为多功能开发学习板,也可以单独作为一个MSP430最小系统核心板使用。 畅学系列六合一MSP430单片机核心板-标配一个MSP 430149单片机,核心板集成BSL下载器,一条USB线即可实现供电和BSL方式程序下载,还可以通过USB线实现串口通讯。。 板载BSL下载模块,可以方便的直接通过USB线在供电同时还可以下载程序。 板载BSL下载模块,还可以作为串口通讯模块使用,可以通过USB供电同时和PC机进行串口通
[单片机]
初识畅学系列<font color='red'>MSP430</font>F149单片机开发板
STM32学习笔记之EXTI(外部中断)
一:EXTI(外部中断)说明 =========================================分割线========================================= 外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置 输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以被独 立的屏蔽。挂起寄存器保持着状态线的中断要求。 =========================================分割线========================================= 19个中断如下:
[单片机]
STM32<font color='red'>学习</font><font color='red'>笔记</font>之EXTI(外部中断)
MSP430寄存器中文注释----串口寄存器
/************************************************************ * USART 串口寄存器 UCTL , UTCTL , URCTL 定义的各个位 可串口1 串口2公用 ************************************************************/ /* UCTL 串口控制寄存器*/ #define PENA 0x80 /*校验允许位*/ #define PEV 0x40 /*偶校验 为0时为奇校验*/ #define SPB 0x20
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved