PIC单片机学习第一天----GPIO

PIC单片机学习第一天

第一天入职,本公司使用的芯片为PIC16的,是一种8位的单片机,网上的资料近乎绝迹,公司给的手册也是全英文的,对于我这种英语小白死在是太难了。

这款芯片由于硬件的约束,并没有标准库这些东西,只能面向寄存器进行编写代码;同时使用的人不多造成的资料不多,学习起来也很费劲。

对于任何单片机首先要学的肯定是I/O口了,对于STM32单片机的GPIO的配置大家肯定都不陌生,标准库的一套流程,结构体定义,引脚端口,输入或者输出模式,还有速度,然后初始化;但是对于PIC这款单片机不太一样,下面说一下所使用到的几个寄存器:

1、TRISx ——— 数据方向寄存器

主要用来控制 I/O 引脚的方向,即用来控制PORTx 是输入还是输出。这个就有带你类似STM32单片机的GPIO_InitStructure.GPIO_Mode = 这个东西;

TRISx(数据方向控制寄存器):0=输出模式(Out),1=输入模式(In);

2、PORTx ——— 端口寄存器

用来锁存输出数据。当读PORTx 时,器件直接读 I/O 引脚电平(而不是锁存值)。

3、LATx ——— 输出数据锁存器

写端口就是写该锁存器(LATx)。数据锁存器也可以直接读写。如果外设没有使用该引脚,并且TRISx位配置该引脚为输出,则将锁存器内的数据输出到引脚。

上面三个标准工作寄存器每个端口都有;

有的端口可能话剧有下面一个或多个寄存器:

1、ANSELx————模拟选择寄存器

ANSELx(模拟选择寄存器):0 = 数字I/O口,1 = 模拟输入口;

2、WPUx---————弱上拉寄存器

配置步骤如下:

第一步:首先配置ANSELx寄存器,将IO口定义为数字IO,还是模拟输入IO;

第二步:配置TRISx,将IO口定义为输入,还是输出;

第三步:若定义IO口为输入,要得到IO端口的实际电平,则直接读取PORTx寄存器,若将IO口定义为输出,则通过写LATx来达到对IO口置高低电平操作。

注意:若直接写PORTx寄存器,实际上会写入到LATx中,所以一般不写入PORTx寄存器。若直接读取LATx寄存器,读取到的是锁存在GPIO Latch中的数据,而不是真正的IO端口数据,所以一般不读取LATx寄存器。

当某个引脚配置成模拟IO时候,必须将其相应的TRISx配置成输入,这样才能读取到引脚上外部电压。

PORT与LAT寄存器区别:

rd port指令脉冲来的时候,管脚端平锁存到port中,也就是说要想获得正确的管脚状态,只有读取port寄存器,而如果去读lat寄存器,读到的输出锁存器的值,比如说你一开始设置管脚成输出,通过lat输出了一个0x55,然后你设置管脚成输出,这个时候管脚电平再外部电路的驱动下发生了变化编程了0x66,这个时候你读port才能读到0x66,而如果你去读lat则读到的是你上一次输出值,不是当前时刻管脚电平状态。这也就是lat和port的不同之所在。所以在做pic18的时候我们应该养成写则写lat,读则读port的好习惯

LAT是作为缓存使用的,PORT读的是I/O状态,所以,读I/O时用PORT,写I/O时用LAT。

总结一下:

1、I/O作为写输出时使用锁存器LAT;

2、I/O作为读输入时使用端口PORT;

3、若定义IO口为输入,要得到IO端口的实际电平,则直接读取PORTx寄存器,若将IO口定义为输出,则通过写LATx来达到对IO口置高低电平操作。

4、当某个引脚配置成模拟IO时候,必须将其相应的TRISx配置成输入,这样才能读取到引脚上外部电压。

最后参考一下配置代码:

