面向对象的编程思想写单片机程序——(1)学习笔记 之 程序设计

2023-05-16

系列文章目录

面向对象的编程思想写单片机程序——(1)学习笔记 之 程序设计
面向对象的编程思想写单片机程序——(2)学习笔记 之 怎么抽象出结构体
面向对象的编程思想写单片机程序——(3)学习笔记 之 程序分层、数据产生流程

文章目录

  • 系列文章目录
  • 前言
  • 程序怎么写?
    • 1、常规写法
    • 2、面向对象的写法
  • 小结


前言

高内聚、低耦合的软件编程中判断程序好坏的标准,目的就是能够使程序可重用性,可移植性增强,那么在单片机嵌入式的编程中能否做到高内聚、低耦合性呢 ?? 能否通过程序设计来实现呢 ?? 肯定是可以的,可以通过使用面向对象的编程思想来设计程序,通过对程序分层来隔离硬件对软件程序的依赖性。
那么如何使用面向对象的编程思想来编写单片机程序呢 ??? 请持续关注本栏内容,本栏内容将记录如何进行面向对象编程,如何进行程序分层。。


程序怎么写?

本章内容以点亮单片机 LED 灯为示例来记录常规写法,以及面向对象的编程思想写法。

1、常规写法

针对点亮 LED 这样的程序的常规写法相信大家就很熟悉了,直接看代码:


int main()
{

	while(1)
	{
		if(key){             // 如果按键按下,执行 LED 函数。
			write_gpio_led();    //函数可以是 LED 亮、灭、翻转、流水灯等操作。
		}
	}
}

针对于这种写法当然没有问题,可是

  1. 如果写其他的模块呢,比如 LCD 屏幕、输入(按键、鼠标、触摸屏)等;
  2. 如果单个按键、屏幕很多呢,难道要写很多判断语句吗 ?
  3. 如果该产品的模块很多,你每个模块都写很多函数,是不同的人开发,这些函数都需要别人知道才能使用,是不是很不人性化。

如果使用面向对象的写法这些问题就可以避免。

2、面向对象的写法

面向对象的写法可以把很多变量、函数等,抽象出结构体,别人只需知道我有这个结构体就行了,需要使用什么函数直接在结构体里找就行了,废话不多说看代码:

/*  定义设备对应的结构体   */
typedef struct LEDDevice {
  int type;                   // LED 类型
  GPIO_TypeDef* GPIOx;     //哪一组
  uint16_t  LED_PIN;     //哪个引脚
  uint32_t  LED_CLK;     //哪个时钟
  void (* LED_Init)(struct LEDDevice * p_Dev);              //初始化函数指针
  void (* LED_Control)(struct LEDDevice * p_Dev, int istatus);    //控制led函数指针
}LEDDevice, *p_LEDDevice;

然后,写对应的函数:

/**
  * @说明   定义 LED 灯的结构体数组全局变量,存放各种类型的 LED 灯
  */
struct LEDDevice LED[] = {
		{0, GPIOB, GPIO_Pin_5, RCC_APB2Periph_GPIOB, My_LED_Init, My_LED_Control},
		{1, GPIOB, GPIO_Pin_0, RCC_APB2Periph_GPIOB, My_LED_Init, My_LED_Control},
		{2, GPIOB, GPIO_Pin_1, RCC_APB2Periph_GPIOB, My_LED_Init, My_LED_Control}
};


/**
  * @说明   调用函数 get_LCD_type() 可以获得需要亮的灯类型
  * @参数   无
  * @返回值  返回 int 型
  */
int get_LCD_type(void)
{
	int type;
	/******************************************/
	// 需要在哪种情况下 控制哪种灯,写在这里,返回控制的类型
	/******************************************/
	return type;
}

/**
  * @说明   调用函数 get_lcd_for_type() 可以获得需要亮的灯类型对应的存储该类型的 灯的地址,从而找到该灯
  * @参数   无
  * @返回值  返回 灯设备的结构体指针 类型    struct LEDDevice * 
  */
struct LEDDevice * get_lcd_for_type(void)
{
	int i;
	int type = get_LCD_type();  //获得类型
	for(i = 0; i < sizeof(LED)/sizeof(LED[0]); i++)   // 遍历数组, sizeof(LED)/sizeof(LED[0]) 数组中有几项数据
	{                       
		if(LED[i].type == type) //类型相同,就返回该项地址
		{
			return &LED[i];
		}
	}
	return NULL;
}

/**
  * @说明   调用函数 My_LED_Init(struct LEDDevice * p_Dev) 可以初始化 LED
  * @参数   p_Dev  , 设备结构体指针类型    struct LEDDevice * 
  * @返回值  无
  */
