I/O控制对于单片机而言是最基础最核心的东西,其实单片机除了模/数转换之外的事情。其他大部分的事情I/O口都能做的到。I/O控制简单却能千变万化。

单片机在大部分应用中做的事情,莫过于 输入高低电平 ,输出高低电平。就是通过这简单的控制电平来实现大多数的应用控制。

1. 什么是 I/O 口?

I 表示 IN(输入),O 表示 OUT(输出),所以 I/O = 输入/输出

2. I/O 具体能做什么呢?

如果你是刚刚步入电子的新手,那你最好要知道一下I/O口具体能做什么。感性的认识对你的学习是很有帮助的。I/O口输出一个高(低)电平可以用来点亮一个LED灯,可以接通过一个继电器来开启电机,来开启音响。开启许多的东西,也可以用于通信等等。输入一个高(低)电平 可以用来检测按键,检测红外线输入 ,检测信号等等。

3. I/O口和单片机内部寄存器之间的对应关系

首先看下一个芯片的原理图。 注意 RA0~RA5 这些口

RA端口的方向控制寄存器:TRISA(三态,tristate)

TRISA 寄存器占用一个字节(8位),每位代表一个引脚的方向:0表示输出模式(Out),1表示输入模式(In)

U-0

U-0

R/W-1/1

R/W-1/1

R-1/1

R-1/1

R-1/1

R-1/1

-

-

TRISA5

TRISA4

TRISA3

TRISA2

TRISA1

TRISA0

Bit 7

           

Bit 0

RA3 默认位 1,无法修改

该表格摘自数据手册,不同的芯片略有不同,具体参见所使用芯片的数据手册

RA端口的数据控制寄存器:PORTA

U-0

U-0

R/W-x/x

R/W-x/x

R-x/x

R/W-x/x

R/W-x/x

R/W-x/x

-

-

RA5

RA4

RA3

RA2

RA1

RA0

Bit 7

           

Bit 0

该表格摘自数据手册,不同的芯片略有不同,具体参见所使用芯片的数据手册

RA端口的模/数控制寄存器:ANSELA

ANSELA 寄存器占用一个字节(8位),每位代表一个引脚的模/数:0 = 数字I/O口,1 = 模拟输入口

U-0

U-0

U-0

R/W-1/1

U-0

R/W-1/1

R/W-1/1

R/W-1/1

-

-

-

ANSA4

-

ANSA2

ANSA1

ANSA0

Bit 7

           

Bit 0

该表格摘自数据手册,不同的芯片略有不同,具体参见所使用芯片的数据手册

U-0 表示未实现位,读数为0;-n/n 表示POR 和BOR时的值/所有其他复位时的值

当将某个引脚设置为模拟输入时,必须将相应的 TRIS 位设置为输入模式,以允许从外部控制引脚电压。

通过上面的原理图和三个表格,可以很容易看出原理图中的 第2脚( ".../RA5")相关的寄存器:TRISA:TRISA5 和 PORTA:RA5,同时该脚不具备模拟输入功能

4. 如何控制I/O口?

其实控制单片机,就是控制寄存器上的各个位,设置成高(1)或者低(0)。

TRISA 寄存器是方向控制寄存器。就是控制 I/O 脚输入还是输出。比如 TRISA:TRISA5 位设置为 0,那么RA5口是输出,反之则为输入。(为了方便记忆,可以把 0 看成 Output, 1 看出 Input);

将RA5口设置成 输入 的几种方式(C语言):

第一种:TRISAbits.TRISA5=1; // 简单明了,只影响一个位 设置单个I/O比较方便

第二种:TRISA |= 0x20; // 0x20 = 0b0010 0000,不够明了,只影响一个位

第三种:TRISA = 0x20; // 0x20 = 0b0010 0000,不够明了,影响到其他位,设置多个I/O用比较方便

将RA5口设置成 输出 的几种方式(C语言):

第一种:TRISAbits.TRISA5=0;

第二种:TRISA &= ~0x20;

第三种:TRISA  = 0x00;

PORTA 寄存器是数据控制寄存器。

如果是输出状态:PORTA:RA5 为 0,则 RA5引脚 输出低电平;PORTA:RA5 为 1,则 RA5引脚 输出高电平。

如果是输入状态:PORTA:RA5 为 0,则 RA5引脚 当前为低电平,PORTA:RA5 为 1,则 RA5引脚 当前为高电平。

5. 实例程序

如果在RA5口上连接着一个LED灯。我们将如何点亮他呢?

// 头文件
#include<pic.h>  // 单片机配置字
__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF&BOREN_ON&CLKOUTEN_OFF&IESO_ON&FCMEN_ON);
__CONFIG(PLLEN_OFF&LVP_OFF) ;// 主程序
int main(int argc, char** argv) {ANSELA = 0;  // 将RA口全部设置成数字口,TRISAbits.TRISA5 = 0;  // 设置RA5为输出PORTAbits.RA5 = 1;  // 设置输出高电平点亮LEDwhile(1);//程序在此无限循环
}

头文件:程序中只要有了 #include<pic.h> 编译器就会去自动找到相应型号的头文件,头文件中定义好了每个寄存器的地址,位的地址等。

配置位:这是十分重要即使程序没有任何错误 配置位没配置好程序一样不能用。

模拟数字口:在使用I/O口的时候要确保对应的I/O口是被设置成数字口的。