void Pin_manager_initialization(void)            //???????
{
                                                    //输出数据锁存寄存器
    LATA = 0x00;                                    //??A??0 
    LATB = 0x00;                                    //??B??0 
    LATC = 0x00;                                    //??C??0 
    
                                                    //方向控制寄存器
    TRISA = 0x00;                                   //??A?????0输出1输入
    TRISB = 0x00;                                   //??B?????
    TRISC = 0x00;                                   //??C?????
 
                                                    //模/数控制寄存器
    ANSELA = 0x00;                                  //??A???????0数字I/O口1模拟输入口
    ANSELB = 0x00;                                  //??B??????? 
    ANSELC = 0x00;                                  //??C??????? 
                                                    

                  //弱上拉寄存器--这个寄存器不是所有端口都有的,所以可有可无
    WPUA = 0x00;                                    //??A????0失能1使·1能
    WPUB = 0x00;                                    //??B????
    

                                                     //选择寄存器
    OPTION_REGbits.nWPUEN = 0x00;                    //?WPUx???????这个可有可无
}

还有一种写法:大家看到代码的时候可能都有这个疑惑,下面解答一下;上面是按字节进行配置I/O,比较迅速;下面是按位进行配置,比较一对一;我刚开始见到这种也是很懵逼,怎么还有俩配置方式,后来进行学习才明白的。

void Pin_manager_initialization(void)            //???????
{
                                                    
        LATAbits.LATA0 = 0 ;
        LATAbits.LATA1 = 0 ;
        LATBbits.LATB4 = 0 ;

        TRISAbits.TRISA1 = 0;
 
}

