二、点灯基础实验

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

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

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

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

cpp 复制代码
#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 BLINKY
	LPC_GPIO2 -> DIR |= (1UL << 8);	// PIO2_8 GREEN
	LPC_GPIO2 -> DIR |= (1UL << 9);	// PIO2_9 RED
	LPC_GPIO2 -> DIR |= (1UL << 10);// PIO2_10 BLUE
	
	LPC_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

cpp 复制代码
#include "LED.h"

void LED_Init(void)
{
	// 使能GPIO时钟
	LPC_SYSCON -> SYSAHBCLKCTRL |= (1UL << 6);
	// 设置引脚为输出引脚
	LPC_GPIO1 -> DIR |= (1UL << 9); // PIO1_9 BLINKY
	LPC_GPIO2 -> DIR |= (1UL << 8);	// PIO2_8 GREEN
	LPC_GPIO2 -> DIR |= (1UL << 9);	// PIO2_9 RED
	LPC_GPIO2 -> DIR |= (1UL << 10);// PIO2_10 BLUE
}

LED.h

cpp 复制代码
#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); // 对应位异或1

void LED_Init(void);	

#endif

main.c

cpp 复制代码
#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三色灯变换颜色

相关推荐
ACP广源盛139246256734 分钟前
YLB3118 存储桥接芯片完整机会点@ACP#联动曙光 8000
大数据·人工智能·分布式·单片机·嵌入式硬件
蝎蟹居13 分钟前
GBT 4706.1-2024逐句解读系列(31) 第7.21.1条款:说明书怎么写符合标准要求
人工智能·单片机·嵌入式硬件·物联网·安全
hongmai66688820 分钟前
乐鑫ESP32-C61-WROOM-1模组:Wi-Fi 6与蓝牙LE双模的RISC-V新选择
单片机·嵌入式硬件·risc-v
茉莉玫瑰花茶15 小时前
Windows 平台下的 UDP 客户端
stm32·单片机·嵌入式硬件
笔夏17 小时前
【移芯平台CAT1模组】烧写固件
stm32·单片机·学习
无垠的广袤18 小时前
【RA-Eco-RA4M2开发板】步进电机的串口控制和 LabVIEW 数据采集
单片机·嵌入式硬件·labview
wuyk55519 小时前
67.嵌入式C语言进阶:结构体指针实战指南——STM32外设、传感器数据访问的高效技巧
c语言·开发语言·stm32·单片机
Mr+范19 小时前
单片机 ADC 电压与电流检测及电阻选型指南
单片机·嵌入式硬件
西城微科方案开发21 小时前
LCD智能婴儿秤方案
单片机·嵌入式硬件
三佛科技-134163842121 天前
灭蚊灯MCU方案开发,FT60E112-RB作为灭蚊灯主控芯片优势
单片机·嵌入式硬件·物联网·智能家居·pcb工艺