[ZLG-MCU] 【LPC900的笔记】方便的P89LPC900单片机I/O配置头文件

[复制链接]
3590|3
 楼主| LPC900 发表于 2007-9-10 17:36 | 显示全部楼层 |阅读模式
  NXP半导体P89LPC900系列单片机(6倍速80C51内核)的I/O可以配置为可选的4种模式:准双向、推挽输出、仅为输入、开漏。在复位后,所有I/O端口都默认为输入状态。P0、P1、P2、P3端口每根管脚的工作模式由P0M1、P0M2、P1M1……P3M2等8个寄存器来决定,具体配置方法如下表所示:<br /><br />=======================<br />PxM1.y&nbsp;&nbsp;PxM2.y&nbsp;端口模式<br />-----------------------<br />&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;准双向&nbsp;<br />&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;推挽&nbsp;<br />&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;仅为输入(高阻)<br />&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;开漏&nbsp;<br />=======================<br /><br />  例如,将P0.1配置为推挽模式:<br />    P0M1&nbsp;&=&nbsp;0xFD;<br />    P0M2&nbsp;|=&nbsp;0x02;<br /><br />  但是,存在一个问题,如果没有把I/O配置表熟练地背诵下来,则编写程序时还要去翻《数据手册》,很不方便。经过仔细考虑,我编制出了一个P89LPC935的I/O配置头文件,可以方便地把I/O管脚配置为所需要的模式。<br /><br />&nbsp;<br />/******************************************************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;IOCFG935.H<br />&nbsp;&nbsp;&nbsp;&nbsp;NXP-P89LPC935的I/O配置头文件<br />说明:<br />&nbsp;&nbsp;&nbsp;&nbsp;P89LPC9xx的I/O端口可以配置为4种模式:准双向、推挽输出、高阻输入、开漏<br />&nbsp;&nbsp;&nbsp;&nbsp;复位后,所有I/O端口默认为高阻输入状态<br />&nbsp;&nbsp;&nbsp;&nbsp;运用本头文件中定义的宏函数可以方便地将I/O配置成所需要的模式<br />注意:<br />&nbsp;&nbsp;&nbsp;&nbsp;P1.2(SCL,T0)&nbsp;作为输出时只能配置为开漏模式<br />&nbsp;&nbsp;&nbsp;&nbsp;P1.3(SDA,/INT0)&nbsp;作为输出时只能配置为开漏模式<br />&nbsp;&nbsp;&nbsp;&nbsp;P1.5(/RST)&nbsp;只能配置成仅为输入模式<br />******************************************************************************/<br /><br /><br />#ifndef&nbsp;IOCFG935_H<br />#define&nbsp;IOCFG935_H<br /><br /><br />#define&nbsp;PIN0&nbsp;&nbsp;&nbsp;&nbsp;0x01<br />#define&nbsp;PIN1&nbsp;&nbsp;&nbsp;&nbsp;0x02<br />#define&nbsp;PIN2&nbsp;&nbsp;&nbsp;&nbsp;0x04<br />#define&nbsp;PIN3&nbsp;&nbsp;&nbsp;&nbsp;0x08<br />#define&nbsp;PIN4&nbsp;&nbsp;&nbsp;&nbsp;0x10<br />#define&nbsp;PIN5&nbsp;&nbsp;&nbsp;&nbsp;0x20<br />#define&nbsp;PIN6&nbsp;&nbsp;&nbsp;&nbsp;0x40<br />#define&nbsp;PIN7&nbsp;&nbsp;&nbsp;&nbsp;0x80<br /><br /><br />//将所选I/O配置为准双向I/O模式<br />#define&nbsp;QuasiBidir(Port,Pins)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Port##M1&nbsp;&=&nbsp;~(Pins);<br />&nbsp;&nbsp;&nbsp;&nbsp;Port##M2&nbsp;&=&nbsp;~(Pins);<br />}<br /><br />//将所选I/O配置为推挽输出模式<br />#define&nbsp;PushPull(Port,Pins)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Port##M1&nbsp;&=&nbsp;~(Pins);<br />&nbsp;&nbsp;&nbsp;&nbsp;Port##M2&nbsp;|=&nbsp;(Pins);<br />}<br /><br />//将所选I/O配置为仅为输入模式<br />#define&nbsp;InputOnly(Port,Pins)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Port##M1&nbsp;|=&nbsp;(Pins);<br />&nbsp;&nbsp;&nbsp;&nbsp;Port##M2&nbsp;&=&nbsp;~(Pins);<br />}<br /><br />//将所选I/O配置为开漏I/O模式<br />#define&nbsp;OpenDrain(Port,Pins)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Port##M1&nbsp;|=&nbsp;(Pins);<br />&nbsp;&nbsp;&nbsp;&nbsp;Port##M2&nbsp;|=&nbsp;(Pins);<br />}<br /><br /><br />/******************************************************************************<br />参数说明:<br />&nbsp;&nbsp;&nbsp;&nbsp;Port:8位并行I/O端口,可以取P0、P1、P2或P3<br />&nbsp;&nbsp;&nbsp;&nbsp;Pins:所选I/O管脚,可以取PIN0~PIN7,或者它们之间的任意“逻辑或”组合<br />用法举例:<br />&nbsp;&nbsp;&nbsp;&nbsp;PushPull(P0,&nbsp;PIN1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将P0.1配置为推挽模式<br />&nbsp;&nbsp;&nbsp;&nbsp;OpenDrain(P1,&nbsp;PIN2&nbsp;|&nbsp;PIN3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将P1.2和P1.3同时配置为开漏模式<br />******************************************************************************/<br /><br /><br />#endif&nbsp;&nbsp;//IOCFG935_H<br /><br /> 相关链接:<a href='http://blog.21ic.com/user1/617/archives/2007/41963.html'>http://blog.21ic.com/user1/617/archives/2007/41963.html</a>
 楼主| LPC900 发表于 2007-9-15 13:05 | 显示全部楼层

没人顶?其实这4个宏函数用起来还是挺方便的,而且高效率

该I/O模式配置头文件不仅可以用于LPC935,而且也可用于LPC901~936所有的型号。再举个例子:<br /><br />#include&nbsp;&ltREG935.H&gt<br />#include&nbsp;&quot;IOCFG935.H&quot;<br /><br />void&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PushPull(P0,&nbsp;PIN1);<br />&nbsp;&nbsp;&nbsp;&nbsp;OpenDrain(P1,&nbsp;PIN2&nbsp;|&nbsp;PIN3);<br />&nbsp;&nbsp;&nbsp;&nbsp;InputOnly(P2,&nbsp;PIN4&nbsp;|&nbsp;PIN5&nbsp;|&nbsp;PIN6);<br />&nbsp;&nbsp;&nbsp;&nbsp;QuasiBidir(P3,&nbsp;PIN0&nbsp;|&nbsp;PIN1);<br />&nbsp;&nbsp;&nbsp;&nbsp;...<br />}<br />
smileage 发表于 2007-9-15 16:40 | 显示全部楼层

可能习惯了

用习惯了,四个模式记得比较清楚了<br /><br />P0M1&nbsp;1&nbsp;1&nbsp;1&nbsp;1&nbsp;1&nbsp;1&nbsp;1&nbsp;1&nbsp;&nbsp;FF<br />P0M2&nbsp;0&nbsp;0&nbsp;0&nbsp;0&nbsp;0&nbsp;0&nbsp;0&nbsp;0&nbsp;&nbsp;00<br /><br />楼主这样有心倒是值得学习
song1ming 发表于 2007-9-28 14:32 | 显示全部楼层

很不错呀

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

本版积分规则

10

主题

130

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部