📄 pic16cxxx-1-3.htm
字号:
RB<7:4>和RB<3:0>的结构图如下:<br> <div align="center">
<p><img src="image/a46.gif" width="567" height="255"> </p>
<p><img src="image/a47.gif" width="422" height="258"> </div>
<p>§1.8.3 PORTC和TRISC
<p align="center"><img src="image/a48.gif" width="294" height="73"></p>
PORTC是一个8位双向I/O口。它的方向由TRISC定义。PORTC 口有输入斯密特触发器缓<br>
冲。如下图所示:<br> <p align="center"> <img src="image/a49.gif" width="333" height="361">
<p align="center"><img src="image/a50.gif" width="573" height="337">
</p>
<p>§1.8.4 PORTD和TRISD</p>
<p>
<p align="center"><img src="image/a51.gif" width="291" height="79"></p>
PORTD是一个8位双向I/O口,具有斯密特输入特性,由TRISD控制输入/输出方向。<br>
另外PORTD还可以用作并行口,这在相应章节介绍。<br> <p align="center">
<img src="image/a52.gif" width="269" height="307">
<p align="center"><img src="image/a53.gif" width="545" height="187"></p>
<p>§1.8.5 PORTE和TRISE</p>
<p><img src="image/a54.gif" width="181" height="83" hspace="50"></p>
<p> PORTE只有三根双向I/O线,其方向由TRISE寄存器控制。仅PORTE的这三根I/O线还可以<br>
作为并行口控制线,这在§1.8.7介绍,请参考。</p>
<p>
<p align="center"><img src="image/a55.gif" width="266" height="294"></p>
<p align="center">图1.21 PORTE结构图</p>
<p align="center">TRISE除三位<0:2>用于PORTE方向控制外,另外还有五位<3:7>用于其他功能的控制,
见下图。</p>
<p align="center"><img src="image/a56.gif" width="565" height="728"></p>
§1.8.6 I/O编程注意事项
<p>I/O口使用注意事项:<br>
一、I/O方向转置的问题<br>
有的时候我们可能需要一个I/O口一会做输入,一会又做输出,这就是I/O方向的转置。在编写这种I/O转置程序时你必须注意,有些指令写I/O口时先从I/O读入其状态,
修改后再重新写回I/O当前状态读入CPU, 执行位操作后再将结果写回去覆盖原来的内容(输出的结果放在I/O口的数据锁存器)。举个例说:BSF6,5这条指令的目的是要把B口的第6位置为高电平"1"。执行这条指令时,先把整个B口当前的状态内容读入到CPU,把第6位置成"1"后再把结果(8个位)重新输出到B口。如果B口中的有一个I/O腿是需要方向转置的(比如说bit1),而这时是处于输入态,那么B口的状态值重新写入后,B口的数据锁存器1(见图1.15相对于B口bit1的锁存器)的锁存值就是当前B口Bit1的状态。这可能和先前Bit1
作为输出时所锁存的值不同,所以当Bit1再转置成输出态时,出现在bit1 端的状态就可能和先前的输出态不同了。<br>
二、I/O的"线或"和"线与"<br>
从图1.15看出:PIC I/O脚输出电路为CMOS互补推挽输出电路。因此与其他这类电路一样,当某个PIC
I/O脚设置为输出状态时,不能与其他电路的输出脚接成"线或"或"线与"的形式,否则可能引起输出电流过载,烧坏PIC。如需要与其他电路接成"线或"电路时,PIC
I/O必须置于"0"状态或输入状态并外接上拉电阻。如需要接成"线与"电路时,则PIC I/O必须置于"1"状态或输入状态,
并外接下拉电阻,电阻的阻值根据实际电路和PIC I/O脚最大电流来选定。<br>
三、I/O口的连续操作<br>
一条写I/O的指令,对I/O真正写操作是发生在指令的后半周期。而读I/O的指令却是在指令的周期开始就读取I/O端状态。所以当你连续对一个I/O端写入再读出时,
必须要让I/O端上的写入电平有一个稳定的时间,否则读入的可能是前一个状态,而不是最新的状态值。一般推荐在两条连续的写, 读指令间至少加一条NOP指令。</p>
<p><img src="image/a57.gif" width="259" height="65" hspace="50"></p>
<p>四、噪声环境下的I/O操作<br>
在噪声环境下(如静电火花),I/O控制寄存器可能因受干扰而变化。比如I/O 口可能会从输入态自己变成输出态,对于这种情形,WDT也是无法检测出来的。因此如果你的应用环境是较恶劣的,建议你每隔一定的间隔,都重新定义一下I/O控制寄存器。</p>
<p>§1.8.7 并行口</p>
<p><img src="image/a58.gif" width="178" height="73" hspace="50"></p>
在PIC64/65中,PORTD除作为一般的双向I/O口,还可以用作8位的并行口。把PSPMODE位(TRISE<4>)置为"1",则PORTD工作在并行口方式,它可以由外部控制器进行异步读写。并行口PORTD可直接和外部的8位微控制器的数据线相连,这时该微控制器即可把PORRTD作为一个数据锁存器来读写。PIC64/65的这个特性使它可以方便地和别的8位微控制器进行并行通讯。<br>
当PSPMODE置为"1"后,PORTE的三根I/O线即分别成为并行口PORTD的三根控制线:RE0作为读控制线RD,RE1作为写控制线WE,RE2则作为片选线CS。这时TRISE<O:2>
还必须置为"111"以使RE0~RE2成为输入线。<br> 并行口中实际上有二个8位锁存器,分别对应于数据进(写入PIC)和数据出(从PIC读出),<br>
如图示。<br> <p align="center"><img src="image/a59.gif" width="272" height="334"></p>
<p align="center">图1.23 并行口结构</p>
<br> 对于PIC单片机这方面来说,当写操作时,是把8位数据写入到PORTD数据锁存器,读操作则是从PORTD管脚锁存器读入数据。
但这二个物理上不同的寄存器在逻辑地址上是一样的,实际的操作对象则取决于RD(读)和WR(写)信号线的状态。在PORTD作为并行口操作时,TRISD对PORTD的方向控制则不再起作用,
此时由外部的微控制器通过RD和WR来控制数据的方向。<br> 当PORTD从外部接收到一个字节数据并等待PIC的CPU来读取时,IFB标志位(TRISE<7>)被置为"1",一旦这个数据被CPU读取后,IBF位即清为"0"。IBF是一个只读状态位,
当数据被CPU写入到PORTD等待外部控制器读取时,OBF标志位(TRISE<6>)被硬件置为"1",
一旦这个数据被外部控制器读取后,OBF位即被清为"0"。当PORTD 从外部控制器接收到一个数据,CPU还未读取前外部控制器又置入一个数据,则原先的数据会被新数据复盖,并且IOBV
标志位(TRISE<5>)被置为"1"。IOBV是一个可读/写的位,必须由程序方能将其清为"0"。当PORTD不作为并行口时(PSPMODEQ="0"),IBF和OBF都保持为"0"。此时如果IBOV之前被置为"1",则应由软件将其清为"0"。当PORTD并行口完成一个读/写操作后,就有一个中断请求产生。
这时其相应的中断标志位PSPIF(PIP1<7>)被置为"1",PSPIF位须由软件来清"0"。PSPIE(PIE1<7>)
为该中断的屏蔽位,置PSPIE="0"可以屏蔽该中断。<br> <p>下表为和并行口有关的寄存器:<BR>
<p><img src="image/a60.gif" width="409" height="180"></p>
<p>注: -=未用,X=不定 表1.9 并行口相关寄存器<br>
§1.9 定时器/计数器</p>
<p> PIC16C61有一个定时器TIMER0,其余PIC16C6X则有3个定时器TIMER0,TIMER1,TIMER2。每个定时器都可以产生中断请求,另外定时器也和一些别的模块配合来完成捕捉/PWM等功能。</p>
<p>§1.9.1 TIMER0定时器/计数器</p>
<p> PIC16C6X都有定时器/计数器TIMER0(在PIC15C5X中被称为RTCC),具有如下特点:<br>
·8位,可循环溢出的定时器/计数器。<br>
·用户可读/写。<br>
·具8位可编程预分频器。</p>
<p>
<p align="center"><img src="image/a61.gif" width="573" height="423"></p>
<p align="center">图1.25 TIMER0/WDT预分频器方块图</p>
从上图可看出,该预分频器为TIMER0和WDT所共用, 但某一时刻只能分配给其中之一使
用,这完全由程序控制。你可以在程序中变换预分频器的分配对象, 下面两段程序是推荐的 转换程序。<br> <p align="center"><img src="image/a62.gif" width="360" height="298"></p>
<p>当预分频器给TIMER0时,任何操作到TIMER0的指令(如CLRF1,MOVWF1等)
都会清零预分 频器。同理,当预分频器给WDT时,一条清WDT指令(CLRWDT)将会同时清零其预分频器。 这里 应注意,指的是预分频器,而不是别的(如OPTION寄存器)
即分频倍率和其分配对象并不会改变。<br>
预分频器不能由软件读/写。<br>
<img src="image/a63.gif" width="690" height="172"></p>
<p>注: X=不定, u=不变, -=未用, 阴影部分为TIMER0无关位。<br>
(1) TRISA<5>和PEIE位在16C61中未用。<br>
<p align="center">表1.12 TIMER0相关寄存器 </p>
<p>§1.9.2 TIMER1定时器/计数器 </p>
<p><img src="image/a65.gif" width="286" height="75" hspace="50"></p>
<p> TIMER1为16位宽,分别由 2个8位可读/写的寄存器TIMER1H和时TIMER1L组成。<br>
TIMER1可从0000增1计数到FFFFh,并且溢出回到0。当溢出发生后,置TIMER1IF(PIR1<0>)<br>
为1,并产生中断请求,其中断屏蔽位为TIMER1IE(PIE1<0>),详见PIE1寄存器描述。</p>
<p align="center"><img src="image/a66.gif" width="576" height="257"></p>
<p align="center">图1.26 TIMER1方块图</p>
<p align="center"><img src="image/a67.gif" width="268" height="253"><br>
<br>
表1.14 TIMER1振荡参数表 </p>
<p align="center">由于TIMER1振荡是低频振荡(LP),用户程序应考虑一定的延时以便让TIMER1 建立起稳 定的振荡。<br>
</p>
<p align="right"> <a href="PIC16Cxxx-1-2.htm">上一页</a> <a href="PIC16Cxxx-1-4.htm">
下一页</a><br>
</p>
<p><a href="PIC16Cxxx-1.htm">第一章</a> <a href="PIC16Cxxx-2.htm">第二章</a>
<a href="PIC16Cxxx-3.htm">第三章</a> <a href="PIC16Cxxx-4.htm">第四章</a>
<a href="PIC16Cxxx-5.htm">第五章</a> <a href="PIC16Cxxx-6.htm">第六章</a>
<a href="PIC16Cxxx-7.htm">第七章</a> <a href="PIC16Cxxx-8.htm">第八章</a>
<a href="PIC16Cxxx-9.htm">第九章</a> <a href="PIC16Cxxx-10.htm">第十章</a></p></td>
</tr>
</table>
<table width="700" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="20"> </td>
<td> </td>
</tr>
</table>
<table width="700" border="0" cellspacing="0" cellpadding="0">
<tr bgcolor="#990000">
<td height="1" width="634"></td>
</tr>
<tr align="right">
<td height="6"></td>
</tr>
<tr align="right">
<td><font color="#990000" size="2">[ <a href="index.htm">返回</a> ]</font>
</td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td> </td>
</tr>
</table></td>
</tr>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -