大连创客空间

 找回密码
 立即注册吧!

QQ登录

只需一步,快速开始

一键登录:

搜索
查看: 10037|回复: 60
收起左侧

【大赛原创经验贴】正确理解PxDIR和PxIN、PxOUT之间的关系

  [复制链接]
发表于 2012-7-13 19:20:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多交流,硬件的世界向你敞开大门!

您需要 登录 才可以下载或查看,没有帐号?立即注册吧!

x
看到大家都在论坛上发帖,分享自己的学习经验,让我收获颇大,感觉跟着你们的经验走,进步是比刚开始独自闷着看书要快啊。再次谢过各位了。
不知道大家对Px口的这三个寄存器是怎么理解的,在这里共享我的理解,如有不足,还望和大家一起讨论修改。

PxDIR是msp430单片机IO口的方向控制寄存器,

当把某一位置0时,此时次端口为输入模式,

当把某一位置1时,此时次端口为输出模式,

1、当作为输出模式时,这是就可对其可读可写了,通过对其写,就可以控制外围模块了。

2、当作为输入模式时,只能读它的状态,不能对起写入数据。

而PxIN和PxOUT分别是输入数据和输出数据寄存器。

程序应该先配置PxDIR为输入或输出才能对相应寄存器操作。

大家一定会想既然有了PxIN和PxOUT,为什么还要个PxDIR寄存器呢,直接对相应的寄存器操作就行了嘛,

我觉得是应为msp430单片机对输入输出的严格控制才这样设置的,

因为每一个端口在同一时间只能是输入或是输出状态的一种,

然后在根据具体是设置成什么状态,才能对相应的寄存器进行操作,这样更能精确的控制端口。




/****************************************比如下面这段1602显示液晶程序的等待繁忙标志函数程序:************************************/
/*******************************************
函数名称:Wait
功    能:等待1602液晶完成内部操作
参    数:无
返回值  :无
********************************************/
void Wait(void)
{
  P4DIR &= 0x00;// 将P4口切换成输入状态
  
  CLR_RS;
  SET_RW;
  _NOP();
  SET_EN;
  _NOP();
  _NOP();
  
  while((P4IN & busy) != 0);//监测忙标志,此时为输入状态,只能对其端口进行读取状态,不能对其进行写操作
  
  CLR_EN;
  
  P4DIR |= 0xFF;//将P4口设置为输出状态,现在就可以对P4口进行读写操作了。
  
}//The end.


/***************************下面是一个简单的1602显示液晶的简单显示程序,可以进行验证实验。上面的程序包涵在下面的程序中的***************************************/

#include <msp430x14x.h>

typedef unsigned char uint8;
typedef unsigned int  uint16;

void Delay_5ms(void);
void Wait(void);
void W_data(uint8 data);
void W_cmd(uint8 cmd,uint8 cmf);
void Init_1602(void);
void main( void )
{
  /*关闭所有的IO口*/
  P1DIR = 0xFF;P1OUT = 0xFF;
  P2DIR = 0xFF;P2OUT = 0xFF;
  P3DIR = 0xFF;P3OUT = 0xFF;
  P4DIR = 0xFF;P4OUT = 0xFF;
  P5DIR = 0xFF;P5OUT = 0xFF;
  P6DIR = 0xFF;P6OUT = 0xFF;
  
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  
  Init_1602();
  W_cmd(0xC0,1);
  W_data('&')
  
  
  while(1);
  
}
/*******************************************
函数名称:Init_1602
功    能:对1602液晶模块进行复位、初始化操作
参    数:无
返回值  :无
********************************************/
void Init_1602(void)
{
  controlDIR |= 0x07;//控制线端口P3.0 P3.1 P3.2置高设置为输出状态
  dataDIR    &= 0xFF;//数据线端口P4设置为输出状态
  
  Delay_5ms();//规定的复位操作
  W_cmd(0x38,0);
  Delay_5ms();
  W_cmd(0x38,0);
  Delay_5ms();
  W_cmd(0x38,0);
  
  W_cmd(0x38,1);
  W_cmd(0x08,1);
  W_cmd(0x01,1);
  W_cmd(0x06,1);
  W_cmd(0x0C,1);
  
}

/*******************************************
函数名称:W_cmd
功    能:向液晶模块写入命令
参    数:cmd--命令,
          chk--是否判忙的标志,1:判忙,0:不判
返回值  :无
********************************************/
void W_cmd(uint8 cmd,uint8 cmf)
{
  if (cmf)
    Wait();//等待繁忙标志
  
  CLR_RS;
  CLR_RW;
  _NOP();
  
  dataOUT = cmd;//讲命令写入数据端口
  _NOP();
  
  SET_EN;//使能脉冲信号
  _NOP();
  _NOP();
  CLR_EN;
  
}

/*******************************************
函数名称:W_data
功    能:向液晶显示的当前地址写入显示数据
参    数:data--显示字符数据
返回值  :无
********************************************/
void W_data(uint8 data)
{
  Wait();//等待液晶不忙
  
  SET_RS;
  CLR_RW;
  _NOP();
  
  dataOUT = data;//将显示数据写入数据端口
  _NOP();
  
  SET_EN;//使能脉冲信号
  _NOP();
  _NOP();
  CLR_EN;
}

/*******************************************
函数名称:Wait
功    能:等待1602液晶完成内部操作
参    数:无
返回值  :无
********************************************/
void Wait(void)
{
  P4DIR &= 0x00;// 将P4口切换成输入状态
  
  CLR_RS;
  SET_RW;
  _NOP();
  SET_EN;
  _NOP();
  _NOP();
  
  while((P4IN & busy) != 0);//监测忙标志
  
  CLR_EN;
  
  P4DIR |= 0xFF;//将P4口设置为输出状态
  
}

