一、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 + 函数名。
上一篇:MSP430单片机的中断机制
下一篇:msp430单片机GPIO基础理解
推荐阅读最新更新时间:2024-11-10 22:15