void My_LED_Init(struct LEDDevice * p_Dev)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(p_Dev->LED_CLK , ENABLE); //使能时钟
  /*LED 结构体初始化*/
  GPIO_InitStructure.GPIO_Pin = p_Dev->LED_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(p_Dev->GPIOx, &GPIO_InitStructure);
  
  GPIO_SetBits(p_Dev->GPIOx, p_Dev->LED_PIN);
}

/**
  * @说明   调用函数 My_LED_Control(struct LEDDevice * p_Dev, int istatus) 可以控制 LED
  * @参数   p_Dev  , 设备结构体指针类型    struct LEDDevice * 
  * @参数   istatus, 是 0 或者 1 ,来控制 LED 对应的 IO 端口
  * @返回值  无
  */
void My_LED_Control(struct LEDDevice * p_Dev, int istatus)
{
  GPIO_WriteBit(p_Dev->GPIOx, p_Dev->LED_PIN, istatus);
}

下面是主函数直接通过结构体来调用函数:
注意:在写代码时注意,全局变量、函数要在头文件声明。

int main()
{
	struct LEDDevice * p_LED = get_lcd_for_type();
	p_LED->LED_Init(p_LED);  // LED 初始化

	p_LED->LED_Control(p_LED, 0);  // LED 亮
}

使用面向对象的方法写程序更有利于多人协作写程序,将自己负责的模块抽象出结构体,其他人在使用该模块时,只需调用结构体就行了。
可以通过面向对象的思想写程序,通过程序分层写函数,将硬件和软件程序尽可能的分割开来,以提高程序的兼容性


小结

本文主要讲述单片机程序的面向对象的编程思想,针对如何抽象出对象设备的结构体、程序的分层问题,请持续关注本专栏。

学习百问网资源总结笔记。

本专栏文章:
面向对象的编程思想写单片机程序——(1)学习笔记 之 程序设计
面向对象的编程思想写单片机程序——(2)学习笔记 之 怎么抽象出结构体
面向对象的编程思想写单片机程序——(3)学习笔记 之 程序分层、数据产生流程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面向对象的编程思想写单片机程序——(1)学习笔记 之 程序设计 的相关文章

