
课件:输入输出端口.ppt
79页第七章 输入输出端口,◆在PIC16F877单片机中,共有五个I/O端口:端口A、B、C、D和E ◆端口的一些引脚通过对相应的专用寄存器的设置选择用作多功能复用,既可作为一般通用的I/0引脚,也可作为某些部件特殊功能的输入/输出引脚 ◆一旦作为特殊功能引脚,这些引脚不再用作一般的I/O功能7.1 I/O端口功能的通用结构,◆PIC16F877单片机有5个I/O端口,它们的设计思想和内部结构都是不同的,即使同一个端口各个引脚的内部结构也存在差异 ◆但就其通用的输入/输出功能,则具有类似的线路结构◆基本端口内部结构如下图,主要包括:3个D触发器组成的输入/输出数据锁存电路和方向选择锁存电路; ◆ 2个三态门控电路; ◆二输入“与”门和“或”门组成数据输出的前向通道; ◆由P沟道场效应管和N沟道场效应管构成互补推挽的电流输出级◆在PIC系列单片机中,每个端口都至少对应着两个特殊功能寄存器, ◆分别是数据寄存器(PORTX)和方向寄存器(TRISX) , ◆也就是说PIC单片机把I/O端口当作寄存器来访问(即读出或写入)◆I/O端口的方向寄存器是定义其端口引脚的输入/输出状态; ◆而I/O端口的数据寄存器是用于其端口输入/输出数据的桥梁,或称为数据缓冲器。
7.1.1 设置端口的输入/输出状态,◆根据I/O端口引脚的输入/输出状态,对该端口的数据方向控制寄存器(TRISX)进行初始化定义 ◆若把TRIS某位设置为“1”,则相应的PORT端口引脚定义为输入端; ◆若把TRIS某位设置为“0”,则相应的PORT端口引脚定义为输出端1、定义输入线 ◆当把某个端线定义为输入状态时,信号“1”通过单片机的内部数据总线加至方向锁存器D2的输入端,在写方向控制信号的触发下写入D2锁存 ◆此时,D2的Q=1,上部的“或”门封闭,其输出恒定为“1”,这就导致P沟道场效应管截止;,◆Q=1则Q=0,下部的“与”门封闭,其输出恒定为“0”,这就导致N沟道场效应管截止 ◆正是由于数据输出通道的封闭,数据只能从外部单向输入1,1,0,1,0,P沟道场效应管截止,N沟道场效应管截止,◆当I/O端口引脚用于输入数据时,方向控制寄存器TRISX的对应位必须设置为“1” ◆根据“或”门和“与”门的接线方式,不论另一个输入端的信号如何,此时这2个门的输出均被封闭,即处于高阻状态◆因此,在这种情况下,上下2个场效应管都处于截止状态, I/O输出数据通道是关闭的 ◆外部I/O引脚数据,经过输入缓冲器调整连接到输入数据锁存器D3的输入端,通过读端口数据触发信号完成数据的输入。
读端口数据触发信号主要有2个作用: ◆锁存输入数据读端口脉冲信号,经反向器触发锁存外部I/O引脚的输入数据 ◆临时占用内部数据总线作为门控信号临时打开三态门,以便让输入数据锁存器的输出连通单片机的内部数据总线◆数据输入时应特别注意,外部提供的数据信号并不会自动锁存,必须保持足够长的时间,直到指令读入为止2、定义输出线 ◆当把某个端线定义为输出状态时,信号“0”通过单片机的内部数据总线加至方向锁存器D2的输入端,在写方向控制信号的触发下写入D2锁存 ◆此时,D2的Q=0,上部的“或”门恒定开放,“或”门的输出直接由来自数据锁存器D1的输出决定;,◆D2的Q=0时Q=1,下部的“与”门也恒定开放,“与”门的输出直接由来自数据锁存器D1的输出决定 ◆数据输出通路被打开,被定义为输出状态0,0,1,输出数据“1” ◆信号“1”通过单片机的内部数据总线加至输出数据锁存器D1的输入端,在写端口控制信号CK的触发下写入D1锁存 ◆从D1的反向器输出端Q输出“0”,此时的“或”门处于直通状态,“或”门的输出也为“0”,因而P沟道场效应管导通;,,◆同样,“与”门的输出为“0”,导致N沟道场效应管截止 ◆正是由于上部的场效应管导通而下部的场效应管截止,此时I/O输出引脚被拉至高电平“1”,同原来内部数据总线信号一致,内部的数据“1”被间接输出。
1,1,0,P沟道场效应管导通,输出端与电源正极性端接通,0,0,1,0,0,N沟道场效应管截止,1,输出数据“0” ◆信号“0”通过单片机的内部数据总线加至输出数据锁存器D1的输入端,在写端口控制信号CK的触发下写入D1锁存 ◆从D1的反向器输出端Q输出“1”,此时的“或”门处于直通状态,“或”门的输出也为“1”,因而P沟道场效应管截止;,,◆同样,“与”门的输出为“1”,导致N沟道场效应管导通 ◆正是由于上部的场效应管截止而下部的场效应管导通,此时I/O输出引脚被拉至低电平“0”,同原来内部数据总线信号一致,内部的数据“0”被间接输出0,0,1,P沟道场效应管截止,0,0,1,1,1,N沟道场效应管导通,输出端与电源负极性端接通,0,◆PIC16F877单片机的PORTA是6位宽,带锁存器的I/O口 ◆其对应的数据寄存器和方向控制寄存器分别是PORTA和TRISA一、PORTA和它的方向寄存器TRISA,◆地址分别是05H和85H,分别位于存储体0和存储体1的相同位置上,并且都只用到了低6位,每个寄存器中阴影标出的2位没有被利用 ◆PORTA端口作为模拟电压输入或模拟参考电压输入,需设置ADCON1寄存器低4位的相应位。
与A口有关的专用寄存器有3个,◆当TRISA寄存器相应位置为1,其输出驱动器呈高阻状态,PORTA相应的I/O引脚被定义为输入; ◆当TRISA寄存器相应位为0,输出锁存器上的数据就从相应I/O引脚上输出,所以这时PORTA相应的I/O引脚被定义为输出;,◆当作为模拟电压输入引脚时,必须保持TRISA置1,即将RA的相应引脚设置为输入 ◆读PORTA得到的是端口引脚上的电平状态,而写PORTA则是写入端口的数据锁存器,所有的写操作都是“读一修改一写”操作◆因此,对端口的写意味着先读端口引脚电平,然后根据指令的要求修改这个值,最后再写入端口的数据锁存器 ◆RA4引脚是一个多功能I/O口,可以切换作为定时器TMR0的时钟输入,表示为RA4/T0CKI◆RA4/T0CKI是斯密特触发输入和集电极开路输出所有其他RA口引脚都是TTL电平输入和CMOS驱动输出 ◆端口A其他引脚RA0 、RA1 、RA2、 RA3、 RA5的第二功能是作为模拟电压输入或模拟参考电压输入◆引脚的选择是通过置位/复位ADC控制寄存器1(ADCON1)的低4位来决定的 ◆当上电复位时,这些引脚设定为模拟电压输入,读这些引脚时,得到的结果是零。
◆PCFG3:PCFG0=011x时选择A口的5个引脚和E口的3个引脚为数字I/O引脚,这4位用以选择RA和RE的哪些引脚为模拟量输入和模拟参考电压输入,,RA口初始化的程序,BCF STATUS,RP0 BCF STATUS,RP1 ;选RAM的BANK0 CLRF PORTA ;清除RA口 BSF STATUS,RP0 ;选RAM的BANK1 MOVLW 0x07 MOVWF ADCON1 ;RA口为数字I/O MOVLW 0xCF MOVWF TRISA ;RA5:RA4为输出 ;RA3:RA0为输入,◆端口B是一个8位宽,双向可编程I/O端口 ◆其对应的数据寄存器和方向控制寄存器分别是PORTB和TRISB二、PORTB和它的方向寄存器TRISB,◆PORTB的地址有2个,分别是06H和106H,说明在存储体0和存储体2的相同位置上都能访问到它; ◆TRISB的地址也有2个,分别是086H和186H,说明在存储体1和存储体3的相同位置上也都能访问到它与B口相关的寄存器共有4个 数据寄存器PORTB 地址:06H、106H,方向寄存器TRISB 地址:86H、186H,◆当TRISB寄存器相应位置为1,其输出驱动器呈高阻状态,PORTB相应的I/O引脚被定义为输入; ◆当TRISB寄存器相应位为0,输出锁存器上的数据就从相应I/O引脚上输出,所以这时PORTB相应的I/O引脚被定义为输出。
◆PORTB有三个引脚与低电压编程功能复用,它们是:RB3/PGM、RB6/PGC和RB7/PGD ◆PORTB的RB7:RB4定义为输入,这4根I/O线上的电平有变化时,可以引起中断◆其功能的实现是通过把RB7:RB4引脚上的输入信号与上次读入B口的旧的锁存值进行比较 ◆若有变化,则把两者相异或后输出以产生RBIF中断(中断的标志在INTCON寄存器中的D0) ◆这种中断可以把CPU从“休眠(SLEEP)”状态中唤醒◆端口B的每一个引脚具有内部弱上拉功能,这可以通过软件编程设置,即选项寄存器OPTION_REG的D7(RBPU) ◆RBPU=0时,设置弱上拉功能可以启用; ◆RBPU=1时,设置弱上拉功能被禁止 弱上拉:最简单的解释,就是比较弱的上拉◆对于其中某一个具体引脚而言,仅当它被定义为输入方式,并且同时RBPU=0,弱上拉功能才确实被启用; ◆反之,如果该引脚定义为输出,无论RBPU为何值,该脚上的弱上拉功能都自动被取消选择寄存器OPTION_REG,,与端口B有关的2个控制位的含义如下:,◆INTEDG:外部中断INT触发信号边沿选择位 1:选择RB0/INT上升沿触发有效; 0:选择RB0/INT下降沿触发有效。
◆RBPU:端口B内部弱上拉电路使能控制位 1:端口B弱上拉电路禁止; 0:端口B弱上拉电路使能中断控制寄存器INTCON 地址:0BH,8BH,是一个可读/写的寄存器,与端口B有关的控制位只有2个,含义如下:,◆RBIE:端口B的引脚RB7~RB4电平变化中断屏蔽位: 1:允许端口B产生的中断; 0:屏蔽端口B产生的中断 ◆ RBIF:端口B的引脚RB7~RB4电平变化中断标志位 1:RB7~RB4已经发生了电平变化中断(必须用软件清除); 0:RB7~RB4未发生电平变化中断端口B初始化程序,BCF STATUS,RP0 BCF STATUS,RP1 ;选BANK0 CLRF PORTB ;清除RB口 BSF STATUS,RP0 ;选BANK1 MOVLW 0x0F MOVWF TRISB ;RB3:RB0为输入 ;RB7:RB4为输出 BCF OPTION_REG,7 ;启用内部弱上拉,◆端口C是一个8位宽,双向可编程I/O端口 ◆其对应的数据寄存器和方向控制寄存器分别是PORTC和TRISC ◆PORTC的地址是07H,在存储体0, ◆TRISC的地址是87H,在存储体1。
三、PORTC和它的方向寄存器TRISC,与端口C有关的寄存器有2个: PORTC 地址:07H,TRISC 地址:87H,◆当TRISC寄存器相应位置1,其输出驱动器呈高阻状态,PORTC相应I/O引脚被定义为输入; ◆当TRISC寄存器相应位置为0,输出锁存器上的数据就从相应I/O引脚上输出,这时PORTC的相应I/O引脚被定义为输出端口C初始化程序,BCF STATUS,RP0 BCF STATUS,RP1 ;选BANK0 CLRF PORTC ;清除RC口 BSF STATUS,RP0 ;选BANK1 MOVLW 0xCF ;送11001111到TRISC MOVWF TRISC ;设置RC3:RC0为输入 ;RC5:RC4为输出 ;RC7:RC6为输入,◆在PIC16F87X系列单片机中,只有40脚封装的PIC16F874(A)/877(A)芯片上有端口D ◆端口D是一个8位双向I/O端口它在基本输入/输出功能的基础上,复合了并行从动端口的功能四、PORTD和它的方向寄存器TRISD,◆PORTD工作于并行从动端口方式时,将TRISE寄存器。
