首页 > 学习收获 > 嵌入式相关 > PIC之端口使用
2007
10-10

PIC之端口使用

嗯,好久没更新了。看见那位兄弟给我的留言,真是汗颜。。。呵呵

其实,有时候我是属于那种会做不会说的,所以很多东西我算是知道,但是不会表述。呵呵。总之,在这里尽量写下自己的心得就好了吧。

嗯。言规正传。今天讲讲基本的IO口。呵呵。

其实,IO口并没有什么特别好讲的。输入输出而已么。但是值得一提的是,PIC这个BT单片机的输入输出的驱动力很强悍,这个貌似是公认的。我也没用过别的,不好评判,但是别人都这么说,我也姑且听之吧。

然后,关于很基本的IO口初始化,众所周知TRIS系列寄存器了吧,呵呵。这里有个常识:Microchip之前提供了一个叫做“TRIS”的指令,后来就变成了不推荐使用该指令,再后来新的芯片,就完全不支持该指令了。所以,如果你看的教程上还在说TRIS指令怎么怎么,请抛弃之,老老实实的换到BANK1去修改TRIS系列寄存器吧。

然后,由于种种原因,PIC的IO口是功能复用的。这个大家都知道,就是那些所谓的RA0/RA1啥的还可以当作AN0/T0CK1/TX等等使用么。但是这里就要注意,如果你什么功能也不想要,就想要基本的数字IO口功能,那么初始化时也要注意对使用到的IO口的复用功能也稍微注意一下,比如,PORTA系列口一般都兼有AD输入通道的功能,那么如果你并不想要用AD功能,初始化也务必对AD的相关寄存器进行一些设置,确保AD功能关闭以及PORTA分配为数字IO。因为很多芯片复位后,默认的一些组件的设置是打开的,从而占用了相应的IO口,使其丧失基本数字IO功能。为正常使用,务必进行处理。

当然,工作量很大,意味着你要对该IO口的复用功能要熟悉,并且要看其附属功能的设置说明。不过,这总比不能正常工作好吧~呵呵。而且,有个小技巧,Datasheet上,对IO口介绍的一章里面,都有每个PORT的初始化的例程的,这个例程就是按照该芯片将该IO置为标准数字IO来写的。比如16F91x的DS(DS41250E),在对PORTA的介绍中(P31),进行基本介绍后就有一个示例代码:

BCF STATUS,RP0 ;Bank 0
BCF STATUS,RP1 ;
CLRF PORTA ;Init PORTA
BSF STATUS,RP0 ;Bank 1
BCF STATUS,RP1 ;
MOVLW 07h ;Set RA<2:0> to
MOVWF CMCON0 ;digital I/O
CLF ANSEL ;Make all PORTA I/O
MOVLW F0h ;Set RA<7:4> as inputs
MOVWF TRISA ;and set RA<3:0>
; as outputs
BCF STATUS,RP0 ;Bank 0
BCF STATUS,RP1 ;

这就是一个91x芯片PORTA口初始化为标准数字IO口的标准代码。复制粘贴到你的程序中初始化段使用吧^_^

当然——不要忘记修改其中对TRISA的赋值以满足你自己的要求~呵呵

那么,从代码里面也可以看出,程序在初始化PORTA的功能和输入输出之前,首先把PORTA的值清空了。这也是MC官方推荐的,在处理相关寄存器前,尤其处理TRIS系列寄存器之前,务必将PORT系列寄存器置为一个可知状态,否则可能出现不可预料的后果——其实很好理解,芯片复位后,PORT寄存器的值是随机的,那么好,假设你的RA0口下面是一个伟大的阀门,是一个轻易不可乱开的金库之门,那么复位时你的PORTA的第0位又不幸随机为了1,那么在你设置TRISA后的一刹那,恭喜你,那个门已经打开了……等着你的黄金被拿光吧……所以,务必在设置TRIS之前,先确保PORT口状态已知。呵呵。

然后,顺便说一下,一般设计产品,不会把所有的IO口都用掉。那么,空闲的IO口在电路板上如何处理,也是一个问题。经过我在几个论坛和若干位高手请教之后,得出的结论如下:首先,MC的芯片,复位后所有的IO口均是输入状态。这肯定是有道理的,所以,空闲的IO口,请务必设置为输入状态。随后,一般来说,如果没有特别的需要,引脚悬空也可以。但是据说这样会引起ESD问题。所以一般推荐是一个电阻上拉到5V,或者一个电阻拉到地。如果你的产品对ESD要求较高或者你自己对板子的稳定要求较高,建议还是不要悬空,呵呵。不过我现在出的几个东西,芯片空脚都是悬空的……反正我们对ESD要求不高……呵呵

嗯。今天IO扯淡先到此。^_^

最后编辑:
作者:龙天
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。