—— —— —— 技术资料下载中心

>> PIC16C5X单片机应用与设计 \

第一章 PIC16C5X硬件结构
第八节 I/O口结构
PEC16C5X的所有I/O端的结构都是相同的，如图1.10所示： 图1.10 I/O结构 所有I/O端皆可置成输入或输出态。输入无锁存，所以外部输入信号应保持到让CPU读入为止。输出锁存。 I/O端的输入/输出状态由对应的I/O控制寄存器"TRIS f"控制，当"TRIS f"将"1"置入I/O控制器时Q1和Q2都处于截止态，所以I/O端即呈高阻态（输入态）。当执行 I/O读指令（如MOVF 6，W），把当前I/O端的状态读入数据总线。当"TRIS f"将"0"置入I/O控制器时，Q1和Q2的导通情况将要由数据锁存器Q端的状态来决定。当写入数据为"1"时，Q端为低电平0，则Q1导通，I/O输出为高电平。反之，当写入数据为"0"时，Q端为"1"，则Q2导通，I/O端输出为低电平。I/O读写时序如图1.11所示： 注：本图显示了PORTB口的一个写入→读出的连续动作。I/O脚电平的建立时间=0.25TCY-TPD，其中TCY为指令周期，所以对于高速振荡来说，连续的写入→读出可能会有问题，两者中间应有延迟。

图1.11 I/O口读/写时序图

I/O口使用注意事项：
a、I/O方向转置的问题
某时候可能需要一个I/O口一会做输入，一会又做输出。这就是I/O方向的转置。
在编写这种I/O转置程序时必须注意，有些指令如位设置指令（BSF、BCF）写I/O口时是先从I/O读入其状态，执行位操作后再将结果写回去覆盖原来的内容（输出的结果放在I/O口的数据锁存器）。举个例说："BSF 6，5"这条指令的目的是要把B口的第6位置为高电平"1"。执行这条指令时，先把整个B口当前的状态内容读入到CPU，把第6位置成"1"后再把结果（8个位）重新输出到B口。如果B口中的有一个I/O端是需要方向转置的（比如说bit1），而这时是处于输入态，那么B口的状态值重新写入后，B口的数据锁存器1（见图1.9相对于B口bit1的锁存器）的锁存值就是当前B口Bit1的状态。这可能和先前Bit1作为输出时所锁存的值不同，所以当Bit1再转置成输出态时，出现在bit1端的状态就可能和先前的输出态不同了。
b、I/O的"线或"和"线与"
从图1.10看出:PIC I/O端输出电路为CMOS互补推挽输出电路。 因此与其他这类电路一样，当某个PIC I/O端设置为输出状态时，不能与其他电路的输出端接成"线或"或"线与"的形式。否则可能引起输出电流过载，烧坏PIC。
如需要与其他电路接成"线或"电路时，PIC I/O端必须置于"0"状态或输入状态并外接上拉电阻。如需要接成"线与"电路时，则PIC I/O端必须置于"1"状态或输入状态，并外接下拉电阻。电阻的阻值根据实际电路和PIC I/O端最大电流来选定。
c、I/O口的连续操作
一条写I/O的指令，对I/O真正写操作是发生在指令的后半周期（参照图1.11）。而读I/O的指令却是在指令的周期开始就读取I/O端状态。所以当你连续对一个I/O 端写入再读出时，必须要让I/O端上的写入电平有一个稳定的时间，否则读入的可能是前一个状态，而不是最新的状态值。一般推荐在两条连续的写，读I/O口指令间至少加一条NOP指令。

例：　MOVWF 6 ； 写I/O NOP ； 稳定I/O电平 MOVF 6，W ； 读I/O

d、噪声环境下的I/O操作
在噪声环境下（如静电火花），I/O控制寄存器可能因受干扰而变化。比如I/O口可能会从输入态自己变成输出态，对于这种情形，WDT也是无法检测出来的。因此如果你的应用环境是较恶劣的，建议你每隔一定的间隔，都重新定义一下I/O控制寄存器。

第一节 第二节 第三节 第四节 第五节 第六节 第七节 第八节 第九节 第十节 第十一节 第十二节

[ 返回 ]