【PIC】IO 口控制(TRISx,PORTx, ANSELx)相关推荐

  1. IO口多路查理复用:三个单片机IO口控制六个LED

    简 介: 本文介绍了单片机的IO控制 LED 中的复用技术,特别查理复用基本原理和特点进行了介绍.使用一款IS31FL3731可以构成16×9的PWM亮度可控的 LED 矩阵. 关键词: 查理复用,C ...

  2. 如何使用一个单片机的IO口控制两个LED?

    简 介: 本文介绍了一种使用单个IO口独立控制两个LED点亮的方案.并对于不同颜色的LED和不同工作电压下的MCU进行了讨论.给出了在不同的颜色组合.工作电压的情况下不同的驱动方案. 关键词: IO, ...

  3. 单片机两个IO口控制三个LED灯

    在项目中经常会遇到单片机IO口资源不够用的情况,那么如何让单片机的IO口利用最大化呢,这里分享一下用单片机两个IO口控制三个LED灯的几种方法. 方法一:      S1和S2分别接单片机两个IO口, ...

  4. 单片机io口的控制实验c语言,单片机io口控制实验报告

    <单片机io口控制实验报告>由会员分享,可在线阅读,更多相关<单片机io口控制实验报告(5页珍藏版)>请在人人文库网上搜索. 1.单片机io口控制实验报告 精品文档,仅供参考单 ...

  5. 启明云端分享|ESP32-C3 IO口控制灯的应用及串口通信示例

    启明云端作为乐鑫代理,一直都尽最大可能做完善的教程能帮助更多的开发小伙伴快速上手各种应用:今天小明为大家带来ESP32-C3IO口控制灯的应用及串口通信示例,每一个步骤我们都分享出来供小伙伴们参考! ...

  6. 1.2基本IO口控制

    1.2.1从最基础的点LED灯开始 单片机通过寻址找到 IO口 怎么(编程)找到IO口呢:ANSI C sfr"指令": 用来直接描述硬件地址,先理解成"一组IO口&qu ...

  7. 微信小程序控制开关 控制io口 控制灯

    准备材料 8266 1个 按键 2个 led 1 个以上 扫描微信小程序 下载固件1.0.1 链接:https://pan.baidu.com/s/1em71pN_oXIT3o4wX_YUAag 提取 ...

  8. 51c语言单片机io口控制实验报告,单片机I/O口控制实验

    描述 实验 单片机I/O 口控制实验 一. 实验目的 利用单片机的P1 口作IO 口,使用户学会利用P1 口作为输入和输出口. 二. 实验设备及器件 IBM PC 机 一台 DP-51PROC 单片机 ...

  9. 关于CC2530入门新手需要知道的一些关于单片机的基本知识(一)IO口控制

    最近刚刚接触了单片机方面,关于单片机方面的知识很多也很杂,本科生一般还不会接触到比较系统的知识,所以在学习的同时,我也把自己的笔记进行了整理,希望能对大家产生帮助,关于单片机的理论知识,我大概会分为五 ...

  10. 一个IO口控制多个按键方法

    使用注意:   ADC测到的电压值只是大约的范围,例如假如上面K1算得1.0V,那么实际可能是在0.9V-1.1V之间波动:   电路中的电阻应合理计算,使各按键对应的电压值均匀分布在 0-DVCC之 ...

最新文章

  1. JavaScript初学者编程题(14)
  2. MongoDB 数据库、集合创建删除与文档插入
  3. 《智慧书》格言211-220
  4. 【⌛工欲善其事,必先利其器⏳】葵花宝典の费曼学习法
  5. Python_XlrdXlwt
  6. WPF 实现加速小火箭~
  7. [转]使用C#开发ActiveX控件
  8. TextureUnpacker 分割 Texturepacker 产生的图片 支持windows 和 mac
  9. leetcode/剑指Offer05.替换空格 双指针法实现原地替换
  10. 十代思域手动挡齿比 转速 档位 时速对照表
  11. JanusGraph配置参考大全
  12. java纯数字正则表达式_java正则表达式匹配所有数字的案例
  13. 帝国cms 自动生成html,帝国cms实现用户访问页面自动生成html的方法
  14. 蔡氏电路matlab,基于MATLABSimulink的蔡氏电路研究(Simulink搭建仿真系统)
  15. 计算机无法开机如何读u盘启动,电脑无法识别U盘启动盘怎么办?
  16. 基于JAVA的农产品销售管理系统【数据库设计、源码、开题报告】
  17. 工作时间如何安排:集中注意力的方法
  18. 第十二届蓝桥杯2021年C++A组省赛题解
  19. 美度舵手系列多功能计时腕表伴你行走世界
  20. Prometheus 官方记录片(中英双语),带你了解 Prometheus 的前世今生

热门文章

  1. 《safe-area-inset-bottom之兼容问题》
  2. 使用Cairo生成黑白和RGB渐变色图片
  3. demension(dimensional)
  4. RealLanSee 同步多端口局域网屏幕监控系统(极好用低占用!)
  5. D FFF团的怒火
  6. mindspore.Profiler如何获取算子的aicore_time、mte1_time等数据
  7. 函授计算机怎么找工作,找工作函授学历可以吗
  8. Boost库学习の时间日期处理
  9. boost 时间和日期
  10. 华为交换机常见NAC操作