原文地址:https://blog.csdn.net/qq_45796666/article/details/131014468

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读552次。com.mongodb.MongoQueryException: Query failed with error code 292 and error message 'Executor error during find command :: caused by :: Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting.' on server 11.51.141.63:27017 _mongodb 大文件 下载失败
文章浏览阅读635次,点赞9次,收藏8次。MongoDB 是一种 NoSQL 数据库,它将每个数据存储为一个文档,这里的文档类似于 JSON/BSON 对象,具体数据结构由键值(key/value)对组成。
文章浏览阅读2.1k次。和。_mongodb 日期类型
文章浏览阅读1.7k次。Scalestack等客户期待使用MongoDB Atlas Vector Search和Amazon Bedrock构建下一代应用程序
文章浏览阅读970次。SpringBoot整合中间件mongodb、ES_springboot3 elasticsearch json数据
文章浏览阅读673次。MongoDB 简介_尚医通sql
文章浏览阅读1k次,点赞8次,收藏9次。官网下载MongoDB安装包后进行解压(因了解并不深入,故暂不进行详细说明,自行查找其他安装方法,后期了解深入后将进行该教程的完善)在bin目录下使用命令启动:./mongod --config …/mongodb.conf。该文章任然处于完善中,如果存在错误遗漏的地方,欢迎私信联系。安装相关的nuget包后即可通过以下方法连接数据。YX9010_0@的第二十篇文章。
文章浏览阅读1.2k次,点赞17次,收藏26次。社交场景, 使用 MongoDB 存储存储用户信息, 以及用户发表的朋友圈信息, 通过地理位置索引实现附近的人, 地点等功能.游戏场景, 使用 MongoDB 存储游戏用户信息, 用户的装备, 积分等直接以内嵌文档的形式存储, 方便查询, 高效率存储和访问.物流场景, 使用 MongoDB 存储订单信息, 订单状态在运送过程中会不断更新, 以 MongoDB 内嵌数组的形式来存储, 一次查询就能将订单所有的变更读取出来.物联网场景, 使用 MongoDB 存储所有接入的智能设备信息, 以及设备汇报的日
文章浏览阅读686次。您可以使用 update_one() 方法来更新 MongoDB 中调用的记录或文档。update_one() 方法的第一个参数是 query 对象,用于定义要更新的文档。注释:如果查询找到多个记录,则仅更新第一个匹配项。第二个参数是定义文档新值的对象。_python 更新 mongodb 数据
文章浏览阅读1.3k次。首先来学习一下nosql这里安装就不进行介绍 只记录一下让自己了解mongodb。_nosql注入
文章浏览阅读4.1k次,点赞8次,收藏7次。在data的目录下,创建一个db文件。因为启动MongoDB服务之前必须创建数据库文件的存放文件夹,否则命令不会自动创建,而且不能启动成功。第一步:安装时,Custom是指可以自定义安装路径,然后傻瓜式安装即可(注意:先不要安装图形化工具,否则安装时间会特别长):如果要想连接成功,必须要开服务,即mongod -dbpath C:MongoDBdatadb的cmd要一直开着。然后回车,ctrl+F输入port找到端口号,一般为:27017。打开命令行,然后找到bin文件地址,并输入。_mongodb windows安装
文章浏览阅读5.1k次,点赞3次,收藏43次。详细介绍MongoDB数据库的基本知识,安装方法,基本操作,_mongodb数据库
文章浏览阅读3.2k次。安装教程翻看以往文章。_navicat 连接mongodb
文章浏览阅读426次,点赞9次,收藏12次。win10开放端口:https://blog.csdn.net/m0_43605481/article/details/119255256。我的是阿里云服务器,所以直接在安全组中加入规则,端口范围:27017,授权对象:0.0.0.0。windows在mongodb安装文件夹的bin文件夹中的mongod.cfg。数据库名字是test,打算创建一个用户,账号aaa,密码bbb,权限readWrite。因为该用户是创建在test数据库的,所以在最后要加上test。O了,然后恢复了test的数据。
文章浏览阅读1.1k次。聚合操作主要用于处理数据并返回计算结果。聚合操作将来自多个文档的值组合在一起,按条件分组后,再进行一系列操作(如求和、平均值、最大值、最小值)以返回单个结果。MongoDB的聚合查询​聚合是MongoDB的高级查询语言,它允许我们通过转化合并由多个文档的数据来生成新的在单个文档里不存在的文档信息。MongoDB中聚合(aggregate)主要用于处理数据(例如分组统计平均值、求和、最大值等),并返回计算后的数据结果,有点类似sql语句中的count(*)、groupby。..._如何将几个db的数据统整在一起做查询
文章浏览阅读680次,点赞7次,收藏8次。(2)application.properties配置文件。(4)UserService类。(5)测试和测试结果。
文章浏览阅读1k次,点赞17次,收藏25次。Studio 3T 2023.9 (macOS, Linux, Windows) - MongoDB 的专业 GUI、IDE 和 客户端,支持自然语言查询_mongodb客户端
文章浏览阅读1.1k次,点赞32次,收藏27次。插件式的存储引擎架构可以实现 Server 层和存储引擎层的解耦,可以支持多种存储引擎,如 MySQL 既可以支持 B-Tree 结构的 InnoDB 存储引擎,还可以支持 LSM 结构的 RocksDB 存储引擎。MongoDB 中的记录就是一个 BSON 文档,它是由键值对组成的数据结构,类似于 JSON 对象,是 MongoDB 中的基本数据单元。的简称,是 JSON 文档的二进制表示,支持将文档和数组嵌入到其他文档和数组中,还包含允许表示不属于 JSON 规范的数据类型的扩展。
文章浏览阅读5.1k次,点赞6次,收藏96次。本文设计了一种基于智能室内温度控制的自动调速风扇。以STM32系列单片机为核心主控板,通过程序代码驱动和使用温度传感器模块实现对环境温度的实时监测,并可以实时显示环境温度。同时,可以设置温度检测的上下警告值,根据需求自行调节。_stm32 温控风扇
文章浏览阅读898次,点赞13次,收藏21次。在MongoDB中,我们使用find()和find_one()方法来在集合中查找数据,就像在MySQL数据库中使用SELECT语句来在表中查找数据一样。_pymongo find_one