资源描述
第六章输入输出端口的基本功能,在PIC16F87X单片机中,28引脚型号的单片机有3个IO端口,分别是RA、RB和RC;40引脚型号单片机有5个IO端口,分别是RA、RB、RC、RD和RE。其中RA有6条口线,RE有3条口线,其余都有8条口线。PIC16F87X端口口线既可作普通IO引脚,又可作某些部件或外围模块的外接引脚,比如端口引脚RC.4既可用作普通IO脚,又可以作为SPI串行通信的数据输入引脚。本章只介绍端口的基本功能和基本用法,端口的其他复合功能,在以后章节中介绍。,6.1与输入输出端口相关的2个寄存器PIC单片机中各个IO端口都具备两个基本的专用寄存器:端口数据寄存器和端口方向寄存器。如下所示。,这些寄存器在RAM中都有统一的编址,即PIC单片机的端口都可以当作RAM单元来访问,而无需专门的指令来访问。,6.2输入输出端口的基本结构PIC16F87X的5个端口不但结构上存在差异,而且同一端口的各口线的内部结构也略有差别,但是他们的基本结构模型,如下图所示。图中有三个D触发器(也称为锁存器),其中DataLatch代表了端口数据寄存器,例如PORTA、PORTB、PORTC;TRISLatch端口方向寄存器,例如TRISA、TRISB、TRISC;而InputLatch是端口设置为输入时作为缓冲器。基本输入输出端口的工作原理下面对端口口线进行的基本操作说明如下:,写IO方向寄存器TRISLatch当方向寄存器中的内容为1时,则对应口线被设置为输入;当其内容为0时,则对应引脚设置为输出。经端口引脚输出数据要把端口口线作为输出,必须要把该口线预先设定为输出态,即相应的TRISLatch的内容必须为0。从端口引脚输入数据要把端口口线作为输入,必须要把该口线预先设定为输出态,即相应的TRISLatch的内容必须为1。,6.3输入输出端口基本功能的应用举例下面的实例是单键触发8位二进制累加计数器,是针对端口功能和ICD在线调试器上的硬件为基础而设计的。该实例中要用到的演示板上的部分硬件电路如下图所示。图中端口RC外接8条支路,这8条支路构成了端口RC的输出电路,其中8只电阻起限流作用,保护端口引脚和发光二极管LED;LED在高电平时发光。图中还使用了端口RB的RB0口线作为外接输入引脚。电阻R4为限流电阻,对RB0引脚起,保护作用;电阻R21为上拉电阻,将RB0电平拉高;开关SW1用来人工输入低电平脉冲信号。程序设计思路本实例是把演示板当做一个计数器。刚接通电源时,8只发光二极管都不亮,表示计数器初始值为0。按下开关SW1时,计数器值加l,D0点亮,表示二进制数00000001B,然后松开按钮;再次按下SW1时,计数器值又加1,D1点亮,表示二进制数00000010B,然后再松开按钮;依次类推。直到按了255次按钮时,D7D0全部点亮,假如再次按动按钮将使计数器回0。如此循环往复。,设计按钮输入程序时,有一点需要注意,就是必须处理按钮在按下或松开时存在抖动现象,以免产生误判。按钮的去抖动一般都是调用延迟程序来消除抖动的。即在程序设计中,当查询到RB0上的首次电平变化后,马上延迟(例如10ms),待RB0上的状态稳定后,再次查询确认,果真是按键动作(按下或者松开),方认定为有效,否则,判为干扰脉冲。程序清单如下:STATUSEQU03HPORTBEQU06HTRISBEQU86H,PORTCEQU07HTRISCEQU87HDATA1EQU20H;DATA1为延时变量DATA2EQU21H;DATA2为延时变量N1EQUD13;外层循环延时常数N2EQU0FFH;内层循环延时常数RP0EQU5H;体选位RP0ORG000HBSFSTATUS,RP0;切换到RAM的体1MOVLW00H;将端口C设为输出MOVWFTRISCMOVLW0FFH;将端口B设置为输入MOVWFTRISBBCFSTATUS,RP0;恢复到RAM的体0,MOVLW00H;初始化端口CMOVWFPORTCLPBTFSCPORTB,0;测试SW1按下否?GOTOLP;否!则循环检测CALLDELAY;调用延时程序去抖动BTFSCPORTB,0;再次测试SW1按下否?GOTOLP;否!则循环检测INCFPORTC,1;PORTC+1-PORTCLP1BTFSSPORTB,0;测试SW1断开否GOTOLP1;否!则循环检测CALLDELAY;消除断开抖动BTFSSPORTB,0;再次测试SW1断开否GOTOLP1;否!则循环检测GOTOLP;返回,DELAYMOVLWN1;N1DATA1MOVWFDATA1LOOP0MOVLWN2;N2DATA2MOVWFDATA2LOOP1DECFSZDATA2,1;DATA2-1DATA2,;若为0则跳转GOTOLOOP1DECFSZDATA1,1;DATA1-1DATA1,;若为0跳转GOTOLOOP0RETURNEND;源程序结束以下是用C语言编写的程序:,#include#defineN113#defineN20 xffstaticvolatilebitPORTB0(unsigned),voidDELAY()DATA1=N1;LP0:DATA2=N2;LP1:ifDATA2-0gotoLP1;ifDATA1-0gotoLP0;return;,
展开阅读全文