0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在XC8中使用PIC IO引脚

454398 来源:工程师吴畏 2019-07-26 09:24 次阅读

原理图

如何在XC8中使用PIC IO引脚

配置位

大多数PIC程序在main.c文件的最顶部都有一个配置代码块。大部分内容在相关之前不会被覆盖,但重要的是在main.c文件中放入相同的代码(如下所示)。

原因是PIC具有硬件(例如看门狗定时器)可以重置设备,这可能会导致意外的结果。因此,此处的配置代码完全禁用所有这些额外功能,以确保它们不会妨碍您!

但是如果您很好奇,可以通过单击生产》设置配置位来生成自己的配置代码。

这将打开以下窗口,可用于更改位。完成所有更改后,单击“生成源代码以输出”。然后,这将在输出窗口中生成可以复制到主文件的代码!

配置振荡器

当我们用C编写程序时,有些事情我们不必考虑,例如计算机将如何与键盘对话或CPU正在使用什么振荡器。但是,微控制器与日常计算机不同,它们需要一定程度的配置才能正常运行。那么我们需要配置什么才能使PIC运行?通常,在运行主循环之前需要执行两个主要的配置代码:振荡器配置和I/O配置。

PIC器件由许多不同的模块组成,包括定时器,存储器和I/O外设,但最重要的是CPU。 CPU或中央处理单元是实际以指令形式执行操作的电路。当我们为运行的芯片创建C程序时,编译器将C程序转换为PIC的CPU可以理解的指令。与现有的其他CPU一样,PIC中的CPU以离散的步骤工作,而不是瞬间完成。要使CPU执行这些步骤(运行程序),需要一个时钟源。该时钟源可以来自外部振荡器,晶振,甚至是PIC内部的内部振荡器。为了简化电路,这里的大多数项目都会将PIC配置为使用内部振荡器。

在PIC芯片上配置振荡器要求我们调用一些特定指令并配置特定配置位。根据您使用的PIC,这将有所不同,因此本文中的代码仅考虑PIC16F819。我们的主文件(在上一篇文章中创建)中的第一个任务是确保我们的振荡器配置位设置为使用内部振荡器。

PIC16F819内部振荡器配置

设置该位不能配置振荡器运行的速度;它只告诉PIC它将运行内部振荡器。

下一步是设置振荡器的速度。由于PIC会逐步执行指令,并且这些步骤发生在来自振荡器的脉冲上,因此更快的振荡器将导致更快的PIC,这意味着它将能够每秒执行更多指令。但有多少? PIC16和PIC18器件通常需要四个时钟周期来执行指令,因此经验法则是将振荡器速度除以4,这就是PIC每秒指令的速度。

例如一个工作在8MHz的PIC每秒可以执行大约200万条指令,而工作在64MHz的PIC每秒可以执行1600万条指令。

那么,我们如何配置速度?这取决于每个PIC,但通常有一个名为OSCCON的寄存器可用于调整速度。找出所涉及寄存器的最佳方法是查看振荡器配置章节下的器件数据表。以下是PIC16F819数据手册中的摘录,描述了第38页上的不同速度(PDF)。

我们将配置我们的设备以8MHz运行,要做到这一点,我们需要将IRCF设置为111.在XC8中,可以使用它们的名称直接访问寄存器,可以使用位和点指令访问特定位,并且可以访问一组位(例如IRCF)作为单个值,如下所示。

OSCCON = 0b01110000(为整个OSCCON寄存器赋值)

OSCCONbits.IRCF = 0b111(将三个IRCF位分配给111)

OSCCONbits.IRCF0 = 1(为IRCF0指定二进制值1)

在我们的代码中,我们将使用以下指令将振荡器设置为8MHz:

配置和使用I/O端口

为了使我们的PIC能够与外部电路进行交互,它需要能够读取和写入其I/O引脚的数据。在处理PIC16F819上的I/O端口时,我们需要关注三个寄存器:

TRISA和TRISB寄存器(端口A和端口B上引脚的方向)

PORTA和PORTB寄存器(输入和输出寄存器)

ADCON1寄存器(引脚是数字引脚还是模拟输入引脚)

在我们的大多数项目中,我们将处理数字输出(如LED,显示器等),因此务必确保I/O引脚未配置为模拟输入。为确保这一点,我们将查看ADCON1寄存器(见第82页(PDF))并设置相应的PCFG位,以便与ADC相关的所有引脚都是数字引脚。

在我们的电路中,我们有一个LED输出连接到RB2(引脚8),因此我们需要将其配置为输出。为此,我们使用TRIS(TRISTATE)寄存器,该寄存器用于确定哪些引脚是输入,哪些是输出。

PIC上的每个端口最多可以为8位宽(RB0-RB7用于示例)并且TRIS寄存器中的每个位对应于输出引脚。如果某位为1(打开),则后续引脚为输入,如果某位为0(关闭),则该位为输出。

例如,如果TRISB等于0,则全部为8 PORT B上的引脚将是输出。如果TRISB = 255(二进制为11111111),则PORT B上的所有引脚都是输入。如果TRISB的值为0xF0(二进制为11110000),则PORT B(RB0-RB3)中的前四个引脚为输出,后四个引脚(RB4-RB7)为输入。请记住,二进制数首先从最右边读取!

有了这些知识,我们需要将RB2配置为输出。这可以使用TRISB寄存器名称并访问TRISB2位来完成,如下所示。

但我们如何读写I/O销?这在其他PIC上可能略有不同,但在PIC16F819上我们使用PORT寄存器,我们再次使用位和点访问各个引脚!

