基础I/O功能

What

芯片那些插针、引脚是其与外界交流的通道。
由数据手册可得
MSP430G2553共有20个引脚,每个引脚都有其对应的功能,其功能分别如下
MSP430G2553管脚配置功能
这一节主要讨论其中的I/O(输入、输出功能)
MSP430G2553基础数据G2553具有16个I/O口,这些引脚作为数字I/O口时可用于用于输入、输出电平,输入、输出0或1。

How

在使用I/O口时首先需要向相应的功能寄存器赋值以选择其所要实现的功能
P1.0-P1.2P1.3
其余I/O口配置见数据手册43~58页。

数字I/O口的使用

以上每个寄存器的含义以及如何进行数据的输入、输入、输出电平配置及中断(后面章节会学到)配置可见于用户指南325~332页。
下面对其中上拉、下拉设置做一下说明:
以P1.3口引出的按键为例
P1.3按键及P1.0 P1.6LED简图在按键未按下时,P1.3处于悬空状态,外部对其干扰较大,高低电平不确定,需要手动设置其为上拉(高电平)还是下拉(低电平)电阻
按键上、下拉原理由图可得:PxREN使能上、下拉电阻(=1时使能);PxOUT设置为上、下拉(=1时为上拉)
举例:点亮LED1
分析:由上图LED电路图可知:两LED共阴极,若要点亮LED1需要使P1.0输出高电平,因此需要配置P1.0口为数字I/O功能并且为输出方向。

#include "io430.h"

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  P1SEL &= ~BIT0;
  P1SEL2 &= ~BIT0;//设置P1.0为IO口
  P1DIR|=BIT0;//设置P1.0为输出
  P1OUT|=BIT0;//P1.0输出为高电平
  while(1){}//单片机主程序必须是一个死循环
}

Task:

按键S2控制灯亮灭,按下一次亮起,再按一次灯灭。
分析:此功能实现需要实现按键检测,单片机开发板上常用弹性按键和自锁式小按键两种
常见按键
按键抖动
如果不进行按键消抖检测在,按下按键的一段时间内,单片机会进行多次检测到多次按键被按下,所带来的LED的状态也就发生多次翻转;我们需要宏观上按下一次按键,单片机也就只检测一次按键。

基本方法:当检测到第一次按键被按下时,延时10ms后若仍然检测到按键被按下,并且按键按下标志不为1,则按键按下标志置1。
按键消抖检测流程

#include <msp430.h>
/*	@fn:	void Delay_ms(unsigned cnt)
	@brief:	延时函数,若MCLK为1MHz,则延时cnt ms
	@para:	无符号整数cnt
	@return:	none
	@comment:	延时
*/
void Delay_ms(unsigned cnt)	//单片机每执行一条语句会花费一定的固定时间
{							//将多个小时间累计起来达到延时功能
  unsigned int i,j;			//其中时钟配置问题后面再学,默认为这么多
  for(j=0;j<cnt;j++)
  {
    i=1000/6;
    while(i--);
  }
}
int main(void)
{
  unsigned int Key_Val_Current=1;
  char Key_Pressed_Flag=0;
  WDTCTL = WDTPW + WDTHOLD;      // 关闭看门狗
  P1SEL &= ~(BIT0+BIT3);         //设置P1.0,P1.3为IO口
  P1DIR |= BIT0;                 // 设置P1.0为输出
  P1DIR &= ~BIT3;                // 设置P1.3为输入
  P1REN |= BIT3;		 // 使能SW2为上下拉 (P1.3)
  P1OUT |= BIT3;		 // 设置SW2为上拉 (P1.3)  

  while (1)                      
  {
    Key_Val_Current=BIT3 & P1IN;//按键按下检测,若按键按下,则P1.3输入为低电平
    if(Key_Val_Current==0)
    {
      Delay_ms(10);
      Key_Val_Current=BIT3 & P1IN;
      if(Key_Val_Current==0)
      {
        while((BIT3 & P1IN)==0);
        Key_Pressed_Flag=1;
      }
    }
    
    if (Key_Pressed_Flag) 
    {
      P1OUT ^= BIT0;  
       /*该式等效为P1OUT=P1OUT^BIT0
      P1OUT初始化为xxxxxxx0,BIT0为00000001
      第一次执行此语句时,P1OUT=xxxxxxx0^00000001=xxxxxxx1,P1.6输出高电平,LED1点亮
      第二次执行此语句时,P1OUT=xxxxxxx1^00000001=xxxxxxx0,P1.6输出低电平,LED1熄灭
      */
      Key_Pressed_Flag=0;
    }
  }
}

该题还可以采用中断处理程序实现,上述程序CPU一直在查询按键是否按下,而利用中断处理,当按键按下时才告诉CPU,CPU进入处理程序(LED状态翻转),可以减少CPU的占用。

IAR调试操作菜单:

  • Step Over,F10: 在同一函数中运行至下一步。
  • Step Into,F11: 运行至下一步,无论是否在同一函数中。
  • Step Out,Shift+F10: 进入函数体后,可执行完整个函数并返回至调用语句的下一步。
  • Go,F5: 从当前位置开始,运行到一个断点或者程序末尾。
  • Break: 中止程序运行。
  • StopDebuging: 退出调试器,返回IAR 环境。
  • Reset: 重置CPU。可直接通过按下LaunchPad上的复位键实现
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值