打印
[学习资料]

输入输出端口详解

[复制链接]
5528|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nawu|  楼主 | 2021-7-6 14:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.引言:
PIC单片机引脚图:


在PIC16F87X 单片机中,28引脚型号的单片机有3 个I/O端口,分别是RA、RB和RC;40引脚型号单片机有5个 I/O端口,分别是RA、RB、RC、RD和RE。其中RA有6条口线,RE有3条口线,其余都有 8条口线。
PIC16F87X端口口线既可作普通I/O引脚,又可作某些部件或外 围模块的外接引脚,比如端口引脚RC.4既可用作普通I/O脚,又可以作为SPI串行通信的数据输入引脚。这里只介绍端口的基本功能和基本用法,端口的其他复合功能,在以后介绍。


使用特权

评论回复
沙发
nawu|  楼主 | 2021-7-6 14:25 | 只看该作者
2.与输入/输出端口相关的2个寄存器
PIC单片机中各个I/O端口都具备两个基本的专用寄存器:端口数据寄存器和端口方向寄存器。如下所示。      


这些寄存器在RAM中都有统一的编址,即PIC单片机的端口都可以当作RAM单元来访问,无需专门的指令访问。


使用特权

评论回复
板凳
nawu|  楼主 | 2021-7-6 14:31 | 只看该作者
3.输入/输出端口的基本结构
PIC16F87X的3/5个端口不但结构上存在差异,而且同一端口的各口线的内部结构也略有差别,但是他们的基本结构模型,如下图所示。

图中有三个D触发器(也称为锁存器)。
其中Data Latch代表了端口数据寄存器,例如PORTA、PORTB、PORTC;
TRIS Latch端口方向寄存器,例如TRISA、TRISB、TRISC;而Input Latch是端口设置为输入时作为缓冲器。
3.1 基本输入/输出端口的工作原理
下面对端口口线进行的基本操作说明如下:
⒈写I/O方向寄存器TRIS Latch
当方向寄存器中的内容为1时,则对应口线被设置为输入(Input);当其内容为0时,则对应引脚设置为输出(Output)。
⒉ 经端口引脚输出数据
   要把端口口线作为输出,必须要把该口线预先设定为输出态,即相应的TRIS Latch的内容必须为0。
⒊从端口引脚输入数据
  要把端口口线作为输入,必须要把该口线预先设定为输出态,即相应的TRIS Latch的内容必须为1。
3.2输入/输出端口基本功能的应用举例
下面的实例是单键触发8位二进制累加计数器,是针对端口功能和ICD在线调试器上的硬件为基础而设计的。该实例中要用到的硬件电路如下图所示。

图中端口RC外接8条支路,这8条支路构成了端口RC的输出电路,其中8只电阻起限流作用,保护端口引脚和发光二极管LED;LED在高电平时发光。图中还使用了端口RB的RB0口线作为外接输入引脚。电阻R4为限流电阻,对RB0引脚起保护作用;电阻R21为上拉电阻,将RB0电平拉高;开关SW1用来人工输入低电平脉冲信号。


使用特权

评论回复
地板
nawu|  楼主 | 2021-7-6 14:32 | 只看该作者
程序设计思路 :

刚接通电源时,8只发光二极管都不亮,表示计数器初始值为0。
按下开关SW1时,计数器值加l,D0点亮,表示二进制数00000001B,然后松开按钮;再次按下SW1时,计数器值又加1,D1点亮,表示二进制数00000010B,然后再松开按钮;依次类推。直到按了255次按钮时,D7~D0全部点亮,假如再次按动按钮将使计数器回0。如此循环往复。
设计按钮输入程序时,有一点需要注意,就是必须处理按钮在按下或松开时存在抖动现象,以免产生误判。按钮的去抖动一般都是调用延迟程序来消除抖动的。即在程序设计中,当查询到RB0上的首次电平变化后,马上延迟τ(例如10ms),待RB0上的状态稳定后,再次查询确认,果真是按键动作(按下或者松开),方认定为有效,否则,判为干扰脉冲。程序清单如下:

STATUS     EQU     03H   
PORTB      EQU     06H   
TRISB      EQU     86H
PORTC      EQU     07H   
TRISC      EQU     87H     
DATA1      EQU     20H          ; DATA1为延时变量
DATA2      EQU     21H          ; DATA2为延时变量
N1         EQU     D'13'        ;外层循环延时常数
N2         EQU     0FFH         ;内层循环延时常数
RP0        EQU      5H          ;体选位RP0
ORG        000H      
     BSF    STATUS, RP0         ;切换到RAM的体1
     MOVLW  00H                 ;将端口C设为输出
     MOVWF  TRISC      
     MOVLW  0FFH                ;将端口B设置为输入
     MOVWF  TRISB           
     BCF    STATUS, RP0         ;恢复到RAM的体0
     PORTC  EQU     07H   
     TRISC  EQU     87H     
     DATA1  EQU     20H         ; DATA1为延时变量
     DATA2  EQU     21H         ; DATA2为延时变量
     N1     EQU     D'13'       ;外层循环延时常数
     N2     EQU     0FFH        ;内层循环延时常数
     RP0    EQU      5H         ;体选位RP0
ORG      000H      
     BSF     STATUS, RP0        ;切换到RAM的体1
     MOVLW  00H                 ;将端口C设为输出
     MOVWF  TRISC      
     MOVLW  0FFH                ;将端口B设置为输入
     MOVWF  TRISB           
     BCF    STATUS, RP0         ;恢复到RAM的体0



使用特权

评论回复
5
nawu|  楼主 | 2021-7-6 14:32 | 只看该作者

汇编语言往往需要更多硬件知识,因此对于主攻软件或者有着良好C语言编程能力的人,我更像偏向于C编程。

使用特权

评论回复
6
nawu|  楼主 | 2021-7-6 14:33 | 只看该作者
以下是用C语言编写的程序:


include <pic.h>
#define N1 13    //外循环
#define N2 0xff   //内循环
static volatile bit PORTB0 @(unsigned)&PORTB*8+0; //端口可变设计
int DATA1,DATA2;
main() {
           TRISC=0xff; //Input ???????  TRISC = 0x00;  //Output
           TRISB=0xff; //Input
           PORTC=0;    //清零
check: if PORTB0==0 then goto check;  //监测是否有电平信号输入  有效电平信号1
            DELAY();  //延时去抖动
            if PORTB0==0 then goto check;//去抖动确定
            PORTC++; //C语言设计好处 立刻就凸显出来了
CHECK1 if  PORTB0==1  goto  CHECK1;  
             DELAY()
             if  PORTB0==1  goto  CHECK1;
             GOTO  check;
             while(1) {  };
}
void DELAY()   
{
        DATA1=N1;      
   LP0: DATA2=N2;            
   LP1: if DATA2-- > 0 goto LP1;                 
        if DATA1-- > 0 goto LP0;
   return;
  }


使用特权

评论回复
7
两只袜子| | 2021-7-8 16:21 | 只看该作者
很不错的基础知识贴

使用特权

评论回复
8
两只袜子| | 2021-7-8 16:21 | 只看该作者
很不错的基础知识贴

使用特权

评论回复
9
木木guainv| | 2021-8-6 18:32 | 只看该作者
解释的还是非常详细的

使用特权

评论回复
10
xiaoqizi| | 2021-8-6 18:36 | 只看该作者
我还是更加偏爱c语言

使用特权

评论回复
11
wakayi| | 2021-8-6 18:41 | 只看该作者
代码的执行效率是不一样的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

3308

帖子

3

粉丝