端口引脚不限于一次读取一个。您可以改为对整个PORT寄存器进行读写操作。这意味着您可以将PORT用作8位输入/输出端口,这在与字母数字LCD显示器等设备交互时非常有用。

您可能想要记住的一个简洁功能是您可以随时配置I/O引脚!一分钟你的引脚可能是一个输入引脚,下一个它可能是一个输出!重要的是你设置了TRIS位的正确值。

示例程序

本示例程序配置PIC16F819读取连接到其引脚RA0(引脚17)的触觉开关,然后打开/关闭RB2上的LED(引脚) 8),取决于开关的状态。

虽然这个例子看起来很基本,但你现在应该可以编写一个PIC设备来运行你的C程序和读/写端口。这已经允许您与市场上的大多数硬件接口,并且您可以开始与您自己的电路和项目进行交互!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PIC
    PIC
    +关注

    关注

    8

    文章

    507

    浏览量

    87598
  • XC8
    XC8
    +关注

    关注

    0

    文章

    8

    浏览量

    13536
收藏 人收藏

    评论

    相关推荐

    在AFE7225中使用DC耦合时钟引脚

    电子发烧友网站提供《在AFE7225中使用DC耦合时钟引脚.pdf》资料免费下载
    发表于 10-26 11:05 0次下载
    在AFE7225<b class='flag-5'>中使</b>用DC耦合时钟<b class='flag-5'>引脚</b>

    何在智能手机系统中使用bq27505

    电子发烧友网站提供《如何在智能手机系统中使用bq27505.pdf》资料免费下载
    发表于 10-17 10:21 0次下载
    如<b class='flag-5'>何在</b>智能手机系统<b class='flag-5'>中使</b>用bq27505

    何在MSP430™MCU中使用智能模拟组合

    电子发烧友网站提供《如何在MSP430™MCU中使用智能模拟组合.pdf》资料免费下载
    发表于 09-14 10:19 0次下载
    如<b class='flag-5'>何在</b>MSP430™MCU<b class='flag-5'>中使</b>用智能模拟组合

    何在反向降压-升压拓扑中使用TPS6290x

    电子发烧友网站提供《如何在反向降压-升压拓扑中使用TPS6290x.pdf》资料免费下载
    发表于 09-13 10:07 0次下载
    如<b class='flag-5'>何在</b>反向降压-升压拓扑<b class='flag-5'>中使</b>用TPS6290x

    EN8F1823E完全替代PIC16F883,PIC16F1883,PIC16F1936,PIC16F1937

    PIC
    捷尚微辉芒微MCU单片机
    发布于 :2024年07月30日 16:59:15

    何在RTOS中使用spi_interface.c?

    何在 RTOS 中使用 spi_interface.c?
    发表于 07-10 06:29

    请问cmakelists的变量如何在程序中使用?

    大家好, 我有个问题请教,cmakelists.txt的变量如何在程序中使用?比如以下cmakelists.txt文件的PROJECT_VER变量,我如
    发表于 06-11 07:34

    工业计算机是什么?如何在不同行业中使用?

    工业电脑是专为在工业环境中使用而设计的计算机。它们可用于各个行业,包括制造、运 输和能源。它们通常比普通计算机更强大,并且能够在大多数计算机无法运行的环境运行。在本文中,我们将更深入地了解什么是工业计算机以及它们如何在不同行业
    的头像 发表于 04-01 15:45 821次阅读
    工业计算机是什么?如<b class='flag-5'>何在</b>不同行业<b class='flag-5'>中使</b>用?

    何在CY8CMBR3110-SX2I中使用pwm控制gpo2亮度?

    何在CY8CMBR3110-SX2I中使用 pwm 控制 gpo2 亮度。
    发表于 03-05 06:59

    何在测试中使用ChatGPT

    Dimitar Panayotov 在 2023 年 QA Challenge Accepted 大会 上分享了他如何在测试中使用 ChatGPT。
    的头像 发表于 02-20 13:57 766次阅读

    无法在XC8将sprintf(32 位)打印为十六进制怎么解决?

    我有一个“疯狂”的时刻 - 我无法在 XC8 中将sprintf(32 位)打印为十六进制。 因此,我将相关代码部分剪切并粘贴到在线 C 编译器,在那里它工作正常: C: #include
    发表于 01-31 08:09

    何在DAVE IDE中使用XMC7200?

    能否在 DAVE IDE 为 XMC 7200 EVK KIT 构建应用程序。我尝试打开一个项目但它最多只能显示 XMC48000。如何在 DAVE IDE 中使用 XMC7200 请帮忙。
    发表于 01-26 06:32

    何在我的CY8CKIT-062-WIFI-BT中使用Segger AppWizard并导入GUI项目?

    我想知道如何在我的 CY8CKIT-062-WIFI-BT 中使用 Segger AppWizard 并导入 GUI 项目。 我已经按照快速入门指南所说的做了,我做了一个AppWizard项目来显示
    发表于 01-22 06:19

    何在TC264/TC377中使用FOC呢?

    何在TC264/TC377中使用FOC呢?GTMMOLD 的相关配置实在太过了混乱了,实在有看不到,没有什么相关的中文资料或者开源代码可供参考。
    发表于 01-19 07:59

    何在ModustoolBox中使用SEGGER AppWizard GUI生成器软件和CY8CKIT-062-WIFI-BT?

    我想知道如何在 ModustoolBox 中使用 SEGGER AppWizard GUI 生成器软件和 CY8CKIT-062-WIFI-BT? 我构建了 GUI 并导出了,但我不知道如何在
    发表于 01-19 06:26