/*******************************************
函数名称:Delay_5ms
功    能:延时约5ms
参    数:无
返回值  :无
********************************************/
void Delay_5ms(void)
{
  uint16 i = 40000;
  while (i != 0)
  {
    i--;
  }
}



回复

使用道具 举报

 楼主| 发表于 2012-7-13 19:21:11 | 显示全部楼层
自己先顶下。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-13 19:21:27 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2012-7-13 19:55:38 | 显示全部楼层
  呵呵,让你受益的有木有我啊?(自恋了一下下!)
不错嘛!我晚上回去再细细的品味一番!!!!
回复 支持 反对

使用道具 举报

发表于 2012-7-13 20:07:44 | 显示全部楼层
学习了,与51差不多。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-13 20:13:38 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2012-7-13 20:16:01 | 显示全部楼层
空白。 发表于 2012-7-13 20:13
有的有的。。

  呵呵,对你有点印象,好像在我的贴里发过问!
回复 支持 反对

使用道具 举报

发表于 2012-7-13 20:52:05 | 显示全部楼层
???怎么就部分程序,还有请问下,不检测忙是否可以,51里面是可以的,430的呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-13 21:00:02 | 显示全部楼层
青春的笑容 发表于 2012-7-13 20:52
???怎么就部分程序,还有请问下,不检测忙是否可以,51里面是可以的,430的呢 ...

那个部分程序的意思是从下面的整个程序中摘录的其中一段来解释本帖的问题,下面是整个完整的程序可以在430板子上验证,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-13 21:01:47 | 显示全部楼层
Friday 发表于 2012-7-13 20:16
呵呵,对你有点印象,好像在我的贴里发过问!

嗯,通过对你的发问,我发现我买的书中的错误。说明你记性还蛮好的
回复 支持 反对

使用道具 举报

发表于 2012-7-13 22:59:27 | 显示全部楼层
Delay_5ms();//规定的复位操作
  W_cmd(0x38,0);
  Delay_5ms();
  W_cmd(0x38,0);
  Delay_5ms();
  W_cmd(0x38,0);

呵呵,这个程序我看过,这个反复操作倒不是很理解!
回复 支持 反对

使用道具 举报

发表于 2012-7-14 11:01:52 | 显示全部楼层
楼主啊  你的头像太有个性看 看我的眼睛那个晃啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-14 11:04:14 | 显示全部楼层
Friday 发表于 2012-7-13 22:59
Delay_5ms();//规定的复位操作
  W_cmd(0x38,0);
  Delay_5ms();

QQ截图20120714110337.png 这个反复操作我是根据数据手册的初始化步骤来写的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-14 11:18:08 | 显示全部楼层
阿毛2012 发表于 2012-7-14 11:01
楼主啊  你的头像太有个性看 看我的眼睛那个晃啊

那就不看头像嘛,看内容哈,
无聊的时候看看,还可以放松放松哟
你的小朋友头像看着还蛮好看得。
回复 支持 反对

使用道具 举报

发表于 2012-7-14 11:19:35 | 显示全部楼层
空白。 发表于 2012-7-14 11:04
这个反复操作我是根据数据手册的初始化步骤来写的。

这哪的资料?没见过,而且51上没有如此操作,所以纳闷为什么这样重复。msp430的资料有说明吗?最好告诉我出处。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-14 11:23:08 | 显示全部楼层
Friday 发表于 2012-7-14 11:19
这哪的资料?没见过,而且51上没有如此操作,所以纳闷为什么这样重复。msp430的资料有说明吗?最好告诉我 ...

1602中文资料.pdf (663.24 KB, 下载次数: 3281)
回复 支持 反对

使用道具 举报

发表于 2012-7-14 11:29:04 | 显示全部楼层
空白。 发表于 2012-7-14 11:23
这个是单单的1602的中文手册,这个和430的是区分开的吧
我把那个中文手册上传了,你看看吧
...

恩,看了你的资料了。
你也学了51吧?郭天祥的程序确实把这段简化了。
回复 支持 反对

使用道具 举报

发表于 2012-7-14 11:33:27 | 显示全部楼层
空白。 发表于 2012-7-14 11:18
那就不看头像嘛,看内容哈,
无聊的时候看看,还可以放松放松哟
你的小朋友头像看着还蛮好看得。 ...

我是看内容啊  可是你那个总是在我的视野里啊 呵呵 我的头像可是小葡萄哦  很可爱的一个孩子
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-14 12:21:05 | 显示全部楼层
Friday 发表于 2012-7-14 11:29
恩,看了你的资料了。
你也学了51吧?郭天祥的程序确实把这段简化了。

没有看郭天祥的,是另一套,我买的板子,配套的视频的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-14 12:22:30 | 显示全部楼层
阿毛2012 发表于 2012-7-14 11:33
我是看内容啊  可是你那个总是在我的视野里啊 呵呵 我的头像可是小葡萄哦  很可爱的一个孩子 ...

蛮可爱的、、
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册吧!

本版积分规则

单片机开发者1群:235808606;会员QQ 6群:254085994; 1群:12835691(满); 2群:121061287(满); 3群:237320668(满);4群:249652919(满);5群:253578883(满);大赛1群:187926790(满),2群:231577758(满),3群:249652919(满)。 TI杯4群:58129202(满)。
载入中

QQ|手机版|小黑屋|Archiver|大连创客空间 ( 辽ICP备15004617号-2  

GMT+8, 2017-1-24 05:07 , Processed in 0.228707 second(s), 28 queries .

地址:辽宁省大连市高新园区火炬路7号17层 QQ:2401085253

Copyright © 2010-2015 创客空间(大连)科技有限公司 All Rights Reserved.

快速回复 返回顶部 返回列表