随机推荐

  • Linux嵌入式开发——C编程

    文章目录 Linux嵌入式开发 C编程一 编写C程序1 1 设置vim编辑器1 2 编写C程序 二 编译C程序三 make工具和Makefile文件3 1 编写C程序C文件H文件 3 2 不使用make工具3 3 使用make工具和Make
  • C#中的接口

    一 什么是接口 含义 xff1a 接口是指定一组函数成员而不实现它们的引用类型 xff08 只能用类和结构实现接口 xff09 接口可以包含实例方法 属性 事件 索引器或这四种成员类型的任意组合 接口可以包含静态构造函数 xff08 不能创
  • VINS-MONO工程改造

    这篇是接着前文 主流VIO VSLAM系统改造与工程化落地 和 关于VIO零速更新 ZUPT 与控制三种约束的工程实践 的 xff0c 有时候想一出是一出 xff0c 导致写的东西还是太分散了 要做VINS改造首先要熟悉VSLAM和数学基础
  • DM-VIO简析

    今天主要是针对DMVIO DM VIO的简析 xff0c 中文网上有的东西都太少了 xff0c 只能靠看完论文和组员们一起改代码 Lukas组这个东西在中文网被称为有史以来最好的VIO xff0c 但是实际过程中我们还是发现了许多不完美的地
  • Hao to setup windbg on windows10 LTSC img

    Windows host Debugger install windbg https developer microsoft com en us windows downloads windows 10 sdk download the i
  • VINS/VIO的并行化与工程化(GPU篇)

    最近更新的这2篇应该是比较重的了 xff0c 先做GPU篇 xff0c 再做DSP篇 先友情提醒 xff0c 这篇文章很重很费时 xff0c 对各种软硬算的知识要求多多 主体知识来源于UZH和ETH的研究者Balazs Nagy组 xff0
  • 关于机器人状态估计8-VSLAM工程与VIO工程难点

    最近做产设和综述把头都整晕了 xff0c 本来想认真更新GPU那篇DSP的姊妹篇 xff0c 突然觉得太长了实在是没有写的欲望 xff0c 还是写篇杂文算了 一看这个标题就知道 首先如果没有 关于机器人状态估计 4 成长路径与能力提升这块基
  • VIO/VINS/VSLAM问题定位流程与思路

    首先假设读者是了解基础VSLAM xff0c 了解VIO基础 至少要会标定 xff0c 调过几个开源系统的 先说一下双目的VINS FUSION xff0c 大部分问题都是基线造成的问题 xff0c 简单点说就是如果使用较短的基线如5cm
  • VIO/VINS中关于能观性/可观性的详细讲解

    以前大概写过一下 xff0c 太烂了 也是没什么人写 xff0c 再详细讲解一下 整体简洁一点尝试主要用文字说明这个比较关键的点 xff0c 其实整体和多传感器融合也有很大的关联 xff0c 无论是外感还是内感传感器 xff0c 无外乎从运
  • 关于机器人状态估计(10)-VSLAM与VIO的3D建图,重定位与世界观综述

    近期我国迎来了cov海啸 xff0c 其实我也不知道我羊了没有 xff0c 但并没有什么不舒服同时因为我没有测 xff0c 那自然是没有羊 xff0c 或者是薛定谔的羊 近年另外一块工作的综述 xff0c 这篇科普的同时 xff0c 也会包
  • 关于机器人状态估计(11)-VIO单目与双目/雷达Lidar SLAM/未来的机器人

    写这篇文章的时候刚发生行业大事件 xff1a Google收购ROS 其实一开始还是水 xff0c 绝对大量文不对题 xff0c 但是必有干货 xff0c 毕竟用的是这个关键的系列标题 最近有几件行业内发生的大小事 xff0c 让我觉得有必
  • Javaer都在用的Java后端面试笔记, 涵盖90%的主流技术,啃完分分钟拿下大厂offer!!

    到底该如何准备高级开发 架构师级别的面试 xff1f 为了帮助有需要的朋友在金九银十面试 xff0c 最近整理了一份面试知识点笔记复习资料 xff0c 内容包含 xff1a JVM xff0c JAVA多线程并发 xff0c Spring
  • 防火墙---firewalld

    Firewalld概述 支持网络区域所定义的网络链接以及接口安全等级的动态防火墙管理工具支持IPv4 IPv6防火墙设置以及以太网桥支持服务或应用程序直接添加防火墙规则接口拥有两种配置模式 xff1a 运行时配置永久配置 firewalld
  • Linux系统的初次使用

    在linux中安装JDK 1 安装xftp7 从windows上传输一个JDK到Linux中 opt apps下 2 对 opt apps下的JDK压缩包进行解压 tar zxvf jdk 8u191 linux x64 tar gz 3
  • C语言加强篇——(1)学习笔记 之 变量、指针、关键字

    系列文章目录 C语言加强篇 xff08 1 xff09 学习笔记 之 变量 指针 关键字 C语言加强篇 xff08 2 xff09 学习笔记 之 结构体 结构体指针 函数指针 C语言加强篇 xff08 3 xff09 学习笔记 之 链表的增
  • linux/unix系统下IOZONE/iozone磁盘性能测试工具方法

    IOZONE主要用来测试操作系统文件系统性能的测试工具 xff0c 该工具所测试的范围主要有 xff0c write Re write Read Re Read Random Read Random Write Random Mix Bac
  • C语言加强篇——(2)学习笔记 之 结构体、结构体指针、函数指针

    系列文章目录 C语言加强篇 xff08 1 xff09 学习笔记 之 变量 指针 关键字 C语言加强篇 xff08 2 xff09 学习笔记 之 结构体 结构体指针 函数指针 C语言加强篇 xff08 3 xff09 学习笔记 之 链表的增
  • C语言加强篇——(3)学习笔记 之 链表的增、删、改、查

    系列文章目录 C语言加强篇 xff08 1 xff09 学习笔记 之 变量 指针 关键字 C语言加强篇 xff08 2 xff09 学习笔记 之 结构体 结构体指针 函数指针 C语言加强篇 xff08 3 xff09 学习笔记 之 链表的增
  • 面向对象的编程思想写单片机程序——(2)学习笔记 之 怎么抽象出结构体

    系列文章目录 面向对象的编程思想写单片机程序 xff08 1 xff09 学习笔记 之 程序设计 面向对象的编程思想写单片机程序 xff08 2 xff09 学习笔记 之 怎么抽象出结构体 面向对象的编程思想写单片机程序 xff08 3 x
  • 面向对象的编程思想写单片机程序——(1)学习笔记 之 程序设计

    系列文章目录 面向对象的编程思想写单片机程序 xff08 1 xff09 学习笔记 之 程序设计 面向对象的编程思想写单片机程序 xff08 2 xff09 学习笔记 之 怎么抽象出结构体 面向对象的编程思想写单片机程序 xff08 3 x