PIC16与PIC18的I/O--lat寄存器的解释
扫描二维码
随时随地手机看文章
用pic16的时候设计端口操作时,一般也就涉及一个trisx和portx寄存器,trisx用来设置端口方向,portx用来写数据和读取数据,开始玩pic18的时候发现端口操作的时候多了一个latx寄存器,而它偏偏又和portx这么像,刚开始的时候确实蒙了。后来看看数据手册里面的io结构框图,慢慢才明白了lat寄存器的作用。下面先上图:16和18的io结构框图,取自数据手册
pic18:
pic16:
从上图可以看出,在16系列里面,通过一个trisx设置为输出的时候,portx的值在每次一次来wr portx指令脉冲的时候输出到io管脚。如果trisx设置为输入则上端的或门和与门关闭,管脚状态通过输入缓冲器加到下方的D触发器,每次来一个rd portx指令脉冲,管教状态锁存到portx寄存器中,所以不关输入输出,只要trisx和portx就可以搞定了,输入的时候读管脚电平就读portx。
但是在pic18中,我们发现多了一个数据锁存寄存器,就是latx,输出数据的时候,trisx设置为输出,每来一个wr lat或者wr port指令脉冲,数据总线上的数据输出到io管脚,这个时候可以看到lat和port用法是很相似的。但是,重点在读管脚数据的时候。只有读取port读到的才是真正的管脚电平,由图可以看出,rd port指令脉冲来的时候,管脚端平锁存到port中,也就是说要想获得正确的管脚状态,只有读取port寄存器,而如果去读lat寄存器,读到的输出锁存器的值,比如说你一开始设置管脚成输出,通过lat输出了一个0x55,然后你设置管脚成输出,这个时候管脚电平再外部电路的驱动下发生了变化编程了0x66,这个时候你读port才能读到0x66,而如果你去读lat则读到的是你上一次输出值,不是当前时刻管脚电平状态。这也就是lat和port的不同之所在。所以在做pic18的时候我们应该养成写则写lat,读则读port的好习惯,当然,至于microchip在pic18为什么要多设置一个这个lat肯定是有他的用意的,至于这个为什么,我暂时也还没有想通,百度一下说是什么读-修改-写操作相关之类的,讲的不是很清楚,等以后摸索明白了在写到blog里面。