找回密码
 立即注册
搜索
0赞
赞赏
手机版
扫码打开手机版
把文字装进口袋

使用IO引脚作为输入控制LED的教程

123457625 2022-8-26 14:31:04
在本教程中,我们将学习如何使用另一个IO 引脚作为输入并控制额外的 LED。在不浪费太多时间的情况下,让我们评估一下我们需要什么样的硬件设置。
        硬件设置和要求
        由于需要将开关用作输入,我们首先需要的是一个按钮。我们还需要一个额外的 LED 来由该按钮控制。除了这两个之外,我们还需要一个电阻器来限制 LED 电流,以及一个用于下拉按钮的附加电阻器。这将在示意图部分进一步说明。我们需要的组件 -
        一个按钮(任何种类的瞬时开关,特别是触觉开关)
        LED的任何颜色
        4.7k 下拉电阻
        100R电阻
        更不用说,除了上述组件,我们还需要基于N76E003 微控制器的开发板以及Nu-Link 编程器。此外,还需要面包板和连接线来连接所有组件,如下所示。
       
        N76E003 LED和按钮接口电路
        正如我们在下面的示意图中看到的,开发板内部的测试 LED 连接在端口 1.4上,另外一个 LED 连接在端口 1.5上。电阻 R3 用于限制 LED 电流。
       
        在引脚 1.6 中,连接了一个名为 SW 的按钮。每当按下按钮时,引脚将变为高电平。否则会被 4.7K的下拉电阻R1 拉低。
        该引脚也是编程器访问的与程序相关的引脚。它用于发送程序数据。但是,我们将看到选择这些引脚的原因,并获得有关N76E003 引脚映射的公平信息。
        N76E003 引脚图
        N76E003的引脚图如下图所示——
       
        正如我们所看到的,每个引脚都有多种功能,可以用于不同的目的。让我们举个例子。引脚 1.7 可用作中断、模拟输入或通用输入输出操作。因此,如果任何引脚用作 I/O 引脚,则相应的功能将不可用。
        因此,用作 LED 输出引脚的引脚 1.5 将失去 PWM 和其他功能。但这不是问题,因为该项目不需要其他功能。之所以选择引脚 1.5 作为输出,引脚 1.6 作为输入,是因为 GND 和 VDD 引脚最近可用,便于连接。
        但是,在这个微控制器的 20 个引脚中,有 18 个引脚可以用作 GPIO 引脚。引脚 2.0 专用于复位输入,不能用作输出。除此引脚外,所有引脚均可配置为下述模式。
       
        根据数据表,PxM1.n 和 PxM2.n 是两个寄存器,用于确定 I/O 端口的控制操作。现在,开始写入和读取 GPIO 端口是完全不同的事情。因为写入端口控制寄存器会改变端口的锁存状态,而读取端口会获得逻辑状态的状态。但要读取端口,必须将其设置为输入模式。
        N76E003 的简单 GPIO 控制程序
        本教程使用的完整程序可以在本页底部找到,代码解释如下。
        将引脚设置为输入
        让我们先从输入开始。如前所述,要读取端口的状态,需要将其设置为输入。因此,由于我们选择了 P1.6 作为我们的输入开关引脚,我们通过下面的代码片段行来表示它。
        #define SW P16
        需要将相同的引脚设置为输入。因此,在设置功能上,使用下面的行将引脚设置为输入。
        无效设置(无效){
        P14_准模式;
        P15_准模式;
        P16_输入模式;
        }
        这一行P16_Input_Mode; 在“BSP include library”的Function_define.h头文件中定义,将pin位设置为P1M1|=SET_BIT6; P1M2&=~SET_BIT6。SET_BIT6也在同一个头文件中定义为 -
        #define SET_BIT6 0x40
        将引脚设置为输出
        与输入引脚相同,板载测试 LED 和外部 LED1 使用的输出引脚也在代码的第一部分中定义了各自的引脚。
        #define Test_LED P14
        #define LED1 P15
        这些引脚使用以下行在设置函数中设置为输出。
        无效设置(无效){
        P14_Quasi_Mode; // 输出
        P15_准模式;// 输出
        P16_输入模式;
        }
        这些行也在Function_define.h头文件中定义,它将引脚位设置为P1M1&=~SET_BIT4; P1M2&=~SET_BIT4。SET_BIT6也在同一个头文件中定义为 -
        #define SET_BIT4 0x10
        无限循环
        一个硬件,如果连接到电源并且工作正常,应该连续输出,应用程序永远不会停止。它无限次地做同样的事情。无限while循环的功能来了。while 循环内的应用程序无限运行。
        而(1){
        Test_LED = 0;
        sw_delay(150);
        测试_LED = 1;
        sw_delay(150);
        如果(SW == 1){
        LED1 = 0;
        }
        其他 {
        LED1 = 1;
        }
        }
        }
        上面的 while 循环根据sw_delay值使 LED 闪烁,并检查 SW 的状态。如果开关被按下,P1.6 为高电平,因此当按下时,读取状态为 1。在这种情况下,当开关被按下并且端口 P1.6 保持高电平时, LED1 将发光。
        对 N76E003 进行编程并验证输出
        在我们的 N76E003 入门教程中,我们已经学习了如何对 N76E003 进行编程,因此我们将在这里重复相同的步骤来对我们的电路板进行编程。代码编译成功,返回0个warning和0个Errors,使用Keil默认的刷机方式刷机。
       
        如上图所示,当我按下按钮时,我们的外部 LED 会亮起。
<p>        #include "N76E003.h"
        #include "SFR_Macro.h"
        #include "函数定义.h"
        #include "Common.h"
        #include "延迟.h"
        #define Test_LED P14
        #define LED1 P15
        #define SW P16
        无效设置(无效);
        无效 sw_delay (int ms);

        无效的主要(无效){
        设置();
        而(1){ Test_LED = 0;

        sw_delay(150);
        测试_LED = 1;
        sw_delay(150);
        如果(SW == 1){
        LED1 = 0;
        }
        别的 {
        LED1 = 1;
        }

        }
        }

        // 基于软件的延迟。时间不准确。
        无效 sw_delay (int ms){
        整数a,b;
        对于(a=0;a

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

使用道具 举报

您需要登录后才可以回帖 立即登录
我在论坛打滚这么多年,所谓阅人无数,就算没有见过猪走路,也总明白猪肉是啥味道的。
一看到楼主的气势,我就觉得楼主同在社区里灌水的那帮小混蛋有着本质的差别,那忧郁的语调,那熟悉的签
名,还有字里行间高屋建瓴的辞藻。
没用的,楼主,就算你怎么换马甲都是没有用的,你的亿万拥戴者早已经把你认出来了,你一定就是传说中的
最强ID。
2022-8-27 07:19:39
金鉴实验室搭建的这个论坛不错
2022-8-28 00:07:21
好像还不错!
2022-8-28 07:07:31
支持你们一下下哈
2022-8-28 14:07:42
不错哦  喜欢 嘿嘿
2022-8-28 21:07:52
顶一个了
2022-8-29 04:08:03
非常不错,感谢分享!
2022-8-29 11:08:13
谢谢楼主,,,收藏ing
2022-8-29 11:27:56
支持!!!!!!
2022-8-29 11:47:39
123下一页
返回顶部