PIC单片机16F84的内部硬件资源(三)
4 I/O 口单片机作为一个控制器件必定有数据输入和输出。输入量可能是温度、压力、转速等,而输出量可能是开关量和数据,以保证受控过程在规定的范围内运行。数据的输入和输出都需通过单片机内部有关电路,再与引脚构成输入/输出(I/O)端口。PIC16F84 芯片有两个 I/O 端口(PROTA 和 PORTB)。端口 A 为 5 位口,端口 B 为 8 位口,共占用 13 位引脚。每个端口由一个锁存器(即数据存储器中的特殊功能寄存器 05H、06H 单元)、一个输出驱动器和输入缓冲器等组成。
当把 I/O 口作输出时,数据可以锁存;作输入口时,数据可以缓冲。 16F84 PORTA 口中的 RA4 是斯密特触发输入、漏极开路输出。而其它的 RA 口引脚都是 TTL 电平输入和全 CMOS 驱动输出。端口 PORTB 是一个八位双向可编程 I/O 口。各端口虽然也由锁存器、驱动器、缓冲器等构成,但因功能略有不同而导致电路亦存在差别。现以 PORTA 口的 RA0 ~RA3 的电路(见左图)为例,说明其基本工作原理。
图中 RA 口的 I/O 引脚是由数据方向位(寄存器 TRISA)来定义数据流向。当 TRISA 寄存器的位置为“1”时,其输出驱动器(由 P 沟道和 N 沟道 MOS 管串接而成)呈高阻态,即两个 MOS 管均截止,I/O 口被定义为输入。此时,数据由 I/O 端输入,经 TTL 输入缓冲器到 D 触发器。当执行读指令时,此 D 触发器使能,数据经三态门进入数据总线。 当 TRISA 的位置为“0”时,I/O 口被定义为输出,此时输出锁存器的输出电平就是 I/O 口的输出电平。
读 PORTA 寄存器的结果就是读取 I/O 引脚上的电平,而写 PORTA 寄存器的结果是写入 I/O 锁存器。所有的写 I/O 口的操作都是一个“读入/修改/写入”的过程,即先读 I/O 引脚电平,然后由程序修改(按要求给定一个值),再置入 I/O 锁存器。 PIC16F84 的输出可提供 20mA 的电流,所以它可直接驱动 LED。PORTA 和 PORTB 各个位均可分别定义为输入和输出。下面以 PORTA 口初始化程序的实例,说明选择 I/O 口的方法。
CLRF PORTA;端口 A 被清零 BSF STATUS;状态寄存器 STATUS 的 RPO 位置为 1,选 BANK1。 MOVLW 0xCF;将定向值;11001111 置入 W 工作寄存器 MOVWF TRISA;置 RA(3~0)位为输入;RA5?4 位为输出;TRISA7?6 位未用在使用 I/O 口时应注意:
(1)当需要一个 I/O 口一会做输入、一会又做输出时,输出值会不确定。
(2)I/O 引脚输出驱动电路为 CMOS 互补推挽输出。当其为输出状态时,不能与其它输出脚接成“线或”或“线与”,否则,会因电流过载烧坏单片机。
(3)当对 I/O 口进行写操作后不宜直接进行读操作,一般要求在两条连续的写、读指令间至少加入一条 NOP 指令。 例:MOVWF 6;写 I/O NOP;稳定 I/O 电平 MOVF 6,W;读 I/O
5. 堆栈单片机执行程序时,常常要执行调用子程序。这样就产生了一个问题:如何记忆是从何处调用的子程序,以便执行子程序之后正确返回。此外,在程序执行过程中,还可能会发生中断,转而执行中断子程序,这时,又如何记忆从何处中断,以便返回呢? 满足上述功能的方法就是“堆栈”技术。 “堆栈”是一个用来保存临时数据的栈区。当主程序调用子程序时,单片机执行到 CALL 指令或发生中断时,就自动将下一条指令的地址“压栈”保存到栈区。
当子程序结束,单片机执行返回指令时,就自动地把栈区的内容“弹出”,作为下步指令执行的新地址。 PIC16F84 芯片内有一个 8 级 13 位宽(与 PC 同宽)的硬件堆栈,此堆栈既不占用程序存储空间,也不占用数据存储空间。当执行一条 CALL 指令或一个中断被响应后,程序计数器 PC 中的断点地址就自动被压栈(PUSH)保护,而当执行 RETURN、RETLW 或者 RETFIE 指令时,堆栈中的断点地址会弹回(POP)程序计数器 PC 中。
无论是 PUSH 还是 POP 操作,都不影响 PCLATH 寄存器的内容。 ?成都卫东知识竞赛试题:19?简述 PIC 单片机 I/O 口的功能。
20. PIC16C64A/RL64 与 PIC16C65 的管脚数相等,管脚功能相近,但 PIC16C64A/RL64 的{16}脚无 CCP2、{25}脚无 TX/CK、{26}脚无 RX/DT 等功能,试绘出 PIC16C64A/RL64 的管脚功能图。