51-PIC-ARM的I/O口比较(希望大家补充)<br />**********************<br />51的I/O口:<br />1:准双向口<br />2:单独控制I/O口输出的置位或清零(位方式CLR,SETB)<br />3:复位后上拉成高电平,可以用做输入<br />4:带载能很弱(未考虑变异产品)<br />P1等直接控制<br /><br />**********************<br />PIC的I/O口:<br />1:真正的双向口<br />2:单独控制I/O口输出的置位或清零(位方式BSF,BCF)<br />3:所有I/O口在复位后默认为输入<br />4:带载能力强<br />由2个寄存器控制(忽略其他功能)以PORTC为例<br />TRISC:I/O口方向控制寄存器 输入为1,输出为0<br />PORTC:I/O引脚值寄存器 <br /><br />***********************<br />ARM7的I/O口:<br />1:真正的双向口<br />2:单独控制I/O口输出的置位或清零(其实还是字方式)<br />3:所有I/O口在复位后默认为输入<br />4:带载能力不强<br />由4个寄存器控制(忽略其他功能)<br />IOPIN:IO引脚值寄存器,引脚的当前状态可从该寄存器中读出<br /> (不管I/O口是输入还是输出)其实PIC的也一样<br />IOSET:I/O输出置位寄存器,写入1输出高电平,写入0无效<br /> 好象不存在读-修改-写的问题,这个比较特殊<br />IOCLR:I/O输出清0寄存器,作用同上<br />IODIR:I/O口方向控制寄存器(同PIC的TRISC等)<br /> 输入为0,输出为1(同PIC的相反)<br />注:IOSET与IOCLR是一对<br />***************<br />***************<br /><br /><br />I/O口优缺点(个人愚见):<br /><br />1:输出1或0<br /> 51: SETB P1.0<br /> PIC:BSF PORTC,0<br /> 或<br /> BCF PORTC,0<br /> 要注意其他端口的情况(读-修改-写的问题)<br /> ARM:如要求在P0.0输出1,只要IO0SET=0x00000001即可<br /> 不用担心其他引脚的情况<br />2:取反(例对第0位)<br /> 51: 可以用异或也可用取反(因为有布尔取反指令)<br /> PIC:用异或 PORTB=PORTB^0x01;<br /> ARM:只能分开搞了<br /> if(IO0SET&0x00000001==0)<br /> {IO0SET=0x00000001;}<br /> else<br /> {IO0CLR=0x00000001;}<br />3:同时改变P0口的某几位为1,某几位为0<br /> 如原P0=0x00000055,现要求P0=0x000000aa<br /> 51: P0=0xaa;<br /> PIC:PORTC=0xaa;<br /> ARM:比较麻烦了<br /> 写法1:IO0SET=0x0000aaaa<br /> IO0CLR=0xffff5555<br /> 不但要分2次写,而且还出现了中间状态<br /> 这种情况在51和PIC中是不会出现的<br />4:读I/O口状态<br /> 51: 必须先对端口写1(SETB P1.0)<br /> 然后再判断是1还是0 <br /> PIC:先设为输入,然后判断<br /> ARM:先设为输入,然后判断<br /><br />4:驱动能力<br /> 51最低,PIC最强<br /> 例:在I/O口与地间接一个100欧的电阻<br /> I/O口输出1,然后读此I/O口,只有PIC可读回高电平<br /> 如果ARM读的是IOSET则读到高电平,如果读IOPIN则读到<br /> 低电平,输出和实际电平不符 |
|