极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13494|回复: 0

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

[复制链接]
发表于 2012-7-18 09:25:47 | 显示全部楼层 |阅读模式
看到大家都在论坛上发帖,分享自己的学习经验,让我收获颇大,感觉跟着你们的经验走,进步是比刚开始独自闷着看书要快啊。再次谢过各位了。
不知道大家对Px口的这三个寄存器是怎么理解的,在这里共享我的理解,如有不足,还望和大家一起讨论修改。

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

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


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


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

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

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


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

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

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

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


然后在根据具体是设置成什么状态,才能对相应的寄存器进行操作,这样更能精确的控制端口。
  1. /****************************************比如下面这段1602显示液晶程序的等待繁忙标志函数程序:************************************/
  2. /*******************************************
  3. 函数名称:Wait
  4. 功    能:等待1602液晶完成内部操作
  5. 参    数:无
  6. 返回值  :无
  7. ********************************************/
  8. void Wait(void)
  9. {
  10.   P4DIR &= 0x00;// 将P4口切换成输入状态
  11.   
  12.   CLR_RS;
  13.   SET_RW;
  14.   _NOP();
  15.   SET_EN;
  16.   _NOP();
  17.   _NOP();
  18.   
  19.   while((P4IN & busy) != 0);//监测忙标志,此时为输入状态,只能对其端口进行读取状态,不能对其进行写操作
  20.   
  21.   CLR_EN;
  22.   
  23.   P4DIR |= 0xFF;//将P4口设置为输出状态,现在就可以对P4口进行读写操作了。
  24.   
  25. }//The end.


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

  27. #include <msp430x14x.h>

  28. typedef unsigned char uint8;
  29. typedef unsigned int  uint16;

  30. void Delay_5ms(void);
  31. void Wait(void);
  32. void W_data(uint8 data);
  33. void W_cmd(uint8 cmd,uint8 cmf);
  34. void Init_1602(void);
  35. void main( void )
  36. {
  37.   /*关闭所有的IO口*/
  38.   P1DIR = 0xFF;P1OUT = 0xFF;
  39.   P2DIR = 0xFF;P2OUT = 0xFF;
  40.   P3DIR = 0xFF;P3OUT = 0xFF;
  41.   P4DIR = 0xFF;P4OUT = 0xFF;
  42.   P5DIR = 0xFF;P5OUT = 0xFF;
  43.   P6DIR = 0xFF;P6OUT = 0xFF;
  44.   
  45.   // Stop watchdog timer to prevent time out reset
  46.   WDTCTL = WDTPW + WDTHOLD;
  47.   
  48.   Init_1602();
  49.   W_cmd(0xC0,1);
  50.   W_data('&')
  51.   
  52.   
  53.   while(1);
  54.   
  55. }
  56. /*******************************************
  57. 函数名称:Init_1602
  58. 功    能:对1602液晶模块进行复位、初始化操作
  59. 参    数:无
  60. 返回值  :无
  61. ********************************************/
  62. void Init_1602(void)
  63. {
  64.   controlDIR |= 0x07;//控制线端口P3.0 P3.1 P3.2置高设置为输出状态
  65.   dataDIR    &= 0xFF;//数据线端口P4设置为输出状态
  66.   
  67.   Delay_5ms();//规定的复位操作
  68.   W_cmd(0x38,0);
  69.   Delay_5ms();
  70.   W_cmd(0x38,0);
  71.   Delay_5ms();
  72.   W_cmd(0x38,0);
  73.   
  74.   W_cmd(0x38,1);
  75.   W_cmd(0x08,1);
  76.   W_cmd(0x01,1);
  77.   W_cmd(0x06,1);
  78.   W_cmd(0x0C,1);
  79.   
  80. }

  81. /*******************************************
  82. 函数名称:W_cmd
  83. 功    能:向液晶模块写入命令
  84. 参    数:cmd--命令,
  85.           chk--是否判忙的标志,1:判忙,0:不判
  86. 返回值  :无
  87. ********************************************/
  88. void W_cmd(uint8 cmd,uint8 cmf)
  89. {
  90.   if (cmf)
  91.     Wait();//等待繁忙标志
  92.   
  93.   CLR_RS;
  94.   CLR_RW;
  95.   _NOP();
  96.   
  97.   dataOUT = cmd;//讲命令写入数据端口
  98.   _NOP();
  99.   
  100.   SET_EN;//使能脉冲信号
  101.   _NOP();
  102.   _NOP();
  103.   CLR_EN;
  104.   
  105. }

  106. /*******************************************
  107. 函数名称:W_data
  108. 功    能:向液晶显示的当前地址写入显示数据
  109. 参    数:data--显示字符数据
  110. 返回值  :无
  111. ********************************************/
  112. void W_data(uint8 data)
  113. {
  114.   Wait();//等待液晶不忙
  115.   
  116.   SET_RS;
  117.   CLR_RW;
  118.   _NOP();
  119.   
  120.   dataOUT = data;//将显示数据写入数据端口
  121.   _NOP();
  122.   
  123.   SET_EN;//使能脉冲信号
  124.   _NOP();
  125.   _NOP();
  126.   CLR_EN;
  127. }

  128. /*******************************************
  129. 函数名称:Wait
  130. 功    能:等待1602液晶完成内部操作
  131. 参    数:无
  132. 返回值  :无
  133. ********************************************/
  134. void Wait(void)
  135. {
  136.   P4DIR &= 0x00;// 将P4口切换成输入状态
  137.   
  138.   CLR_RS;
  139.   SET_RW;
  140.   _NOP();
  141.   SET_EN;
  142.   _NOP();
  143.   _NOP();
  144.   
  145.   while((P4IN & busy) != 0);//监测忙标志
  146.   
  147.   CLR_EN;
  148.   
  149.   P4DIR |= 0xFF;//将P4口设置为输出状态
  150.   
  151. }

  152. /*******************************************
  153. 函数名称:Delay_5ms
  154. 功    能:延时约5ms
  155. 参    数:无
  156. 返回值  :无
  157. ********************************************/
  158. void Delay_5ms(void)
  159. {
  160.   uint16 i = 40000;
  161.   while (i != 0)
  162.   {
  163.     i--;
  164.   }
  165. }

复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 14:37 , Processed in 0.037600 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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