当前位置: 首页 > news >正文

二、点灯基础实验

        嵌入式基础实验第一个就是点灯,地位相当于编程界的hello world。

如下为LED原理图,要让相应LED发光,需要给I/O口设置输出引脚,低电平,二极管才会导通

2.1 打开初始工程,编写代码

          以下会实现BLINKY常亮,RGB灯挨个转换亮灭状态,出现不同颜色

#include <LPC11xx.h>// 粗糙的delay函数
void delay_1s()
{uint16_t i,j;for(i=0;i<30000;i++)for(j=0;j<200;j++);
}int main()
{// 使能GPIO时钟LPC_SYSCON -> SYSAHBCLKCTRL |= (1UL << 6);// 设置引脚为输出引脚LPC_GPIO1 -> DIR |= (1UL << 9); // PIO1_9 BLINKYLPC_GPIO2 -> DIR |= (1UL << 8);	// PIO2_8 GREENLPC_GPIO2 -> DIR |= (1UL << 9);	// PIO2_9 REDLPC_GPIO2 -> DIR |= (1UL << 10);// PIO2_10 BLUELPC_GPIO1 -> DATA &= ~(1UL << 9); //拉低点亮 while(1){LPC_GPIO2 -> DATA ^= (1UL << 8); // 状态反转delay_1s();LPC_GPIO2 -> DATA ^= (1UL << 9); // 状态反转delay_1s();LPC_GPIO2 -> DATA ^= (1UL << 10); // 状态反转delay_1s();}
}

2.2 函数封装

       为了之后更好使用,现在将这四个灯用函数封装,放在LED文件中。

路径包含:

先在工程下新建一个文件夹,我新建了一个code

如下图,option -> c/c++ -> path打开,选择文件夹

结果如下,其中.\是工程下的目录,有些工程文件进行移植时(直接复制粘贴工程),出现很长的路径,找不到别人引用的路径下的文件导致报错,问题就在这。需要改一下路径,把文件包含进来。需要文件时把文件放工程里一份会更好移植。

界面内文件结构处理,当往里面新加文件时,可以处理一下里面的分组也就是group,直接一堆放里面起始也行,换一下就一个作用,美观。

具体操作为,找到三个箱子(红绿白,魔术棒右边那个),也可以直接右击上方文件夹,选择manage project items, 界面如下

跟路径里差不多的操作,我改完是这样,然后点击ok即可(不点ok不保存)

右击,选择Add New Item

分别选.c .h 都存在code下面即可

然后往里写内容

LED.c

#include "LED.h"void LED_Init(void)
{// 使能GPIO时钟LPC_SYSCON -> SYSAHBCLKCTRL |= (1UL << 6);// 设置引脚为输出引脚LPC_GPIO1 -> DIR |= (1UL << 9); // PIO1_9 BLINKYLPC_GPIO2 -> DIR |= (1UL << 8);	// PIO2_8 GREENLPC_GPIO2 -> DIR |= (1UL << 9);	// PIO2_9 REDLPC_GPIO2 -> DIR |= (1UL << 10);// PIO2_10 BLUE
}

LED.h

#ifndef _LED_H_
#define _LED_H_#include <LPC11xx.h>#define LED_ON() LPC_GPIO1 -> DATA &= ~(1UL << 9); // 对应位给0
#define LED_OFF() LPC_GPIO1 -> DATA |= (1UL << 9); // 对应位给1
#define LED_Toggle() LPC_GPIO1 -> DATA ^= (1UL << 9); // 对应位异或1#define LED_G_ON() LPC_GPIO2 -> DATA &= ~(1UL << 8); // 对应位给0
#define LED_G_OFF() LPC_GPIO2 -> DATA |= (1UL << 8); // 对应位给1
#define LED_G_Toggle() LPC_GPIO2 -> DATA ^= (1UL << 8); // 对应位异或1#define LED_R_ON() LPC_GPIO2 -> DATA &= ~(1UL << 9); // 对应位给0
#define LED_R_OFF() LPC_GPIO2 -> DATA |= (1UL << 9); // 对应位给1
#define LED_R_Toggle() LPC_GPIO2 -> DATA ^= (1UL << 9); // 对应位异或1#define LED_B_ON() LPC_GPIO2 -> DATA &= ~(1UL << 10); // 对应位给0
#define LED_B_OFF() LPC_GPIO2 -> DATA |= (1UL << 10); // 对应位给1
#define LED_B_Toggle() LPC_GPIO2 -> DATA ^= (1UL << 10); // 对应位异或1void LED_Init(void);	#endif

main.c

#include <LPC11xx.h>
#include "LED.h"// 粗糙的delay函数
void delay_1s()
{uint16_t i,j;for(i=0;i<30000;i++)for(j=0;j<200;j++);
}int main()
{LED_Init();LED_ON();while(1){LED_G_Toggle();delay_1s();LED_R_Toggle();delay_1s();LED_B_Toggle();delay_1s();}
}

以上函数可达到与刚开始函数等效的结果。其中开启位置零、关闭位置一和反转位异或一涉及到位运算相关知识,如果不会自己去搜就行。

2.3 下载效果展示

编译下载后,效果如下

中间的BLINKY常亮,右上角的RGB三色灯变换颜色

http://www.lryc.cn/news/523409.html

相关文章:

  • 双端队列实战 实现滑动窗口 用LinkedList的基类双端队列Deque实现 洛谷[P1886]
  • HTML<img>标签
  • 【网络 MAC 学习专栏 -- 如何理解 PHY 的 Link Up】
  • Linux虚拟机安装与FinalShell使用:探索Linux世界的便捷之旅
  • Mixly米思齐1.0 2.0 3.0 软件windows版本MAC苹果电脑系统安装使用常见问题与解决
  • vben5 admin ant design vue如何使用时间范围组件RangePicker
  • Kafka 日志存储 — 文件目录及日志格式
  • 故障诊断 | BWO白鲸算法优化KELM故障诊断(Matlab)
  • 一文读懂AI Agent 智能体
  • 《 C++ 点滴漫谈: 二十二 》操作符炼金术:用C++ operator重塑代码美学
  • 通信协议之多摩川编码器协议
  • 新星杯-ESP32智能硬件开发--ESP32的I/O组成-系统中断矩阵
  • 4329 树的连边II
  • Spring的Bean详解=Bean别名+作用范围+使用场景
  • 聊一聊如何适应AI时代
  • dl学习笔记:(4)简单神经网络
  • 电商项目高级篇08-springCache
  • 4.1 AI 大模型应用最佳实践:如何提升 GPT 模型使用效率与质量
  • Linux top命令cpu使用率计算底层原理
  • vue知识点总结
  • [实现Rpc] 环境搭建 | JsonCpp | Mudou库 | callBack()
  • llamafactory使用8张昇腾910b算力卡lora微调训练qwen2-72b大模型
  • C++,设计模式,【目录篇】
  • 《目标检测数据集下载地址》
  • C 语言的void*到底是什么?
  • Linux中的文件上传和下载
  • DDD - 微服务落地的技术实践
  • fgets、scanf存字符串应用
  • 鸿蒙动态路由实现方案
  • Spring-boot3.4最新版整合swagger和Mybatis-plus